[PATCH] cpufreq: zero-initialize policy cpumask before sysfs publication

Zhongqiu Han posted 1 patch 3 weeks, 3 days ago
drivers/cpufreq/cpufreq.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] cpufreq: zero-initialize policy cpumask before sysfs publication
Posted by Zhongqiu Han 3 weeks, 3 days ago
cpufreq_policy_alloc() allocates policy->cpus with alloc_cpumask_var(),
i.e. without __GFP_ZERO, unlike the sibling related_cpus and real_cpus
masks. With CONFIG_CPUMASK_OFFSTACK=y the mask is a separate
kmalloc_node() allocation, so its bitmap holds whatever the slab allocator
left behind:

  cpufreq_online()
    cpufreq_policy_alloc()
      alloc_cpumask_var(&policy->cpus)    /* bitmap is uninitialized */
      kobject_init_and_add()              /* policy%u/ appears in sysfs */
    cpufreq_policy_online()
      cpumask_copy(policy->cpus, cpumask_of(cpu))  /* first valid value */

This leaves a window in which the sysfs attributes are already reachable
while policy->cpus is still garbage. show()/store() gate on
policy_is_inactive(), i.e. cpumask_empty(policy->cpus), so a non-zero
bitmap makes them run the attribute callbacks on a policy that is not
initialized yet.

Fix this by using zalloc_cpumask_var() for policy->cpus.

Fixes: 2fc3384dc75b ("cpufreq: Initialize policy->kobj while allocating policy")
Cc: stable@vger.kernel.org
Signed-off-by: Zhongqiu Han <zhongqiu.han@oss.qualcomm.com>
---
This patch is based on https://lore.kernel.org/all/83f87db8-fa13-41d0-ae52-544d22e228e6@oss.qualcomm.com/

 drivers/cpufreq/cpufreq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 0d0df986fa3d..3b1b2ed86cc3 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1249,7 +1249,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
 	if (!policy)
 		return NULL;
 
-	if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
+	if (!zalloc_cpumask_var(&policy->cpus, GFP_KERNEL))
 		goto err_free_policy;
 
 	if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
-- 
2.43.0
Re: [PATCH] cpufreq: zero-initialize policy cpumask before sysfs publication
Posted by Viresh Kumar 3 weeks, 3 days ago
On 01-09-26, 22:36, Zhongqiu Han wrote:
> cpufreq_policy_alloc() allocates policy->cpus with alloc_cpumask_var(),
> i.e. without __GFP_ZERO, unlike the sibling related_cpus and real_cpus
> masks. With CONFIG_CPUMASK_OFFSTACK=y the mask is a separate
> kmalloc_node() allocation, so its bitmap holds whatever the slab allocator
> left behind:
> 
>   cpufreq_online()
>     cpufreq_policy_alloc()
>       alloc_cpumask_var(&policy->cpus)    /* bitmap is uninitialized */
>       kobject_init_and_add()              /* policy%u/ appears in sysfs */
>     cpufreq_policy_online()
>       cpumask_copy(policy->cpus, cpumask_of(cpu))  /* first valid value */
> 
> This leaves a window in which the sysfs attributes are already reachable
> while policy->cpus is still garbage. show()/store() gate on
> policy_is_inactive(), i.e. cpumask_empty(policy->cpus), so a non-zero
> bitmap makes them run the attribute callbacks on a policy that is not
> initialized yet.
> 
> Fix this by using zalloc_cpumask_var() for policy->cpus.
> 
> Fixes: 2fc3384dc75b ("cpufreq: Initialize policy->kobj while allocating policy")
> Cc: stable@vger.kernel.org
> Signed-off-by: Zhongqiu Han <zhongqiu.han@oss.qualcomm.com>
> ---
> This patch is based on https://lore.kernel.org/all/83f87db8-fa13-41d0-ae52-544d22e228e6@oss.qualcomm.com/
> 
>  drivers/cpufreq/cpufreq.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> index 0d0df986fa3d..3b1b2ed86cc3 100644
> --- a/drivers/cpufreq/cpufreq.c
> +++ b/drivers/cpufreq/cpufreq.c
> @@ -1249,7 +1249,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
>  	if (!policy)
>  		return NULL;
>  
> -	if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
> +	if (!zalloc_cpumask_var(&policy->cpus, GFP_KERNEL))
>  		goto err_free_policy;
>  
>  	if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

-- 
viresh
Re: [PATCH] cpufreq: zero-initialize policy cpumask before sysfs publication
Posted by Rafael J. Wysocki (Intel) 3 weeks ago
On Wed, Sep 2, 2026 at 6:30 AM Viresh Kumar <viresh.kumar@linaro.org> wrote:
>
> On 01-09-26, 22:36, Zhongqiu Han wrote:
> > cpufreq_policy_alloc() allocates policy->cpus with alloc_cpumask_var(),
> > i.e. without __GFP_ZERO, unlike the sibling related_cpus and real_cpus
> > masks. With CONFIG_CPUMASK_OFFSTACK=y the mask is a separate
> > kmalloc_node() allocation, so its bitmap holds whatever the slab allocator
> > left behind:
> >
> >   cpufreq_online()
> >     cpufreq_policy_alloc()
> >       alloc_cpumask_var(&policy->cpus)    /* bitmap is uninitialized */
> >       kobject_init_and_add()              /* policy%u/ appears in sysfs */
> >     cpufreq_policy_online()
> >       cpumask_copy(policy->cpus, cpumask_of(cpu))  /* first valid value */
> >
> > This leaves a window in which the sysfs attributes are already reachable
> > while policy->cpus is still garbage. show()/store() gate on
> > policy_is_inactive(), i.e. cpumask_empty(policy->cpus), so a non-zero
> > bitmap makes them run the attribute callbacks on a policy that is not
> > initialized yet.
> >
> > Fix this by using zalloc_cpumask_var() for policy->cpus.
> >
> > Fixes: 2fc3384dc75b ("cpufreq: Initialize policy->kobj while allocating policy")
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Zhongqiu Han <zhongqiu.han@oss.qualcomm.com>
> > ---
> > This patch is based on https://lore.kernel.org/all/83f87db8-fa13-41d0-ae52-544d22e228e6@oss.qualcomm.com/
> >
> >  drivers/cpufreq/cpufreq.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
> > index 0d0df986fa3d..3b1b2ed86cc3 100644
> > --- a/drivers/cpufreq/cpufreq.c
> > +++ b/drivers/cpufreq/cpufreq.c
> > @@ -1249,7 +1249,7 @@ static struct cpufreq_policy *cpufreq_policy_alloc(unsigned int cpu)
> >       if (!policy)
> >               return NULL;
> >
> > -     if (!alloc_cpumask_var(&policy->cpus, GFP_KERNEL))
> > +     if (!zalloc_cpumask_var(&policy->cpus, GFP_KERNEL))
> >               goto err_free_policy;
> >
> >       if (!zalloc_cpumask_var(&policy->related_cpus, GFP_KERNEL))
>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
>
> --

Applied as 7.3-rc material, thanks!