if (name) {//如果指定了name,则寻找与name匹配的调度器 e = elevator_get(name); if (!e) return -EINVAL; }
//如果没有指定io调度器,并且chosen_elevator存在,则寻找其指定的调度器 if (!e && *chosen_elevator) { e = elevator_get(chosen_elevator); if (!e) printk(KERN_ERR "I/O scheduler %s not found
", chosen_elevator); }
//依然没获取到调度器的话则使用默认配置的调度器 if (!e) { e = elevator_get(CONFIG_DEFAULT_IOSCHED); if (!e) {//获取失败则使用最简单的noop调度器 printk(KERN_ERR "Default I/O scheduler not found. " "Using noop.
"); e = elevator_get("noop"); } }
//分配并初始化elevator_queue eq = elevator_alloc(q, e); if (!eq) return -ENOMEM;
//调用ops中的elevator_init_fn函数,针对调度器的队列进行初始化 data = elevator_init_queue(q, eq); if (!data) { kobject_put(&eq->kobj); return -ENOMEM; }