]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
320ae51f JA |
2 | #ifndef INT_BLK_MQ_TAG_H |
3 | #define INT_BLK_MQ_TAG_H | |
4 | ||
24d2f903 CH |
5 | /* |
6 | * Tag address space map. | |
7 | */ | |
8 | struct blk_mq_tags { | |
9 | unsigned int nr_tags; | |
10 | unsigned int nr_reserved_tags; | |
24d2f903 | 11 | |
0d2602ca JA |
12 | atomic_t active_queues; |
13 | ||
222a5ae0 JG |
14 | struct sbitmap_queue *bitmap_tags; |
15 | struct sbitmap_queue *breserved_tags; | |
16 | ||
17 | struct sbitmap_queue __bitmap_tags; | |
18 | struct sbitmap_queue __breserved_tags; | |
24d2f903 CH |
19 | |
20 | struct request **rqs; | |
2af8cbe3 | 21 | struct request **static_rqs; |
24d2f903 | 22 | struct list_head page_list; |
bd63141d ML |
23 | |
24 | /* | |
25 | * used to clear request reference in rqs[] before freeing one | |
26 | * request pool | |
27 | */ | |
28 | spinlock_t lock; | |
24d2f903 CH |
29 | }; |
30 | ||
1c0706a7 JG |
31 | extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags, |
32 | unsigned int reserved_tags, | |
33 | int node, unsigned int flags); | |
34 | extern void blk_mq_free_tags(struct blk_mq_tags *tags, unsigned int flags); | |
56b68085 JG |
35 | extern int blk_mq_init_bitmaps(struct sbitmap_queue *bitmap_tags, |
36 | struct sbitmap_queue *breserved_tags, | |
37 | unsigned int queue_depth, | |
38 | unsigned int reserved, | |
39 | int node, int alloc_policy); | |
320ae51f | 40 | |
56b68085 | 41 | extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set); |
32bc15af | 42 | extern void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set); |
cb96a42c | 43 | extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data); |
cae740a0 JG |
44 | extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx, |
45 | unsigned int tag); | |
70f36b60 JA |
46 | extern int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx, |
47 | struct blk_mq_tags **tags, | |
48 | unsigned int depth, bool can_grow); | |
32bc15af JG |
49 | extern void blk_mq_tag_resize_shared_sbitmap(struct blk_mq_tag_set *set, |
50 | unsigned int size); | |
51 | ||
aed3ea94 | 52 | extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool); |
0bf6cd5b CH |
53 | void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn, |
54 | void *priv); | |
602380d2 ML |
55 | void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn, |
56 | void *priv); | |
320ae51f | 57 | |
88459642 OS |
58 | static inline struct sbq_wait_state *bt_wait_ptr(struct sbitmap_queue *bt, |
59 | struct blk_mq_hw_ctx *hctx) | |
60 | { | |
61 | if (!hctx) | |
62 | return &bt->ws[0]; | |
63 | return sbq_wait_ptr(bt, &hctx->wait_index); | |
64 | } | |
65 | ||
320ae51f | 66 | enum { |
419c3d5e | 67 | BLK_MQ_NO_TAG = -1U, |
5385fa47 | 68 | BLK_MQ_TAG_MIN = 1, |
419c3d5e | 69 | BLK_MQ_TAG_MAX = BLK_MQ_NO_TAG - 1, |
320ae51f JA |
70 | }; |
71 | ||
0d2602ca JA |
72 | extern bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *); |
73 | extern void __blk_mq_tag_idle(struct blk_mq_hw_ctx *); | |
74 | ||
75 | static inline bool blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx) | |
76 | { | |
51db1c37 | 77 | if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED)) |
0d2602ca JA |
78 | return false; |
79 | ||
80 | return __blk_mq_tag_busy(hctx); | |
81 | } | |
82 | ||
83 | static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx) | |
84 | { | |
51db1c37 | 85 | if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED)) |
0d2602ca JA |
86 | return; |
87 | ||
88 | __blk_mq_tag_idle(hctx); | |
89 | } | |
90 | ||
415b806d SG |
91 | static inline bool blk_mq_tag_is_reserved(struct blk_mq_tags *tags, |
92 | unsigned int tag) | |
93 | { | |
94 | return tag < tags->nr_reserved_tags; | |
95 | } | |
96 | ||
320ae51f | 97 | #endif |