Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef INT_BLK_MQ_TAG_H 3 : : #define INT_BLK_MQ_TAG_H 4 : : 5 : : #include "blk-mq.h" 6 : : 7 : : /* 8 : : * Tag address space map. 9 : : */ 10 : : struct blk_mq_tags { 11 : : unsigned int nr_tags; 12 : : unsigned int nr_reserved_tags; 13 : : 14 : : atomic_t active_queues; 15 : : 16 : : struct sbitmap_queue bitmap_tags; 17 : : struct sbitmap_queue breserved_tags; 18 : : 19 : : struct request **rqs; 20 : : struct request **static_rqs; 21 : : struct list_head page_list; 22 : : }; 23 : : 24 : : 25 : : extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags, unsigned int reserved_tags, int node, int alloc_policy); 26 : : extern void blk_mq_free_tags(struct blk_mq_tags *tags); 27 : : 28 : : extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data); 29 : : extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx, 30 : : unsigned int tag); 31 : : extern int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx, 32 : : struct blk_mq_tags **tags, 33 : : unsigned int depth, bool can_grow); 34 : : extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool); 35 : : void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn, 36 : : void *priv); 37 : : 38 : 192 : static inline struct sbq_wait_state *bt_wait_ptr(struct sbitmap_queue *bt, 39 : : struct blk_mq_hw_ctx *hctx) 40 : : { 41 [ - + ]: 192 : if (!hctx) 42 : 0 : return &bt->ws[0]; 43 : 192 : return sbq_wait_ptr(bt, &hctx->wait_index); 44 : : } 45 : : 46 : : enum { 47 : : BLK_MQ_TAG_FAIL = -1U, 48 : : BLK_MQ_TAG_MIN = 1, 49 : : BLK_MQ_TAG_MAX = BLK_MQ_TAG_FAIL - 1, 50 : : }; 51 : : 52 : : extern bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *); 53 : : extern void __blk_mq_tag_idle(struct blk_mq_hw_ctx *); 54 : : 55 : 3590 : static inline bool blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx) 56 : : { 57 [ + + + + ]: 3590 : if (!(hctx->flags & BLK_MQ_F_TAG_SHARED)) 58 : : return false; 59 : : 60 : 3437 : return __blk_mq_tag_busy(hctx); 61 : : } 62 : : 63 : 29 : static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx) 64 : : { 65 [ - - - + ]: 29 : if (!(hctx->flags & BLK_MQ_F_TAG_SHARED)) 66 : : return; 67 : : 68 : 0 : __blk_mq_tag_idle(hctx); 69 : : } 70 : : 71 : : /* 72 : : * This helper should only be used for flush request to share tag 73 : : * with the request cloned from, and both the two requests can't be 74 : : * in flight at the same time. The caller has to make sure the tag 75 : : * can't be freed. 76 : : */ 77 : 0 : static inline void blk_mq_tag_set_rq(struct blk_mq_hw_ctx *hctx, 78 : : unsigned int tag, struct request *rq) 79 : : { 80 : 0 : hctx->tags->rqs[tag] = rq; 81 : 0 : } 82 : : 83 : 10012 : static inline bool blk_mq_tag_is_reserved(struct blk_mq_tags *tags, 84 : : unsigned int tag) 85 : : { 86 [ + + ]: 10012 : return tag < tags->nr_reserved_tags; 87 : : } 88 : : 89 : : #endif