截止日期I / O调度程序front_merges方案

时间:2017-11-20 19:20:53

标签: linux kernel scheduler iosched

我正在研究Linux IO Scheduler。 Linux截止日期IO计划程序使用' front_merges'确定请求的属性是前向还是后向合并。但我无法理解它是如何起作用的,因为它设置了“前线”和“前线”。属性只在一个地方,它只设置为1如下。

dd->front_merges = 1;

我想知道Deadline IO Scheduler如何设置' front_merges'别的地方。如果它没有,那么截止时间前合并算法的场景是什么?

谢谢..

2 个答案:

答案 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有机会合并到请求的前面。