Message ID | 5a8deed4-7764-4729-a9d4-9520c25fa7e8@arm.com (mailing list archive) |
---|---|
State | Queued |
Delegated to: | Rafael Wysocki |
Headers | show |
Series | cpufreq/schedutil: Only bind threads if needed | expand |
On Mon, Jan 20, 2025 at 11:10 AM Christian Loehle <christian.loehle@arm.com> wrote: > > Remove the unconditional binding of sugov kthreads to the affected CPUs > if the cpufreq driver indicates that updates can happen from any CPU. > This allows userspace to set affinities to either save power (waking up > bigger CPUs on HMP can be expensive) or increasing performance (by > letting the utilized CPUs run without preemption of the sugov kthread). > > Signed-off-by: Christian Loehle <christian.loehle@arm.com> > Acked-by: Viresh Kumar <viresh.kumar@linaro.org> > Acked-by: Vincent Guittot <vincent.guittot@linaro.org> > Acked-by: Rafael J. Wysocki <rafael@kernel.org> > Acked-by: Juri Lelli <juri.lelli@redhat.com> > --- > - RESEND: pick up tags > - v2: Add comment for the dl_task_check_affinity return (Juri) > v2: https://lore.kernel.org/lkml/a4a70646-98a4-4b85-955e-62d66ba68927@arm.com/ > v1: https://lore.kernel.org/lkml/480f2140-ea59-4e1d-a68d-18cbcec10941@arm.com/ > > kernel/sched/cpufreq_schedutil.c | 6 +++++- > kernel/sched/syscalls.c | 7 +++++++ > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > index 28c77904ea74..a81444501158 100644 > --- a/kernel/sched/cpufreq_schedutil.c > +++ b/kernel/sched/cpufreq_schedutil.c > @@ -691,7 +691,11 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) > } > > sg_policy->thread = thread; > - kthread_bind_mask(thread, policy->related_cpus); > + if (policy->dvfs_possible_from_any_cpu) > + set_cpus_allowed_ptr(thread, policy->related_cpus); > + else > + kthread_bind_mask(thread, policy->related_cpus); > + > init_irq_work(&sg_policy->irq_work, sugov_irq_work); > mutex_init(&sg_policy->work_lock); > > diff --git a/kernel/sched/syscalls.c b/kernel/sched/syscalls.c > index ff0e5ab4e37c..8230358d2b90 100644 > --- a/kernel/sched/syscalls.c > +++ b/kernel/sched/syscalls.c > @@ -1139,6 +1139,13 @@ int dl_task_check_affinity(struct task_struct *p, const struct cpumask *mask) > if (!task_has_dl_policy(p) || !dl_bandwidth_enabled()) > return 0; > > + /* > + * The special/sugov task isn't part of regular bandwidth/admission > + * control so let userspace change affinities. > + */ > + if (dl_entity_is_special(&p->dl)) > + return 0; > + > /* > * Since bandwidth control happens on root_domain basis, > * if admission test is enabled, we only admit -deadline > -- Applied as 6.14-rc material, thanks!
diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 28c77904ea74..a81444501158 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -691,7 +691,11 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) } sg_policy->thread = thread; - kthread_bind_mask(thread, policy->related_cpus); + if (policy->dvfs_possible_from_any_cpu) + set_cpus_allowed_ptr(thread, policy->related_cpus); + else + kthread_bind_mask(thread, policy->related_cpus); + init_irq_work(&sg_policy->irq_work, sugov_irq_work); mutex_init(&sg_policy->work_lock); diff --git a/kernel/sched/syscalls.c b/kernel/sched/syscalls.c index ff0e5ab4e37c..8230358d2b90 100644 --- a/kernel/sched/syscalls.c +++ b/kernel/sched/syscalls.c @@ -1139,6 +1139,13 @@ int dl_task_check_affinity(struct task_struct *p, const struct cpumask *mask) if (!task_has_dl_policy(p) || !dl_bandwidth_enabled()) return 0; + /* + * The special/sugov task isn't part of regular bandwidth/admission + * control so let userspace change affinities. + */ + if (dl_entity_is_special(&p->dl)) + return 0; + /* * Since bandwidth control happens on root_domain basis, * if admission test is enabled, we only admit -deadline