Messages in this thread | | | From | Vincent Guittot <> | Date | Fri, 15 Nov 2019 15:07:48 +0100 | Subject | Re: [PATCH v2] sched/uclamp: Fix overzealous type replacement |
| |
On Fri, 15 Nov 2019 at 11:39, Valentin Schneider <valentin.schneider@arm.com> wrote: > > Some uclamp helpers had their return type changed from 'unsigned int' to > 'enum uclamp_id' by commit > > 0413d7f33e60 ("sched/uclamp: Always use 'enum uclamp_id' for clamp_id values") > > but it happens that some do return a value in the [0, SCHED_CAPACITY_SCALE] > range, which should really be unsigned int. The affected helpers are > uclamp_none(), uclamp_rq_max_value() and uclamp_eff_value(). Fix those up. > > Note that this doesn't lead to any obj diff using a relatively recent > aarch64 compiler (8.3-2019.03). The current code of e.g. uclamp_eff_value() > properly returns an 11 bit value (bits_per(1024)) and doesn't seem to do > anything funny. I'm still marking this as fixing the above commit to be on > the safe side. > > Fixes: 0413d7f33e60 ("sched/uclamp: Always use 'enum uclamp_id' for clamp_id values") > Reviewed-by: Qais Yousef <qais.yousef@arm.com> > Signed-off-by: Valentin Schneider <valentin.schneider@arm.com> > --- > v2 changes: > o Also fix uclamp_none() (Vincent) > o Collect reviewed-by > o Slightly reword changelog > --- > kernel/sched/core.c | 6 +++--- > kernel/sched/sched.h | 2 +- > 2 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/kernel/sched/core.c b/kernel/sched/core.c > index 513a4794ff36..3ceff1c93ef1 100644 > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -810,7 +810,7 @@ static inline unsigned int uclamp_bucket_base_value(unsigned int clamp_value) > return UCLAMP_BUCKET_DELTA * uclamp_bucket_id(clamp_value); > } > > -static inline enum uclamp_id uclamp_none(enum uclamp_id clamp_id) > +static inline unsigned int uclamp_none(enum uclamp_id clamp_id)
Out of curiosity why uclamp decided to use unsigned int to manipulate utilization instead of unsigned long which is the type of util_avg ?
> { > if (clamp_id == UCLAMP_MIN) > return 0; > @@ -853,7 +853,7 @@ static inline void uclamp_idle_reset(struct rq *rq, enum uclamp_id clamp_id, > } > > static inline > -enum uclamp_id uclamp_rq_max_value(struct rq *rq, enum uclamp_id clamp_id, > +unsigned int uclamp_rq_max_value(struct rq *rq, enum uclamp_id clamp_id, > unsigned int clamp_value) > { > struct uclamp_bucket *bucket = rq->uclamp[clamp_id].bucket; > @@ -918,7 +918,7 @@ uclamp_eff_get(struct task_struct *p, enum uclamp_id clamp_id) > return uc_req; > } > > -enum uclamp_id uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id) > +unsigned int uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id) > { > struct uclamp_se uc_eff; > > diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h > index 05c282775f21..280a3c735935 100644 > --- a/kernel/sched/sched.h > +++ b/kernel/sched/sched.h > @@ -2300,7 +2300,7 @@ static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) {} > #endif /* CONFIG_CPU_FREQ */ > > #ifdef CONFIG_UCLAMP_TASK > -enum uclamp_id uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id); > +unsigned int uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id); > > static __always_inline > unsigned int uclamp_util_with(struct rq *rq, unsigned int util, > -- > 2.22.0 >
| |