linux-kernel.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).