Patch "blk-iocost: Avoid using clamp() on inuse in __propagate_weights()" has been added to the 5.15-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    blk-iocost: Avoid using clamp() on inuse in __propagate_weights()

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     blk-iocost-avoid-using-clamp-on-inuse-in-__propagate.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a9fde545263c38729f017c27da664d9b6a3e03e0
Author: Nathan Chancellor <nathan@xxxxxxxxxx>
Date:   Thu Dec 12 10:13:29 2024 -0700

    blk-iocost: Avoid using clamp() on inuse in __propagate_weights()
    
    [ Upstream commit 57e420c84f9ab55ba4c5e2ae9c5f6c8e1ea834d2 ]
    
    After a recent change to clamp() and its variants [1] that increases the
    coverage of the check that high is greater than low because it can be
    done through inlining, certain build configurations (such as s390
    defconfig) fail to build with clang with:
    
      block/blk-iocost.c:1101:11: error: call to '__compiletime_assert_557' declared with 'error' attribute: clamp() low limit 1 greater than high limit active
       1101 |                 inuse = clamp_t(u32, inuse, 1, active);
            |                         ^
      include/linux/minmax.h:218:36: note: expanded from macro 'clamp_t'
        218 | #define clamp_t(type, val, lo, hi) __careful_clamp(type, val, lo, hi)
            |                                    ^
      include/linux/minmax.h:195:2: note: expanded from macro '__careful_clamp'
        195 |         __clamp_once(type, val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_))
            |         ^
      include/linux/minmax.h:188:2: note: expanded from macro '__clamp_once'
        188 |         BUILD_BUG_ON_MSG(statically_true(ulo > uhi),                            \
            |         ^
    
    __propagate_weights() is called with an active value of zero in
    ioc_check_iocgs(), which results in the high value being less than the
    low value, which is undefined because the value returned depends on the
    order of the comparisons.
    
    The purpose of this expression is to ensure inuse is not more than
    active and at least 1. This could be written more simply with a ternary
    expression that uses min(inuse, active) as the condition so that the
    value of that condition can be used if it is not zero and one if it is.
    Do this conversion to resolve the error and add a comment to deter
    people from turning this back into clamp().
    
    Fixes: 7caa47151ab2 ("blkcg: implement blk-iocost")
    Link: https://lore.kernel.org/r/34d53778977747f19cce2abb287bb3e6@xxxxxxxxxxxxxxxx/ [1]
    Suggested-by: David Laight <david.laight@xxxxxxxxxx>
    Reported-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx>
    Closes: https://lore.kernel.org/llvm/CA+G9fYsD7mw13wredcZn0L-KBA3yeoVSTuxnss-AEWMN3ha0cA@xxxxxxxxxxxxxx/
    Reported-by: kernel test robot <lkp@xxxxxxxxx>
    Closes: https://lore.kernel.org/oe-kbuild-all/202412120322.3GfVe3vF-lkp@xxxxxxxxx/
    Signed-off-by: Nathan Chancellor <nathan@xxxxxxxxxx>
    Acked-by: Tejun Heo <tj@xxxxxxxxxx>
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index 9654d1c2c20f..ba23562abc80 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -1087,7 +1087,14 @@ static void __propagate_weights(struct ioc_gq *iocg, u32 active, u32 inuse,
 		inuse = DIV64_U64_ROUND_UP(active * iocg->child_inuse_sum,
 					   iocg->child_active_sum);
 	} else {
-		inuse = clamp_t(u32, inuse, 1, active);
+		/*
+		 * It may be tempting to turn this into a clamp expression with
+		 * a lower limit of 1 but active may be 0, which cannot be used
+		 * as an upper limit in that situation. This expression allows
+		 * active to clamp inuse unless it is 0, in which case inuse
+		 * becomes 1.
+		 */
+		inuse = min(inuse, active) ?: 1;
 	}
 
 	iocg->last_inuse = iocg->inuse;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux