From: Greg Kroah-Hartman Date: Thu, 5 Jan 2023 11:49:17 +0000 (+0100) Subject: 5.15-stable patches X-Git-Tag: v6.1.4~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc7a276c7197c113ce4f5cd7bf984ddbcc27d131;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: block-mq-deadline-fix-dd_finish_request-for-zoned-devices.patch --- diff --git a/queue-5.15/block-mq-deadline-fix-dd_finish_request-for-zoned-devices.patch b/queue-5.15/block-mq-deadline-fix-dd_finish_request-for-zoned-devices.patch new file mode 100644 index 00000000000..fa7ad14123a --- /dev/null +++ b/queue-5.15/block-mq-deadline-fix-dd_finish_request-for-zoned-devices.patch @@ -0,0 +1,82 @@ +From 2820e5d0820ac4daedff1272616a53d9c7682fd2 Mon Sep 17 00:00:00 2001 +From: Damien Le Moal +Date: Thu, 24 Nov 2022 11:12:07 +0900 +Subject: block: mq-deadline: Fix dd_finish_request() for zoned devices + +From: Damien Le Moal + +commit 2820e5d0820ac4daedff1272616a53d9c7682fd2 upstream. + +dd_finish_request() tests if the per prio fifo_list is not empty to +determine if request dispatching must be restarted for handling blocked +write requests to zoned devices with a call to +blk_mq_sched_mark_restart_hctx(). While simple, this implementation has +2 problems: + +1) Only the priority level of the completed request is considered. + However, writes to a zone may be blocked due to other writes to the + same zone using a different priority level. While this is unlikely to + happen in practice, as writing a zone with different IO priorirites + does not make sense, nothing in the code prevents this from + happening. +2) The use of list_empty() is dangerous as dd_finish_request() does not + take dd->lock and may run concurrently with the insert and dispatch + code. + +Fix these 2 problems by testing the write fifo list of all priority +levels using the new helper dd_has_write_work(), and by testing each +fifo list using list_empty_careful(). + +Fixes: c807ab520fc3 ("block/mq-deadline: Add I/O priority support") +Cc: +Signed-off-by: Damien Le Moal +Reviewed-by: Johannes Thumshirn +Link: https://lore.kernel.org/r/20221124021208.242541-2-damien.lemoal@opensource.wdc.com +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman +--- + block/mq-deadline.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +--- a/block/mq-deadline.c ++++ b/block/mq-deadline.c +@@ -791,6 +791,18 @@ static void dd_prepare_request(struct re + rq->elv.priv[0] = NULL; + } + ++static bool dd_has_write_work(struct blk_mq_hw_ctx *hctx) ++{ ++ struct deadline_data *dd = hctx->queue->elevator->elevator_data; ++ enum dd_prio p; ++ ++ for (p = 0; p <= DD_PRIO_MAX; p++) ++ if (!list_empty_careful(&dd->per_prio[p].fifo_list[DD_WRITE])) ++ return true; ++ ++ return false; ++} ++ + /* + * Callback from inside blk_mq_free_request(). + * +@@ -813,7 +825,6 @@ static void dd_finish_request(struct req + struct deadline_data *dd = q->elevator->elevator_data; + const u8 ioprio_class = dd_rq_ioclass(rq); + const enum dd_prio prio = ioprio_class_to_prio[ioprio_class]; +- struct dd_per_prio *per_prio = &dd->per_prio[prio]; + + /* + * The block layer core may call dd_finish_request() without having +@@ -829,9 +840,10 @@ static void dd_finish_request(struct req + + spin_lock_irqsave(&dd->zone_lock, flags); + blk_req_zone_write_unlock(rq); +- if (!list_empty(&per_prio->fifo_list[DD_WRITE])) +- blk_mq_sched_mark_restart_hctx(rq->mq_hctx); + spin_unlock_irqrestore(&dd->zone_lock, flags); ++ ++ if (dd_has_write_work(rq->mq_hctx)) ++ blk_mq_sched_mark_restart_hctx(rq->mq_hctx); + } + } + diff --git a/queue-5.15/series b/queue-5.15/series index f12f4a2433b..9b47cb47d2f 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -162,3 +162,4 @@ ext4-avoid-unaccounted-block-allocation-when-expanding-inode.patch ext4-allocate-extended-attribute-value-in-vmalloc-area.patch drm-amdgpu-handle-polaris10-11-overlap-asics-v2.patch drm-amdgpu-make-display-pinning-more-flexible-v2.patch +block-mq-deadline-fix-dd_finish_request-for-zoned-devices.patch