linux kernel 代码相关
代码版本:linux-4.9.327
(最老的一个 long term 版)
多年来第一次鼓起勇气开 linux 源码
感觉也没有那么吓人(?)
不得不感慨 open source 以及 free software 真的是好文明
代码版本:linux-4.9.327
(最老的一个 long term 版)
多年来第一次鼓起勇气开 linux 源码
感觉也没有那么吓人(?)
不得不感慨 open source 以及 free software 真的是好文明
论文: Linux Block IO: Introducing Multi-queue SSD Access on
Multi-core Systems
IO 块设备的吞吐发展迅速,2012 年 SSD 4K 随机读写速度达到 785K IOPS (是不是有点高?)
SSD 随机读写速度与顺序读写持平 (不太清楚)
统一接口
两层队列
软件队列:每个 NUMA 上 或者每个核上 一个队列
硬件队列:每个块设备上 若干队列
tag : 指示 block IO 在 driver 提交队列中的位置,在 IO 完成时指示位置
hctx : hardware context
每个 request_queue 包含若干 request,包含一个 percpu 的 blk_mq_ctx (queue_ctx) ,包含若干 blk_mq_hw_ctx
每个 request 有一个 blk_mq_ctx
每个 blk_mq_hw_ctx 中包含若干 blk_mq_ctx
目前维护了 hardcoding 的 per-cpu 软件队列
使用 sbitmap 维护 pending work
struct blk_mq_hw_ctx { // include/linux/blk-mq.h
struct {
spinlock_t lock;
struct list_head dispatch;
unsigned long state; /* BLK_MQ_S_* flags */
}
struct blk_mq_ctx **ctxs;
struct blk_mq_tags *tags; // bitmap tag
}
struct blk_mq_ctx { // block/blk-mq.h
unsigned int cpu; // ctx 对应的 cpu ?
}
struct blk_mq_tags { // block/blk-mq-tag.h
struct request **rqs; // rqs[tag] 为下标 tag 对应的 request
}
struct request_queue { //include/linux/blkdev.h
struct percpu_ref q_usage_counter;
struct blk_mq_ctx __percpu *queue_ctx; // per cpu 的本队列 context
struct blk_mq_hw_ctx **queue_hw_ctx; // 所有 hardware dispatch queue context ?
unsigned int *mq_map; // 每个 cpu 对应的 hw_ctx 编号 ?
}
struct request { //include/linux/blkdev.h
struct request_queue *q;
}