blk-stat: convert blk-stat bucket callback to signed
authorStephen Bates <sbates@raithlin.com>
Thu, 20 Apr 2017 21:29:16 +0000 (15:29 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 20 Apr 2017 21:29:16 +0000 (15:29 -0600)
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: Stephen Bates <sbates@raithlin.com>
Fixed up Kyber scheduler stat callback.

Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-stat.c
block/blk-stat.h
block/kyber-iosched.c

index e77ec52f5bb51513fc9d7850301ab5bbafe51551..dde9d399f707d094e8bd2cb0f4847b9771532b58 100644 (file)
@@ -19,7 +19,7 @@ struct blk_queue_stats {
        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);
 }
@@ -104,6 +104,8 @@ void blk_stat_add(struct request *rq)
        list_for_each_entry_rcu(cb, &q->stats->callbacks, list) {
                if (blk_stat_is_active(cb)) {
                        bucket = cb->bucket_fn(rq);
+                       if (bucket < 0)
+                               continue;
                        stat = &this_cpu_ptr(cb->cpu_stat)[bucket];
                        __blk_stat_add(stat, value);
                }
@@ -135,7 +137,7 @@ static void blk_stat_timer_fn(unsigned long data)
 
 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)
 {
        struct blk_stat_callback *cb;
index 53f08a63bf152010665b95d23c6b399d9ec5a725..622a62ce6213b12e1def97f3e12f7e175afc69b1 100644 (file)
@@ -48,9 +48,10 @@ struct blk_stat_callback {
 
        /**
         * @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.
@@ -120,7 +121,7 @@ void blk_stat_enable_accounting(struct request_queue *q);
  *
  * 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.
@@ -135,7 +136,7 @@ unsigned int blk_stat_rq_ddir(const struct request *rq);
  */
 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);
 
 /**
index fe4af5b97c0e9e1b9fab145be61b087d40127903..3b0090bc5dd1ba3d594ba8c99c9bc1355b81117d 100644 (file)
@@ -102,7 +102,7 @@ struct kyber_hctx_data {
        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;