block/blk-mq.h
Source file repositories/reference/linux-study-clean/block/blk-mq.h
File Facts
- System
- Linux kernel
- Corpus path
block/blk-mq.h- Extension
.h- Size
- 13003 bytes
- Lines
- 466
- Domain
- Representative Device Path
- Bucket
- PCIe NVMe Storage Path
- Inferred role
- Representative Device Path: implementation source
- Status
- source implementation candidate
Why This File Exists
Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/blk-mq.hblk-stat.h
Detected Declarations
struct blk_mq_tag_setstruct elevator_tagsstruct blk_mq_ctxsstruct blk_mq_ctxstruct blk_mq_alloc_datafunction blk_mq_map_queue_typefunction blk_mq_get_hctx_typefunction blk_mq_map_queuefunction blk_mq_default_nr_requestsfunction blk_mq_tag_busyfunction blk_mq_tag_idlefunction blk_mq_tag_is_reservedfunction blk_mq_is_shared_tagsfunction blk_mq_hctx_stoppedfunction blk_mq_hw_queue_mappedfunction blk_mq_put_dispatch_budgetfunction blk_mq_get_dispatch_budgetfunction blk_mq_set_rq_budget_tokenfunction blk_mq_get_rq_budget_tokenfunction __blk_mq_add_active_requestsfunction __blk_mq_inc_active_requestsfunction __blk_mq_sub_active_requestsfunction __blk_mq_dec_active_requestsfunction blk_mq_add_active_requestsfunction blk_mq_inc_active_requestsfunction blk_mq_sub_active_requestsfunction blk_mq_dec_active_requestsfunction __blk_mq_active_requestsfunction __blk_mq_put_driver_tagfunction blk_mq_put_driver_tagfunction blk_mq_get_driver_tagfunction blk_mq_clear_mq_mapfunction blk_mq_free_requestsfunction hctx_may_queuefunction blk_mq_can_poll
Annotated Snippet
void blk_mq_submit_bio(struct bio *bio);
int blk_mq_poll(struct request_queue *q, blk_qc_t cookie, struct io_comp_batch *iob,
unsigned int flags);
void blk_mq_exit_queue(struct request_queue *q);
struct elevator_tags *blk_mq_update_nr_requests(struct request_queue *q,
struct elevator_tags *tags,
unsigned int nr);
void blk_mq_wake_waiters(struct request_queue *q);
bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *,
bool);
void blk_mq_flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list);
struct request *blk_mq_dequeue_from_ctx(struct blk_mq_hw_ctx *hctx,
struct blk_mq_ctx *start);
void blk_mq_put_rq_ref(struct request *rq);
/*
* Internal helpers for allocating/freeing the request map
*/
void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
unsigned int hctx_idx);
void blk_mq_free_rq_map(struct blk_mq_tag_set *set, struct blk_mq_tags *tags);
struct blk_mq_tags *blk_mq_alloc_map_and_rqs(struct blk_mq_tag_set *set,
unsigned int hctx_idx, unsigned int depth);
void blk_mq_free_map_and_rqs(struct blk_mq_tag_set *set,
struct blk_mq_tags *tags,
unsigned int hctx_idx);
/*
* CPU -> queue mappings
*/
extern int blk_mq_hw_queue_to_node(struct blk_mq_queue_map *qmap, unsigned int);
/*
* blk_mq_map_queue_type() - map (hctx_type,cpu) to hardware queue
* @q: request queue
* @type: the hctx type index
* @cpu: CPU
*/
static inline struct blk_mq_hw_ctx *blk_mq_map_queue_type(struct request_queue *q,
enum hctx_type type,
unsigned int cpu)
{
return queue_hctx((q), (q->tag_set->map[type].mq_map[cpu]));
}
static inline enum hctx_type blk_mq_get_hctx_type(blk_opf_t opf)
{
enum hctx_type type = HCTX_TYPE_DEFAULT;
/*
* The caller ensure that if REQ_POLLED, poll must be enabled.
*/
if (opf & REQ_POLLED)
type = HCTX_TYPE_POLL;
else if ((opf & REQ_OP_MASK) == REQ_OP_READ)
type = HCTX_TYPE_READ;
return type;
}
/*
* blk_mq_map_queue() - map (cmd_flags,type) to hardware queue
* @opf: operation type (REQ_OP_*) and flags (e.g. REQ_POLLED).
* @ctx: software queue cpu ctx
*/
static inline struct blk_mq_hw_ctx *blk_mq_map_queue(blk_opf_t opf,
struct blk_mq_ctx *ctx)
{
return ctx->hctxs[blk_mq_get_hctx_type(opf)];
}
/*
* Default to double of smaller one between hw queue_depth and
* 128, since we don't split into sync/async like the old code
* did. Additionally, this is a per-hw queue depth.
*/
static inline unsigned int blk_mq_default_nr_requests(
struct blk_mq_tag_set *set)
{
return 2 * min_t(unsigned int, set->queue_depth, BLKDEV_DEFAULT_RQ);
}
/*
* sysfs helpers
*/
extern void blk_mq_sysfs_init(struct request_queue *q);
extern void blk_mq_sysfs_deinit(struct request_queue *q);
int blk_mq_sysfs_register(struct gendisk *disk);
void blk_mq_sysfs_unregister(struct gendisk *disk);
int blk_mq_sysfs_register_hctxs(struct request_queue *q);
void blk_mq_sysfs_unregister_hctxs(struct request_queue *q);
Annotation
- Immediate include surface: `linux/blk-mq.h`, `blk-stat.h`.
- Detected declarations: `struct blk_mq_tag_set`, `struct elevator_tags`, `struct blk_mq_ctxs`, `struct blk_mq_ctx`, `struct blk_mq_alloc_data`, `function blk_mq_map_queue_type`, `function blk_mq_get_hctx_type`, `function blk_mq_map_queue`, `function blk_mq_default_nr_requests`, `function blk_mq_tag_busy`.
- Atlas domain: Representative Device Path / PCIe NVMe Storage Path.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.