aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShaohua Li <shli@kernel.org>2013-10-14 21:05:03 -0400
committerJens Axboe <axboe@kernel.dk>2013-10-25 06:56:00 -0400
commit1dddc01af0d42b21058e0cb9c1ca9e8d5204d9b0 (patch)
treec2812f72384ee2f4e0d90f65844bdd91a370e8c5
parent7fc2ba17e8bf9f218cac10cc2a3de613d9d9086d (diff)
percpu_ida: add an API to return free tags
Add an API to return free tags, blk-mq-tag will use it. Note, this just returns a snapshot of free tags number. blk-mq-tag has two usages of it. One is for info output for diagnosis. The other is to quickly check if there are free tags for request dispatch checking. Neither requires very precise. Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Shaohua Li <shli@fusionio.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--include/linux/percpu_ida.h1
-rw-r--r--lib/percpu_ida.c17
2 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/percpu_ida.h b/include/linux/percpu_ida.h
index 63510ae6f933..1900bd0fa639 100644
--- a/include/linux/percpu_ida.h
+++ b/include/linux/percpu_ida.h
@@ -77,4 +77,5 @@ typedef int (*percpu_ida_cb)(unsigned, void *);
77int percpu_ida_for_each_free(struct percpu_ida *pool, percpu_ida_cb fn, 77int percpu_ida_for_each_free(struct percpu_ida *pool, percpu_ida_cb fn,
78 void *data); 78 void *data);
79 79
80unsigned percpu_ida_free_tags(struct percpu_ida *pool, int cpu);
80#endif /* __PERCPU_IDA_H__ */ 81#endif /* __PERCPU_IDA_H__ */
diff --git a/lib/percpu_ida.c b/lib/percpu_ida.c
index 0f51c1b556cf..b0698ea972c6 100644
--- a/lib/percpu_ida.c
+++ b/lib/percpu_ida.c
@@ -371,3 +371,20 @@ out:
371 return err; 371 return err;
372} 372}
373EXPORT_SYMBOL_GPL(percpu_ida_for_each_free); 373EXPORT_SYMBOL_GPL(percpu_ida_for_each_free);
374
375/**
376 * percpu_ida_free_tags - return free tags number of a specific cpu or global pool
377 * @pool: pool related
378 * @cpu: specific cpu or global pool if @cpu == nr_cpu_ids
379 *
380 * Note: this just returns a snapshot of free tags number.
381 */
382unsigned percpu_ida_free_tags(struct percpu_ida *pool, int cpu)
383{
384 struct percpu_ida_cpu *remote;
385 if (cpu == nr_cpu_ids)
386 return pool->nr_free;
387 remote = per_cpu_ptr(pool->tag_cpu, cpu);
388 return remote->nr_free;
389}
390EXPORT_SYMBOL_GPL(percpu_ida_free_tags);