Commit a37244e4 authored by Stephen Bates's avatar Stephen Bates Committed by Jens Axboe

blk-stat: convert blk-stat bucket callback to signed

In order to allow for filtering of IO based on some other properties
of the request than direction we allow the bucket function to return
an int.

If the bucket callback returns a negative do no count it in the stats
accumulation.
Signed-off-by: default avatarStephen Bates <sbates@raithlin.com>

Fixed up Kyber scheduler stat callback.
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent caf7df12
...@@ -19,7 +19,7 @@ struct blk_queue_stats { ...@@ -19,7 +19,7 @@ struct blk_queue_stats {
bool enable_accounting; bool enable_accounting;
}; };
unsigned int blk_stat_rq_ddir(const struct request *rq) int blk_stat_rq_ddir(const struct request *rq)
{ {
return rq_data_dir(rq); return rq_data_dir(rq);
} }
...@@ -104,6 +104,8 @@ void blk_stat_add(struct request *rq) ...@@ -104,6 +104,8 @@ void blk_stat_add(struct request *rq)
list_for_each_entry_rcu(cb, &q->stats->callbacks, list) { list_for_each_entry_rcu(cb, &q->stats->callbacks, list) {
if (blk_stat_is_active(cb)) { if (blk_stat_is_active(cb)) {
bucket = cb->bucket_fn(rq); bucket = cb->bucket_fn(rq);
if (bucket < 0)
continue;
stat = &this_cpu_ptr(cb->cpu_stat)[bucket]; stat = &this_cpu_ptr(cb->cpu_stat)[bucket];
__blk_stat_add(stat, value); __blk_stat_add(stat, value);
} }
...@@ -135,7 +137,7 @@ static void blk_stat_timer_fn(unsigned long data) ...@@ -135,7 +137,7 @@ static void blk_stat_timer_fn(unsigned long data)
struct blk_stat_callback * struct blk_stat_callback *
blk_stat_alloc_callback(void (*timer_fn)(struct blk_stat_callback *), blk_stat_alloc_callback(void (*timer_fn)(struct blk_stat_callback *),
unsigned int (*bucket_fn)(const struct request *), int (*bucket_fn)(const struct request *),
unsigned int buckets, void *data) unsigned int buckets, void *data)
{ {
struct blk_stat_callback *cb; struct blk_stat_callback *cb;
......
...@@ -48,9 +48,10 @@ struct blk_stat_callback { ...@@ -48,9 +48,10 @@ struct blk_stat_callback {
/** /**
* @bucket_fn: Given a request, returns which statistics bucket it * @bucket_fn: Given a request, returns which statistics bucket it
* should be accounted under. * should be accounted under. Return -1 for no bucket for this
* request.
*/ */
unsigned int (*bucket_fn)(const struct request *); int (*bucket_fn)(const struct request *);
/** /**
* @buckets: Number of statistics buckets. * @buckets: Number of statistics buckets.
...@@ -120,7 +121,7 @@ void blk_stat_enable_accounting(struct request_queue *q); ...@@ -120,7 +121,7 @@ void blk_stat_enable_accounting(struct request_queue *q);
* *
* Return: Data direction of the request, either READ or WRITE. * Return: Data direction of the request, either READ or WRITE.
*/ */
unsigned int blk_stat_rq_ddir(const struct request *rq); int blk_stat_rq_ddir(const struct request *rq);
/** /**
* blk_stat_alloc_callback() - Allocate a block statistics callback. * blk_stat_alloc_callback() - Allocate a block statistics callback.
...@@ -135,7 +136,7 @@ unsigned int blk_stat_rq_ddir(const struct request *rq); ...@@ -135,7 +136,7 @@ unsigned int blk_stat_rq_ddir(const struct request *rq);
*/ */
struct blk_stat_callback * struct blk_stat_callback *
blk_stat_alloc_callback(void (*timer_fn)(struct blk_stat_callback *), blk_stat_alloc_callback(void (*timer_fn)(struct blk_stat_callback *),
unsigned int (*bucket_fn)(const struct request *), int (*bucket_fn)(const struct request *),
unsigned int buckets, void *data); unsigned int buckets, void *data);
/** /**
......
...@@ -102,7 +102,7 @@ struct kyber_hctx_data { ...@@ -102,7 +102,7 @@ struct kyber_hctx_data {
atomic_t wait_index[KYBER_NUM_DOMAINS]; atomic_t wait_index[KYBER_NUM_DOMAINS];
}; };
static unsigned int rq_sched_domain(const struct request *rq) static int rq_sched_domain(const struct request *rq)
{ {
unsigned int op = rq->cmd_flags; unsigned int op = rq->cmd_flags;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment