blk-mq: implement new and more efficient tagging scheme
[linux-block.git] / block / blk-mq-tag.h
CommitLineData
320ae51f
JA
1#ifndef INT_BLK_MQ_TAG_H
2#define INT_BLK_MQ_TAG_H
3
4bb659b1
JA
4enum {
5 BT_WAIT_QUEUES = 8,
6 BT_WAIT_BATCH = 8,
7};
8
9struct bt_wait_state {
10 atomic_t wait_cnt;
11 wait_queue_head_t wait;
12} ____cacheline_aligned_in_smp;
13
14#define TAG_TO_INDEX(tag) ((tag) / BITS_PER_LONG)
15#define TAG_TO_BIT(tag) ((tag) & (BITS_PER_LONG - 1))
16
17struct blk_mq_bitmap {
18 unsigned long word;
19 unsigned long depth;
20} ____cacheline_aligned_in_smp;
21
22struct blk_mq_bitmap_tags {
23 unsigned int depth;
24 unsigned int wake_cnt;
25
26 struct blk_mq_bitmap *map;
27 unsigned int map_nr;
28
29 unsigned int wake_index;
30 struct bt_wait_state *bs;
31};
24d2f903
CH
32
33/*
34 * Tag address space map.
35 */
36struct blk_mq_tags {
37 unsigned int nr_tags;
38 unsigned int nr_reserved_tags;
24d2f903 39
4bb659b1
JA
40 struct blk_mq_bitmap_tags bitmap_tags;
41 struct blk_mq_bitmap_tags breserved_tags;
24d2f903
CH
42
43 struct request **rqs;
44 struct list_head page_list;
45};
46
320ae51f
JA
47
48extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags, unsigned int reserved_tags, int node);
49extern void blk_mq_free_tags(struct blk_mq_tags *tags);
50
4bb659b1
JA
51extern unsigned int blk_mq_get_tag(struct blk_mq_tags *tags, struct blk_mq_hw_ctx *hctx, unsigned int *last_tag, gfp_t gfp, bool reserved);
52extern void blk_mq_wait_for_tags(struct blk_mq_tags *tags, struct blk_mq_hw_ctx *hctx, bool reserved);
53extern void blk_mq_put_tag(struct blk_mq_tags *tags, unsigned int tag, unsigned int *last_tag);
320ae51f
JA
54extern void blk_mq_tag_busy_iter(struct blk_mq_tags *tags, void (*fn)(void *data, unsigned long *), void *data);
55extern bool blk_mq_has_free_tags(struct blk_mq_tags *tags);
56extern ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page);
4bb659b1 57extern void blk_mq_tag_init_last_tag(struct blk_mq_tags *tags, unsigned int *last_tag);
320ae51f
JA
58
59enum {
60 BLK_MQ_TAG_CACHE_MIN = 1,
61 BLK_MQ_TAG_CACHE_MAX = 64,
62};
63
64enum {
65 BLK_MQ_TAG_FAIL = -1U,
66 BLK_MQ_TAG_MIN = BLK_MQ_TAG_CACHE_MIN,
67 BLK_MQ_TAG_MAX = BLK_MQ_TAG_FAIL - 1,
68};
69
70#endif