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
  25extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags,
  26                                        unsigned int reserved_tags,
  27                                        int node, unsigned int flags);
  28extern void blk_mq_free_tags(struct blk_mq_tags *tags, unsigned int flags);
  29
  30extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set,
  31                                      unsigned int flags);
  32extern void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set);
  33
  34extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
  35extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx,
  36                           unsigned int tag);
  37extern int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx,
  38                                        struct blk_mq_tags **tags,
  39                                        unsigned int depth, bool can_grow);
  40extern void blk_mq_tag_resize_shared_sbitmap(struct blk_mq_tag_set *set,
  41                                             unsigned int size);
  42
  43extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool);
  44void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn,
  45                void *priv);
  46void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
  47                void *priv);
  48
  49static inline struct sbq_wait_state *bt_wait_ptr(struct sbitmap_queue *bt,
  50                                                 struct blk_mq_hw_ctx *hctx)
  51{
  52        if (!hctx)
  53                return &bt->ws[0];
  54        return sbq_wait_ptr(bt, &hctx->wait_index);
  55}
  56
  57enum {
  58        BLK_MQ_NO_TAG           = -1U,
  59        BLK_MQ_TAG_MIN          = 1,
  60        BLK_MQ_TAG_MAX          = BLK_MQ_NO_TAG - 1,
  61};
  62
  63extern bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *);
  64extern void __blk_mq_tag_idle(struct blk_mq_hw_ctx *);
  65
  66static inline bool blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx)
  67{
  68        if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  69                return false;
  70
  71        return __blk_mq_tag_busy(hctx);
  72}
  73
  74static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx)
  75{
  76        if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  77                return;
  78
  79        __blk_mq_tag_idle(hctx);
  80}
  81
  82static inline bool blk_mq_tag_is_reserved(struct blk_mq_tags *tags,
  83                                          unsigned int tag)
  84{
  85        return tag < tags->nr_reserved_tags;
  86}
  87
  88#endif
  89