Message ID | 20180926073037.29563-1-damien.lemoal@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] block: fix deadline elevator drain for zoned block devices | expand |
On 9/26/18 1:30 AM, Damien Le Moal wrote: > When the deadline scheduler is used with a zoned block device, writes > to a zone will be dispatched one at a time. This causes the warning > message: > > deadline: forced dispatching is broken (nr_sorted=X), please report this > > to be displayed when switching to another elevator with the legacy I/O > path while write requests to a zone are being retained in the scheduler > queue. > > Prevent this message from being displayed when executing > elv_drain_elevator() for a zoned block device. __blk_drain_queue() will > loop until all writes are dispatched and completed, resulting in the > desired elevator queue drain without extensive modifications to the > deadline code itself to handle forced-dispatch calls. Applied for 4.19, thanks Damien.
On Wed, 2018-09-26 at 16:30 +0900, Damien Le Moal wrote: > diff --git a/block/elevator.c b/block/elevator.c > index 6a06b5d040e5..8cd81fd6339a 100644 > --- a/block/elevator.c > +++ b/block/elevator.c > @@ -609,7 +609,7 @@ void elv_drain_elevator(struct request_queue *q) > > while (e->type->ops.sq.elevator_dispatch_fn(q, 1)) > ; > - if (q->nr_sorted && printed++ < 10) { > + if (q->nr_sorted && printed++ < 10 && !blk_queue_is_zoned(q)) { > printk(KERN_ERR "%s: forced dispatching is broken " > "(nr_sorted=%u), please report this\n", > q->elevator->type->elevator_name, q->nr_sorted); It seems wrong to me to perform the blk_queue_is_zoned() check after having incremented the "printed" variable. Shouldn't that check be performed before incrementing the "printed" variable to avoid that "printed" gets incremented if we know that we are not going to report the error message? Thanks, Bart.
diff --git a/block/elevator.c b/block/elevator.c index 6a06b5d040e5..8cd81fd6339a 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -609,7 +609,7 @@ void elv_drain_elevator(struct request_queue *q) while (e->type->ops.sq.elevator_dispatch_fn(q, 1)) ; - if (q->nr_sorted && printed++ < 10) { + if (q->nr_sorted && printed++ < 10 && !blk_queue_is_zoned(q)) { printk(KERN_ERR "%s: forced dispatching is broken " "(nr_sorted=%u), please report this\n", q->elevator->type->elevator_name, q->nr_sorted);