> Il giorno 17 dic 2016, alle ore 01:12, Jens Axboe <axboe@xxxxxx> ha scritto: > > This adds a set of hooks that intercepts the blk-mq path of > allocating/inserting/issuing/completing requests, allowing > us to develop a scheduler within that framework. > > We reuse the existing elevator scheduler API on the registration > side, but augment that with the scheduler flagging support for > the blk-mq interfce, and with a separate set of ops hooks for MQ > devices. > > Schedulers can opt in to using shadow requests. Shadow requests > are internal requests that the scheduler uses for for the allocate > and insert part, which are then mapped to a real driver request > at dispatch time. This is needed to separate the device queue depth > from the pool of requests that the scheduler has to work with. > > Signed-off-by: Jens Axboe <axboe@xxxxxx> > ... > diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c > new file mode 100644 > index 000000000000..b7e1839d4785 > --- /dev/null > +++ b/block/blk-mq-sched.c > ... > +static inline bool > +blk_mq_sched_allow_merge(struct request_queue *q, struct request *rq, > + struct bio *bio) > +{ > + struct elevator_queue *e = q->elevator; > + > + if (e && e->type->ops.mq.allow_merge) > + return e->type->ops.mq.allow_merge(q, rq, bio); > + > + return true; > +} > + Something does not seem to add up here: e->type->ops.mq.allow_merge may be called only in blk_mq_sched_allow_merge, which, in its turn, may be called only in blk_mq_attempt_merge, which, finally, may be called only in blk_mq_merge_queue_io. Yet the latter may be called only if there is no elevator (line 1399 and 1507 in blk-mq.c). Therefore, e->type->ops.mq.allow_merge can never be called, both if there is and if there is not an elevator. Be patient if I'm missing something huge, but I thought it was worth reporting this. Paolo -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html