Skip to the content.

drivers/md/dm-rq.c

为什么有的注册到这里,有的没有:

static const struct blk_mq_ops dm_mq_ops = {
	.queue_rq = dm_mq_queue_rq,
	.complete = dm_softirq_done,
	.init_request = dm_mq_init_request,
};

[!NOTE] 参考 Deepseeek ,有待验证

request-based vs. bio-based 目标的现状 在Device Mapper的世界里,目标驱动(target drivers)决定了DM设备的具体行为。它们主要分为两类:

现状:即使是 dm-multipath,在现代内核中也已经深度集成了 blk-mq。它现在采用一种混合或自适应的模式。虽然它仍然保留了处理 request 的能力,但其队列管理和提交路径已经很大程度上 mq 化了。 如何尝试创建一个 dm-multipath 设备

在现代内核中,您几乎无法强制创建一个纯粹的、对外呈现为非 mq 队列的 request-based DM设备。

Device Mapper 是一个非常灵活的框架,它本身是 blk-mq 原生的。但是,它需要支持一些历史悠久的“目标驱动”(target drivers)。

  1. 当一个DM目标驱动是基于旧的 request-based 模型编写时,DM核心会为其创建一个适配层。在这个适配层中,虽然外层的DM设备是 mq 的,但传递给这个遗留目标驱动的I/O请求(struct request)所经过的路径,在逻辑上是模拟单队列行为的。

居然是 dm_setup_md_queue 中是可以选择的到底是 bio based 还是 request based ,简单的测试了下,默认是 bio based ,怎么设置为 md 的方式,暂时还没有思考清楚:

#0  dm_setup_md_queue (md=md@entry=0xffff888105f34c00, t=0xffff888108969400) at drivers/md/dm.c:2347
#1  0xffffffff81f3f11a in table_load (filp=<optimized out>, param=0xffff88810e1da000, param_size=<optimized out>) at drivers/md/dm-ioctl.c:1532
#2  0xffffffff81f3d56a in ctl_ioctl (file=0xffff888115da2900, command=<optimized out>, user=0x55db27994310) at drivers/md/dm-ioctl.c:2082
#3  0xffffffff81f3d86e in dm_ctl_ioctl (file=<optimized out>, command=<optimized out>, u=<optimized out>) at drivers/md/dm-ioctl.c:2104
#4  0xffffffff81474d34 in vfs_ioctl (arg=94399750554384, cmd=<optimized out>, filp=0xffff888115da2900) at fs/ioctl.c:51

所以 dm 中存在不少位置是进行 queue_is_mq 判断的,

void dm_start_queue(struct request_queue *q)
{
	blk_mq_unquiesce_queue(q);
	blk_mq_kick_requeue_list(q);
}

其实:

这个东西就是提供给 DM_TYPE_REQUEST_BASED 类型用的,目前 只有 dm-table 和 dm-mpath 在使用。所以,这里提到了 bio-based 和 request-based 的区别:

应该主要是 request 会做更多的工作,例如 上层的多个 bio 被 I/O 调度器(如 mq-deadline、bfq 等)合并、排序,形成 request。 内核将 request 放入设备的请求队列(request queue)。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。