Re: bfq: update internal depth state when queue depth changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Resent due to Gmail tricking me into using HTML format. :-(

Am Fr., 18. Jan. 2019 um 18:34 Uhr schrieb Jens Axboe <axboe@xxxxxxxxx>:
>
> A previous commit moved the shallow depth and BFQ depth map calculations
> to be done at init time, moving it outside of the hotter IO path. This
> potentially causes hangs if the users changes the depth of the scheduler
> map, by writing to the 'nr_requests' sysfs file for that device.
>
> Add a blk-mq-sched hook that allows blk-mq to inform the scheduler if
> the depth changes, so that the scheduler can update its internal state.
>
> Reported-by: Paolo Valente <paolo.valente@xxxxxxxxxx>
> Fixes: f0635b8a416e ("bfq: calculate shallow depths at init time")
> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>

Works fine here in 4.18 as far as I could test (running a full backup,
some compilations and Gentoo package upgrades, filling memory with web
browsers to force swapping).

$ grep ^ /sys/block/*/queue/nr_requests
/sys/block/bcache0/queue/nr_requests:128
/sys/block/bcache1/queue/nr_requests:128
/sys/block/bcache2/queue/nr_requests:128
/sys/block/bcache3/queue/nr_requests:128
/sys/block/bcache4/queue/nr_requests:128
/sys/block/sda/queue/nr_requests:256
/sys/block/sdb/queue/nr_requests:256
/sys/block/sdc/queue/nr_requests:256
/sys/block/sdd/queue/nr_requests:256
/sys/block/sde/queue/nr_requests:256
/sys/block/sdf/queue/nr_requests:256

Tested-by: Kai Krakow <kai@xxxxxxxxxxx>

> ---
>
> diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
> index cd307767a134..b09589915667 100644
> --- a/block/bfq-iosched.c
> +++ b/block/bfq-iosched.c
> @@ -5342,7 +5342,7 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,
>         return min_shallow;
>  }
>
> -static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
> +static void bfq_depth_updated(struct blk_mq_hw_ctx *hctx)
>  {
>         struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
>         struct blk_mq_tags *tags = hctx->sched_tags;
> @@ -5350,6 +5350,11 @@ static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
>
>         min_shallow = bfq_update_depths(bfqd, &tags->bitmap_tags);
>         sbitmap_queue_min_shallow_depth(&tags->bitmap_tags, min_shallow);
> +}
> +
> +static int bfq_init_hctx(struct blk_mq_hw_ctx *hctx, unsigned int index)
> +{
> +       bfq_depth_updated(hctx);
>         return 0;
>  }
>
> @@ -5772,6 +5777,7 @@ static struct elevator_type iosched_bfq_mq = {
>                 .requests_merged        = bfq_requests_merged,
>                 .request_merged         = bfq_request_merged,
>                 .has_work               = bfq_has_work,
> +               .depth_updated          = bfq_depth_updated,
>                 .init_hctx              = bfq_init_hctx,
>                 .init_sched             = bfq_init_queue,
>                 .exit_sched             = bfq_exit_queue,
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 3ba37b9e15e9..a047b297ade5 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -3101,6 +3101,8 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
>                 }
>                 if (ret)
>                         break;
> +               if (q->elevator && q->elevator->type->ops.depth_updated)
> +                       q->elevator->type->ops.depth_updated(hctx);
>         }
>
>         if (!ret)
> diff --git a/include/linux/elevator.h b/include/linux/elevator.h
> index 2e9e2763bf47..6e8bc53740f0 100644
> --- a/include/linux/elevator.h
> +++ b/include/linux/elevator.h
> @@ -31,6 +31,7 @@ struct elevator_mq_ops {
>         void (*exit_sched)(struct elevator_queue *);
>         int (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int);
>         void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int);
> +       void (*depth_updated)(struct blk_mq_hw_ctx *);
>
>         bool (*allow_merge)(struct request_queue *, struct request *, struct bio *);
>         bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *);
>
> --
> Jens Axboe
>



[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux