[PATCH] x86/resctrl: Avoid overflow in MB settings in bw_validate()

Martin Kletzander posted 1 patch 2 months, 2 weeks ago
There is a newer version of this series
arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
[PATCH] x86/resctrl: Avoid overflow in MB settings in bw_validate()
Posted by Martin Kletzander 2 months, 2 weeks ago
When resctrl is mounted with the "mba_MBps" option the default (maximum)
bandwidth is the maximum unsigned value for the type.  However when
using the same value that already exists in the schemata file it is then
rounded up to the bandwidth granularity and overflows to a small number
instead, making it difficult to reset memory bandwidth allocation value
back to its default.

Since the granularity and minimum bandwidth are not used when the
software controller is used (resctrl is mounted with the "mba_MBps"),
skip the rounding up as well and return early from bw_validate().

Signed-off-by: Martin Kletzander <nert.pinx@gmail.com>
---
 arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
index 50fa1fe9a073..7e6014176a29 100644
--- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
+++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
@@ -48,8 +48,11 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r)
 		return false;
 	}
 
-	if ((bw < r->membw.min_bw || bw > r->default_ctrl) &&
-	    !is_mba_sc(r)) {
+	/* Nothing else to do if software controller is enabled */
+	if (is_mba_sc(r))
+		return true;
+
+	if (bw < r->membw.min_bw || bw > r->default_ctrl) {
 		rdt_last_cmd_printf("MB value %ld out of range [%d,%d]\n", bw,
 				    r->membw.min_bw, r->default_ctrl);
 		return false;
-- 
2.46.0
Re: [PATCH] x86/resctrl: Avoid overflow in MB settings in bw_validate()
Posted by Martin Kletzander 2 months, 2 weeks ago
On Mon, Sep 16, 2024 at 12:37:13PM +0200, Martin Kletzander wrote:
>When resctrl is mounted with the "mba_MBps" option the default (maximum)
>bandwidth is the maximum unsigned value for the type.  However when
>using the same value that already exists in the schemata file it is then
>rounded up to the bandwidth granularity and overflows to a small number
>instead, making it difficult to reset memory bandwidth allocation value
>back to its default.
>
>Since the granularity and minimum bandwidth are not used when the
>software controller is used (resctrl is mounted with the "mba_MBps"),
>skip the rounding up as well and return early from bw_validate().
>
>Signed-off-by: Martin Kletzander <nert.pinx@gmail.com>
>---
> arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
>diff --git a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
>index 50fa1fe9a073..7e6014176a29 100644
>--- a/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
>+++ b/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
>@@ -48,8 +48,11 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r)
> 		return false;
> 	}
>
>-	if ((bw < r->membw.min_bw || bw > r->default_ctrl) &&
>-	    !is_mba_sc(r)) {
>+	/* Nothing else to do if software controller is enabled */
>+	if (is_mba_sc(r))
>+		return true;

I'm so sorry, I sent an incomplete patch.  This still needs to modify
the *data argument.  I'll send a v2 shortly.

>+
>+	if (bw < r->membw.min_bw || bw > r->default_ctrl) {
> 		rdt_last_cmd_printf("MB value %ld out of range [%d,%d]\n", bw,
> 				    r->membw.min_bw, r->default_ctrl);
> 		return false;
>-- 
>2.46.0
>