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 >