diff options
author | Jens Axboe <axboe@fb.com> | 2014-05-13 23:10:52 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-05-13 23:10:52 +0200 |
commit | 0d2602ca30e410e84e8bdf05c84ed5688e0a5a44 (patch) | |
tree | a456339b9271a400a63aa6defddc85d3eebb95f8 /block/blk.h | |
parent | blk-mq: bitmap tag: cleanup blk_mq_init_tags (diff) | |
download | linux-0d2602ca30e410e84e8bdf05c84ed5688e0a5a44.tar.xz linux-0d2602ca30e410e84e8bdf05c84ed5688e0a5a44.zip |
blk-mq: improve support for shared tags maps
This adds support for active queue tracking, meaning that the
blk-mq tagging maintains a count of active users of a tag set.
This allows us to maintain a notion of fairness between users,
so that we can distribute the tag depth evenly without starving
some users while allowing others to try unfair deep queues.
If sharing of a tag set is detected, each hardware queue will
track the depth of its own queue. And if this exceeds the total
depth divided by the number of active queues, the user is actively
throttled down.
The active queue count is done lazily to avoid bouncing that data
between submitter and completer. Each hardware queue gets marked
active when it allocates its first tag, and gets marked inactive
when 1) the last tag is cleared, and 2) the queue timeout grace
period has passed.
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk.h')
-rw-r--r-- | block/blk.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/block/blk.h b/block/blk.h index 79be2cbce7fd..95cab70000e3 100644 --- a/block/blk.h +++ b/block/blk.h @@ -9,6 +9,9 @@ /* Number of requests a "batching" process may submit */ #define BLK_BATCH_REQ 32 +/* Max future timer expiry for timeouts */ +#define BLK_MAX_TIMEOUT (5 * HZ) + extern struct kmem_cache *blk_requestq_cachep; extern struct kmem_cache *request_cachep; extern struct kobj_type blk_queue_ktype; @@ -37,6 +40,7 @@ bool __blk_end_bidi_request(struct request *rq, int error, void blk_rq_timed_out_timer(unsigned long data); void blk_rq_check_expired(struct request *rq, unsigned long *next_timeout, unsigned int *next_set); +unsigned long blk_rq_timeout(unsigned long timeout); void blk_add_timer(struct request *req); void blk_delete_timer(struct request *); |