All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] sched: Fix out-of-bound access in uclamp
@ 2021-04-30 15:14 Quentin Perret
  2021-04-30 15:27 ` Vincent Guittot
  2021-05-06 13:48 ` [tip: sched/urgent] " tip-bot2 for Quentin Perret
  0 siblings, 2 replies; 5+ messages in thread
From: Quentin Perret @ 2021-04-30 15:14 UTC (permalink / raw)
  To: mingo, peterz, vincent.guittot, juri.lelli
  Cc: dietmar.eggemann, rostedt, bsegall, mgorman, bristot,
	qais.yousef, kernel-team, linux-kernel, patrick.bellasi

Util-clamp places tasks in different buckets based on their clamp values
for performance reasons. However, the size of buckets is currently
computed using a rounding division, which can lead to an off-by-one
error in some configurations.

For instance, with 20 buckets, the bucket size will be 1024/20=51. A
task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
correct indexes are in range [0,19], hence leading to an out of bound
memory access.

Clamp the bucket id to fix the issue.

Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
Suggested-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Quentin Perret <qperret@google.com>
---
Changes in v3:
 - Keep rounding div to improve fairness (Vincent)
---
 kernel/sched/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 98191218d891..c12ec648423e 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -928,7 +928,7 @@ DEFINE_STATIC_KEY_FALSE(sched_uclamp_used);
 
 static inline unsigned int uclamp_bucket_id(unsigned int clamp_value)
 {
-	return clamp_value / UCLAMP_BUCKET_DELTA;
+	return min_t(unsigned int, clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1);
 }
 
 static inline unsigned int uclamp_none(enum uclamp_id clamp_id)
-- 
2.31.1.527.g47e6f16901-goog


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] sched: Fix out-of-bound access in uclamp
  2021-04-30 15:14 [PATCH v3] sched: Fix out-of-bound access in uclamp Quentin Perret
@ 2021-04-30 15:27 ` Vincent Guittot
  2021-05-03 10:55   ` Dietmar Eggemann
  2021-05-06 13:48 ` [tip: sched/urgent] " tip-bot2 for Quentin Perret
  1 sibling, 1 reply; 5+ messages in thread
From: Vincent Guittot @ 2021-04-30 15:27 UTC (permalink / raw)
  To: Quentin Perret
  Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Dietmar Eggemann,
	Steven Rostedt, Ben Segall, Mel Gorman,
	Daniel Bristot de Oliveira, Qais Yousef, Android Kernel Team,
	linux-kernel, Patrick Bellasi

On Fri, 30 Apr 2021 at 17:14, Quentin Perret <qperret@google.com> wrote:
>
> Util-clamp places tasks in different buckets based on their clamp values
> for performance reasons. However, the size of buckets is currently
> computed using a rounding division, which can lead to an off-by-one
> error in some configurations.
>
> For instance, with 20 buckets, the bucket size will be 1024/20=51. A
> task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
> correct indexes are in range [0,19], hence leading to an out of bound
> memory access.
>
> Clamp the bucket id to fix the issue.
>
> Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
> Suggested-by: Qais Yousef <qais.yousef@arm.com>
> Signed-off-by: Quentin Perret <qperret@google.com>

Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

> ---
> Changes in v3:
>  - Keep rounding div to improve fairness (Vincent)
> ---
>  kernel/sched/core.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 98191218d891..c12ec648423e 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -928,7 +928,7 @@ DEFINE_STATIC_KEY_FALSE(sched_uclamp_used);
>
>  static inline unsigned int uclamp_bucket_id(unsigned int clamp_value)
>  {
> -       return clamp_value / UCLAMP_BUCKET_DELTA;
> +       return min_t(unsigned int, clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1);
>  }
>
>  static inline unsigned int uclamp_none(enum uclamp_id clamp_id)
> --
> 2.31.1.527.g47e6f16901-goog
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] sched: Fix out-of-bound access in uclamp
  2021-04-30 15:27 ` Vincent Guittot
@ 2021-05-03 10:55   ` Dietmar Eggemann
  2021-05-03 14:45     ` Peter Zijlstra
  0 siblings, 1 reply; 5+ messages in thread
From: Dietmar Eggemann @ 2021-05-03 10:55 UTC (permalink / raw)
  To: Vincent Guittot, Quentin Perret
  Cc: Ingo Molnar, Peter Zijlstra, Juri Lelli, Steven Rostedt,
	Ben Segall, Mel Gorman, Daniel Bristot de Oliveira, Qais Yousef,
	Android Kernel Team, linux-kernel, Patrick Bellasi

On 30/04/2021 17:27, Vincent Guittot wrote:
> On Fri, 30 Apr 2021 at 17:14, Quentin Perret <qperret@google.com> wrote:
>>
>> Util-clamp places tasks in different buckets based on their clamp values
>> for performance reasons. However, the size of buckets is currently
>> computed using a rounding division, which can lead to an off-by-one
>> error in some configurations.
>>
>> For instance, with 20 buckets, the bucket size will be 1024/20=51. A
>> task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
>> correct indexes are in range [0,19], hence leading to an out of bound
>> memory access.
>>
>> Clamp the bucket id to fix the issue.
>>
>> Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
>> Suggested-by: Qais Yousef <qais.yousef@arm.com>
>> Signed-off-by: Quentin Perret <qperret@google.com>
> 
> Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

