linux/block/blk-mq-tag.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef INT_BLK_MQ_TAG_H
   3#define INT_BLK_MQ_TAG_H
   4
   5/*
   6 * Tag address space map.
   7 */
   8struct blk_mq_tags {
   9        unsigned int nr_tags;
  10        unsigned int nr_reserved_tags;
  11
  12        atomic_t active_queues;
  13
  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;
  19
  20        struct request **rqs;
  21        struct request **static_rqs;
  22        struct list_head page_list;
  23
  24        /*
  25         * used to clear request reference in rqs[] before freeing one
  26         * request pool
  27         */
  28        spinlock_t lock;
  29};
  30
  31extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags,
  32                                        unsigned int reserved_tags,
  33                                        int node, unsigned int flags);
  34extern void blk_mq_free_tags(struct blk_mq_tags *tags, unsigned int flags);
  35extern 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);
  40
  41extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set);
  42extern void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set);
  43extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
  44extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx,
  45                           unsigned int tag);
  46extern 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);
  49extern void blk_mq_tag_resize_shared_sbitmap(struct blk_mq_tag_set *set,
  50                                             unsigned int size);
  51
  52extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool);
  53void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn,
  54                void *priv);
  55void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
  56                void *priv);
  57
  58static 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
  66enum {
  67        BLK_MQ_NO_TAG           = -1U,
  68        BLK_MQ_TAG_MIN          = 1,
  69        BLK_MQ_TAG_MAX          = BLK_MQ_NO_TAG - 1,
  70};
  71
  72extern bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *);
  73extern void __blk_mq_tag_idle(struct blk_mq_hw_ctx *);
  74
  75static inline bool blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx)
  76{
  77        if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  78                return false;
  79
  80        return __blk_mq_tag_busy(hctx);
  81}
  82
  83static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx)
  84{
  85        if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  86                return;
  87
  88        __blk_mq_tag_idle(hctx);
  89}
  90
  91static 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
  97#endif
  98