/**
*struct blk_mq_ops-实现块驱动程序的回调函数
*行为。
*/
结构blk_mq_ops{
/**
*@queue_rq:对来自块IO的新请求进行排队。
*/
blk_status_t(*queue_rq)(struct blk_mq_hw_ctx*,const struct blk_mq_queue_data*);
/**
如果驱动程序使用bd->last判断何时向硬件提交请求,则必须定义此函数。如果出现错误,使我们停止发出进一步的请求,这个钩子将用于踢击硬件(否则最后一个请求将执行此操作)
*/
void(*commit_rqs)(结构blk_mq_hw_ctx*);
/**
将新请求的列表排入队列。驱动程序保证每个请求都属于同一队列。如果驱动程序没有完全清空@rqlist,那么其余的将在返回时由块层单独排队。
*/
void(*queue_rqs)(结构请求**rqlist);
/**
在队列请求之前预留预算,一旦.queue_rq运行,驾驶员就有责任释放预留预算。此外,我们还必须处理.get_budget的失败情况,以避免I/O死锁。
*/
int(*get_budget)(结构请求队列*);
/**
*@put_budget:释放预留预算。
*/
void(*put_budget)(结构request_queue*,int);
/**
*@set_rq_budget_token:存储rq的预算令牌
*/
void(*set_rq_budget_token)(结构请求*,int);
/**
*@get_rq_budget_token:检索rq的预算令牌
*/
int(*get_rq_budget_token)(结构请求*);
/**
*@timeout:请求超时时调用。
*/
enum blk_eh_timer_return(*超时)(结构请求*,bool);
/**
*@poll:调用以轮询特定标记的完成情况。
*/
int(*轮询)(结构blk_mq_hw_ctx*,结构io_comp_batch*);
/**
*@complete:将请求标记为已完成。
*/
void(*complete)(结构请求*);
/**
*@init_hctx:当设置了硬件队列的块层侧时调用,允许驱动程序分配或初始化匹配结构。
*/
int(*init_hctx)(结构blk_mq_hw_ctx*,void*,无符号int);
/**
*@exit_hctx:退出/拆卸(exit/teardown)同上。
*/
void(*exit_hctx)(结构blk_mq_hw_ctx*,无符号int);
/**
*@init_request:为块层分配的每个命令调用
*以允许驱动设置驱动专用数据。
*
*大于或等于queue_depth的标记用于设置
*刷新请求。
*/
int(*init_request)(struct blk_mq_tag_set*set,struct request*,
无符号int、无符号int);
/**
*@exit_request:退出/拆卸同上。
*/
void(*exit_request)(struct blk_mq_tag_set*set,struct request*,
无符号int);
/**
*@cleanup_rq:在释放一个未完成的请求之前调用
*并且通常用于释放驱动程序私有数据。
*/
void(*cleanup_rq)(结构请求*);
/**
*@busy:如果设置,则返回此队列当前是否繁忙。
*/
bool(*忙)(结构request_queue*);
/**
*@map_queues:这允许驱动程序通过
*重写构建mqmap的设置时间函数。
*/
int(*map_queues)(结构blk_mq_tag_set*set);
#ifdef CONFIG_BLK_DEBUG_FS
/**
*@show_rq:由debugfs实现用于显示特定于驱动程序
*有关请求的信息。
*/
void(*show_rq)(结构seq_file*m,结构请求*rq);
#endif
};
struct blk_mq_ops
最新推荐文章于 2024-04-22 23:18:29 发布