我正在研究Linux IO Scheduler。 Linux截止日期IO计划程序使用' front_merges'确定请求的属性是前向还是后向合并。但我无法理解它是如何起作用的,因为它设置了“前线”和“前线”。属性只在一个地方,它只设置为1如下。
dd->front_merges = 1;
我想知道Deadline IO Scheduler如何设置' front_merges'别的地方。如果它没有,那么截止时间前合并算法的场景是什么?
谢谢..
答案 0 :(得分:0)
截止日期安排程序将front_merges
声明为 DD_ATTR :
static struct elv_fs_entry ort_deadline_attrs[] = {
DD_ATTR(read_expire),
DD_ATTR(write_expire),
DD_ATTR(writes_starved),
DD_ATTR(front_merges),
__ATTR_NULL
}
它使用STORE_FUNCTION
宏来更改用户空间。您可以在 / sys / block / sda / queue / iosched 等目录下找到它们:
$ ls /sys/block/sda/queue/iosched
=> fifo_batch front_merges read_expire write_expire writes_starved
答案 1 :(得分:0)
首先,截止日期并没有使用' front_merges'决定请求的属性是前向还是后向合并,它只关于Deadline是否可以进行前合并。如果它被设置为0,截止日期只允许返回合并。
截止时间前合并的场景是,当bio进入阻止层时,它将调用elev_merge_fn接口尝试合并到已经在电梯队列中撒谎的请求中,如果设备&#39,则elev_merge_fn被实例化为deadline_merge ; s调度程序被指定为截止日期,见到
static int
deadline_merge(struct request_queue *q, struct request **req, struct
bio *bio)
{
struct deadline_data *dd = q->elevator->elevator_data;
struct request *__rq;
int ret;
/*
* check for front merge
*/
if (dd->front_merges) {
sector_t sector = bio_end_sector(bio);
__rq = elv_rb_find(&dd->sort_list[bio_data_dir(bio)], sector);
if (__rq) {
BUG_ON(sector != blk_rq_pos(__rq));
if (elv_rq_merge_ok(__rq, bio)) {
ret = ELEVATOR_FRONT_MERGE;
goto out;
}
}
}
return ELEVATOR_NO_MERGE;
out:
*req = __rq;
return ret;
}
函数的调用堆栈可以是: submit_bio - > generic_make_request - > blk_queue_bio - > elv_merge - > elevator_merge_fn(deadline_merge)。强> 因此,如果您启用了front_merges,则bio有机会合并到请求的前面。