From: Sasha Levin Date: Sun, 11 Feb 2024 23:43:17 +0000 (-0500) Subject: Fixes for 6.6 X-Git-Tag: v6.1.78~60 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25cc6bde65f90b7078e968b413f0094ff9e71103;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 6.6 Signed-off-by: Sasha Levin --- diff --git a/queue-6.6/blk-iocost-fix-an-ubsan-shift-out-of-bounds-warning.patch b/queue-6.6/blk-iocost-fix-an-ubsan-shift-out-of-bounds-warning.patch new file mode 100644 index 00000000000..79394936473 --- /dev/null +++ b/queue-6.6/blk-iocost-fix-an-ubsan-shift-out-of-bounds-warning.patch @@ -0,0 +1,72 @@ +From 3a8c1b84a21d24dc2d845fedb9ee6d586ffad105 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Nov 2023 12:25:56 -1000 +Subject: blk-iocost: Fix an UBSAN shift-out-of-bounds warning +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tejun Heo + +[ Upstream commit 2a427b49d02995ea4a6ff93a1432c40fa4d36821 ] + +When iocg_kick_delay() is called from a CPU different than the one which set +the delay, @now may be in the past of @iocg->delay_at leading to the +following warning: + + UBSAN: shift-out-of-bounds in block/blk-iocost.c:1359:23 + shift exponent 18446744073709 is too large for 64-bit type 'u64' (aka 'unsigned long long') + ... + Call Trace: + + dump_stack_lvl+0x79/0xc0 + __ubsan_handle_shift_out_of_bounds+0x2ab/0x300 + iocg_kick_delay+0x222/0x230 + ioc_rqos_merge+0x1d7/0x2c0 + __rq_qos_merge+0x2c/0x80 + bio_attempt_back_merge+0x83/0x190 + blk_attempt_plug_merge+0x101/0x150 + blk_mq_submit_bio+0x2b1/0x720 + submit_bio_noacct_nocheck+0x320/0x3e0 + __swap_writepage+0x2ab/0x9d0 + +The underflow itself doesn't really affect the behavior in any meaningful +way; however, the past timestamp may exaggerate the delay amount calculated +later in the code, which shouldn't be a material problem given the nature of +the delay mechanism. + +If @now is in the past, this CPU is racing another CPU which recently set up +the delay and there's nothing this CPU can contribute w.r.t. the delay. +Let's bail early from iocg_kick_delay() in such cases. + +Reported-by: Breno Leitão +Signed-off-by: Tejun Heo +Fixes: 5160a5a53c0c ("blk-iocost: implement delay adjustment hysteresis") +Link: https://lore.kernel.org/r/ZVvc9L_CYk5LO1fT@slm.duckdns.org +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/blk-iocost.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/block/blk-iocost.c b/block/blk-iocost.c +index 089fcb9cfce3..7ee8d85c2c68 100644 +--- a/block/blk-iocost.c ++++ b/block/blk-iocost.c +@@ -1353,6 +1353,13 @@ static bool iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now) + + lockdep_assert_held(&iocg->waitq.lock); + ++ /* ++ * If the delay is set by another CPU, we may be in the past. No need to ++ * change anything if so. This avoids decay calculation underflow. ++ */ ++ if (time_before64(now->now, iocg->delay_at)) ++ return false; ++ + /* calculate the current delay in effect - 1/2 every second */ + tdelta = now->now - iocg->delay_at; + if (iocg->delay) +-- +2.43.0 + diff --git a/queue-6.6/series b/queue-6.6/series index 46afaee0ef0..d8ff713254e 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -95,3 +95,4 @@ libceph-rename-read_sparse_msg_-to-read_partial_spar.patch libceph-just-wait-for-more-data-to-be-available-on-t.patch riscv-fix-arch_hugetlb_migration_supported-for-napot.patch riscv-declare-overflow_stack-as-exported-from-traps..patch +blk-iocost-fix-an-ubsan-shift-out-of-bounds-warning.patch