diff mbox series

[v2] block: fix deadline elevator drain for zoned block devices

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

Commit Message

Damien Le Moal Sept. 26, 2018, 7:30 a.m. UTC
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.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
---

Changes from v1:
* Fixed typo in commit message

 block/elevator.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jens Axboe Sept. 26, 2018, 2:30 p.m. UTC | #1
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.
Bart Van Assche Sept. 26, 2018, 3:38 p.m. UTC | #2
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 mbox series

Patch

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);