Message ID | 20240808234415.554937-1-qyousef@layalina.io (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | [v3] sched: cpufreq: Rename map_util_perf to sugov_apply_dvfs_headroom | expand |
On 8/9/24 00:44, Qais Yousef wrote: > We are providing headroom for the utilization to grow until the next > decision point to pick the next frequency. Give the function a better > name and give it some documentation. It is not really mapping anything. > > Also move it to cpufreq_schedutil.c. This function relies on updating > util signal appropriately to give a headroom to grow. This is tied to > schedutil and scheduler and not something that can be shared with other > governors. > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > Acked-by: Rafael J. Wysocki <rafael@kernel.org> > Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org> > Signed-off-by: Qais Yousef <qyousef@layalina.io> > --- > > Changes in v3: > > 1. Add Reviewed-by from Vincent > > Changes in v2: > > 1. Add Acked-by from Viresh and Raphael (Thanks!) > 2. Move the function to cpufreq_schedutil.c instead of sched.h > 3. Name space the function with sugov_ to indicate it is special to > this governor only and not generic. > > include/linux/sched/cpufreq.h | 5 ----- > kernel/sched/cpufreq_schedutil.c | 20 +++++++++++++++++++- > 2 files changed, 19 insertions(+), 6 deletions(-) > > diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h > index bdd31ab93bc5..d01755d3142f 100644 > --- a/include/linux/sched/cpufreq.h > +++ b/include/linux/sched/cpufreq.h > @@ -28,11 +28,6 @@ static inline unsigned long map_util_freq(unsigned long util, > { > return freq * util / cap; > } > - > -static inline unsigned long map_util_perf(unsigned long util) > -{ > - return util + (util >> 2); > -} > #endif /* CONFIG_CPU_FREQ */ > > #endif /* _LINUX_SCHED_CPUFREQ_H */ > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > index eece6244f9d2..575df3599813 100644 > --- a/kernel/sched/cpufreq_schedutil.c > +++ b/kernel/sched/cpufreq_schedutil.c > @@ -178,12 +178,30 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, > return cpufreq_driver_resolve_freq(policy, freq); > } > > +/* > + * DVFS decision are made at discrete points. If CPU stays busy, the util will > + * continue to grow, which means it could need to run at a higher frequency > + * before the next decision point was reached. IOW, we can't follow the util as > + * it grows immediately, but there's a delay before we issue a request to go to > + * higher frequency. The headroom caters for this delay so the system continues > + * to run at adequate performance point. > + * > + * This function provides enough headroom to provide adequate performance > + * assuming the CPU continues to be busy. > + * > + * At the moment it is a constant multiplication with 1.25. > + */ > +static inline unsigned long sugov_apply_dvfs_headroom(unsigned long util) > +{ > + return util + (util >> 2); > +} > + > unsigned long sugov_effective_cpu_perf(int cpu, unsigned long actual, > unsigned long min, > unsigned long max) > { > /* Add dvfs headroom to actual utilization */ > - actual = map_util_perf(actual); > + actual = sugov_apply_dvfs_headroom(actual); Maybe you can even get rid of the comment above now. sugov_apply_dvfs_headroom(actual) is pretty self-explanatory. Anyway Reviewed-by: Christian Loehle <christian.loehle@arm.com> > /* Actually we don't need to target the max performance */ > if (actual < max) > max = actual;
On 08/16/24 16:44, Christian Loehle wrote: > On 8/9/24 00:44, Qais Yousef wrote: > > We are providing headroom for the utilization to grow until the next > > decision point to pick the next frequency. Give the function a better > > name and give it some documentation. It is not really mapping anything. > > > > Also move it to cpufreq_schedutil.c. This function relies on updating > > util signal appropriately to give a headroom to grow. This is tied to > > schedutil and scheduler and not something that can be shared with other > > governors. > > > > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > > Acked-by: Rafael J. Wysocki <rafael@kernel.org> > > Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org> > > Signed-off-by: Qais Yousef <qyousef@layalina.io> > > --- > > > > Changes in v3: > > > > 1. Add Reviewed-by from Vincent > > > > Changes in v2: > > > > 1. Add Acked-by from Viresh and Raphael (Thanks!) > > 2. Move the function to cpufreq_schedutil.c instead of sched.h > > 3. Name space the function with sugov_ to indicate it is special to > > this governor only and not generic. > > > > include/linux/sched/cpufreq.h | 5 ----- > > kernel/sched/cpufreq_schedutil.c | 20 +++++++++++++++++++- > > 2 files changed, 19 insertions(+), 6 deletions(-) > > > > diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h > > index bdd31ab93bc5..d01755d3142f 100644 > > --- a/include/linux/sched/cpufreq.h > > +++ b/include/linux/sched/cpufreq.h > > @@ -28,11 +28,6 @@ static inline unsigned long map_util_freq(unsigned long util, > > { > > return freq * util / cap; > > } > > - > > -static inline unsigned long map_util_perf(unsigned long util) > > -{ > > - return util + (util >> 2); > > -} > > #endif /* CONFIG_CPU_FREQ */ > > > > #endif /* _LINUX_SCHED_CPUFREQ_H */ > > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > > index eece6244f9d2..575df3599813 100644 > > --- a/kernel/sched/cpufreq_schedutil.c > > +++ b/kernel/sched/cpufreq_schedutil.c > > @@ -178,12 +178,30 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, > > return cpufreq_driver_resolve_freq(policy, freq); > > } > > > > +/* > > + * DVFS decision are made at discrete points. If CPU stays busy, the util will > > + * continue to grow, which means it could need to run at a higher frequency > > + * before the next decision point was reached. IOW, we can't follow the util as > > + * it grows immediately, but there's a delay before we issue a request to go to > > + * higher frequency. The headroom caters for this delay so the system continues > > + * to run at adequate performance point. > > + * > > + * This function provides enough headroom to provide adequate performance > > + * assuming the CPU continues to be busy. > > + * > > + * At the moment it is a constant multiplication with 1.25. > > + */ > > +static inline unsigned long sugov_apply_dvfs_headroom(unsigned long util) > > +{ > > + return util + (util >> 2); > > +} > > + > > unsigned long sugov_effective_cpu_perf(int cpu, unsigned long actual, > > unsigned long min, > > unsigned long max) > > { > > /* Add dvfs headroom to actual utilization */ > > - actual = map_util_perf(actual); > > + actual = sugov_apply_dvfs_headroom(actual); > > Maybe you can even get rid of the comment above now. > sugov_apply_dvfs_headroom(actual) is pretty self-explanatory. It was actually not clear to folks based on previous discussion. And I already doing many changes on how dvfs headroom is done on another series. So I think it is worth it. > > Anyway > Reviewed-by: Christian Loehle <christian.loehle@arm.com> Thanks for having a look! > > > /* Actually we don't need to target the max performance */ > > if (actual < max) > > max = actual; >
diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h index bdd31ab93bc5..d01755d3142f 100644 --- a/include/linux/sched/cpufreq.h +++ b/include/linux/sched/cpufreq.h @@ -28,11 +28,6 @@ static inline unsigned long map_util_freq(unsigned long util, { return freq * util / cap; } - -static inline unsigned long map_util_perf(unsigned long util) -{ - return util + (util >> 2); -} #endif /* CONFIG_CPU_FREQ */ #endif /* _LINUX_SCHED_CPUFREQ_H */ diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index eece6244f9d2..575df3599813 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -178,12 +178,30 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, return cpufreq_driver_resolve_freq(policy, freq); } +/* + * DVFS decision are made at discrete points. If CPU stays busy, the util will + * continue to grow, which means it could need to run at a higher frequency + * before the next decision point was reached. IOW, we can't follow the util as + * it grows immediately, but there's a delay before we issue a request to go to + * higher frequency. The headroom caters for this delay so the system continues + * to run at adequate performance point. + * + * This function provides enough headroom to provide adequate performance + * assuming the CPU continues to be busy. + * + * At the moment it is a constant multiplication with 1.25. + */ +static inline unsigned long sugov_apply_dvfs_headroom(unsigned long util) +{ + return util + (util >> 2); +} + unsigned long sugov_effective_cpu_perf(int cpu, unsigned long actual, unsigned long min, unsigned long max) { /* Add dvfs headroom to actual utilization */ - actual = map_util_perf(actual); + actual = sugov_apply_dvfs_headroom(actual); /* Actually we don't need to target the max performance */ if (actual < max) max = actual;