blk-mq-tag.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef INT_BLK_MQ_TAG_H
  3. #define INT_BLK_MQ_TAG_H
  4. /*
  5. * Tag address space map.
  6. */
  7. struct blk_mq_tags {
  8. unsigned int nr_tags;
  9. unsigned int nr_reserved_tags;
  10. atomic_t active_queues;
  11. struct sbitmap_queue *bitmap_tags;
  12. struct sbitmap_queue *breserved_tags;
  13. struct sbitmap_queue __bitmap_tags;
  14. struct sbitmap_queue __breserved_tags;
  15. struct request **rqs;
  16. struct request **static_rqs;
  17. struct list_head page_list;
  18. /*
  19. * used to clear request reference in rqs[] before freeing one
  20. * request pool
  21. */
  22. spinlock_t lock;
  23. ANDROID_OEM_DATA(1);
  24. };
  25. extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags,
  26. unsigned int reserved_tags,
  27. int node, unsigned int flags);
  28. extern void blk_mq_free_tags(struct blk_mq_tags *tags, unsigned int flags);
  29. extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set,
  30. unsigned int flags);
  31. extern void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set);
  32. extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
  33. extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx,
  34. unsigned int tag);
  35. extern int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx,
  36. struct blk_mq_tags **tags,
  37. unsigned int depth, bool can_grow);
  38. extern void blk_mq_tag_resize_shared_sbitmap(struct blk_mq_tag_set *set,
  39. unsigned int size);
  40. extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool);
  41. void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn,
  42. void *priv);
  43. void blk_mq_all_tag_iter(struct blk_mq_tags *tags, busy_tag_iter_fn *fn,
  44. void *priv);
  45. static inline struct sbq_wait_state *bt_wait_ptr(struct sbitmap_queue *bt,
  46. struct blk_mq_hw_ctx *hctx)
  47. {
  48. if (!hctx)
  49. return &bt->ws[0];
  50. return sbq_wait_ptr(bt, &hctx->wait_index);
  51. }
  52. enum {
  53. BLK_MQ_NO_TAG = -1U,
  54. BLK_MQ_TAG_MIN = 1,
  55. BLK_MQ_TAG_MAX = BLK_MQ_NO_TAG - 1,
  56. };
  57. extern bool __blk_mq_tag_busy(struct blk_mq_hw_ctx *);
  58. extern void __blk_mq_tag_idle(struct blk_mq_hw_ctx *);
  59. static inline bool blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx)
  60. {
  61. if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  62. return false;
  63. return __blk_mq_tag_busy(hctx);
  64. }
  65. static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx)
  66. {
  67. if (!(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED))
  68. return;
  69. __blk_mq_tag_idle(hctx);
  70. }
  71. static inline bool blk_mq_tag_is_reserved(struct blk_mq_tags *tags,
  72. unsigned int tag)
  73. {
  74. return tag < tags->nr_reserved_tags;
  75. }
  76. #endif