I forgot that config UCLAMP_BUCKETS_COUNT is in range 5 ... 20.

So the error is bound to [-2 ... 5] (13/79, 20/51). I agree that we can
live with that.

Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>

>> ---
>> Changes in v3:
>>  - Keep rounding div to improve fairness (Vincent)
>> ---
>>  kernel/sched/core.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
>> index 98191218d891..c12ec648423e 100644
>> --- a/kernel/sched/core.c
>> +++ b/kernel/sched/core.c
>> @@ -928,7 +928,7 @@ DEFINE_STATIC_KEY_FALSE(sched_uclamp_used);
>>
>>  static inline unsigned int uclamp_bucket_id(unsigned int clamp_value)
>>  {
>> -       return clamp_value / UCLAMP_BUCKET_DELTA;
>> +       return min_t(unsigned int, clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1);
>>  }
>>
>>  static inline unsigned int uclamp_none(enum uclamp_id clamp_id)
>> --
>> 2.31.1.527.g47e6f16901-goog
>>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] sched: Fix out-of-bound access in uclamp
  2021-05-03 10:55   ` Dietmar Eggemann
@ 2021-05-03 14:45     ` Peter Zijlstra
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Zijlstra @ 2021-05-03 14:45 UTC (permalink / raw)
  To: Dietmar Eggemann
  Cc: Vincent Guittot, Quentin Perret, Ingo Molnar, Juri Lelli,
	Steven Rostedt, Ben Segall, Mel Gorman,
	Daniel Bristot de Oliveira, Qais Yousef, Android Kernel Team,
	linux-kernel, Patrick Bellasi

On Mon, May 03, 2021 at 12:55:34PM +0200, Dietmar Eggemann wrote:
> On 30/04/2021 17:27, Vincent Guittot wrote:
> > On Fri, 30 Apr 2021 at 17:14, Quentin Perret <qperret@google.com> wrote:
> >>
> >> Util-clamp places tasks in different buckets based on their clamp values
> >> for performance reasons. However, the size of buckets is currently
> >> computed using a rounding division, which can lead to an off-by-one
> >> error in some configurations.
> >>
> >> For instance, with 20 buckets, the bucket size will be 1024/20=51. A
> >> task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
> >> correct indexes are in range [0,19], hence leading to an out of bound
> >> memory access.
> >>
> >> Clamp the bucket id to fix the issue.
> >>
> >> Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
> >> Suggested-by: Qais Yousef <qais.yousef@arm.com>
> >> Signed-off-by: Quentin Perret <qperret@google.com>
> > 
> > Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>

> Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>

Thanks!

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip: sched/urgent] sched: Fix out-of-bound access in uclamp
  2021-04-30 15:14 [PATCH v3] sched: Fix out-of-bound access in uclamp Quentin Perret
  2021-04-30 15:27 ` Vincent Guittot
@ 2021-05-06 13:48 ` tip-bot2 for Quentin Perret
  1 sibling, 0 replies; 5+ messages in thread
From: tip-bot2 for Quentin Perret @ 2021-05-06 13:48 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Qais Yousef, Quentin Perret, Peter Zijlstra (Intel),
	Vincent Guittot, Dietmar Eggemann, x86, linux-kernel

The following commit has been merged into the sched/urgent branch of tip:

Commit-ID:     6d2f8909a5fabb73fe2a63918117943986c39b6c
Gitweb:        https://git.kernel.org/tip/6d2f8909a5fabb73fe2a63918117943986c39b6c
Author:        Quentin Perret <qperret@google.com>
AuthorDate:    Fri, 30 Apr 2021 15:14:12 
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Thu, 06 May 2021 15:33:26 +02:00

sched: Fix out-of-bound access in uclamp

Util-clamp places tasks in different buckets based on their clamp values
for performance reasons. However, the size of buckets is currently
computed using a rounding division, which can lead to an off-by-one
error in some configurations.

For instance, with 20 buckets, the bucket size will be 1024/20=51. A
task with a clamp of 1024 will be mapped to bucket id 1024/51=20. Sadly,
correct indexes are in range [0,19], hence leading to an out of bound
memory access.

Clamp the bucket id to fix the issue.

Fixes: 69842cba9ace ("sched/uclamp: Add CPU's clamp buckets refcounting")
Suggested-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org>
Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Link: https://lkml.kernel.org/r/20210430151412.160913-1-qperret@google.com
---
 kernel/sched/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 9143163..5226cc2 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -938,7 +938,7 @@ DEFINE_STATIC_KEY_FALSE(sched_uclamp_used);
 
 static inline unsigned int uclamp_bucket_id(unsigned int clamp_value)
 {
-	return clamp_value / UCLAMP_BUCKET_DELTA;
+	return min_t(unsigned int, clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1);
 }
 
 static inline unsigned int uclamp_none(enum uclamp_id clamp_id)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-05-06 13:48 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-30 15:14 [PATCH v3] sched: Fix out-of-bound access in uclamp Quentin Perret
2021-04-30 15:27 ` Vincent Guittot
2021-05-03 10:55   ` Dietmar Eggemann
2021-05-03 14:45     ` Peter Zijlstra
2021-05-06 13:48 ` [tip: sched/urgent] " tip-bot2 for Quentin Perret

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.