All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Silas Boyd-Wickizer <sbw@mit.edu>
Cc: linux-kernel@vger.kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	x86@kernel.org
Subject: Re: [PATCH 2/4 V2] Use get_online_cpus to avoid races involving CPU hotplug
Date: Mon, 13 Aug 2012 09:50:21 -0700	[thread overview]
Message-ID: <20120813165021.GH2458@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120803193449.GC4227@mit.edu>

On Fri, Aug 03, 2012 at 12:34:50PM -0700, Silas Boyd-Wickizer wrote:
> If arch/x86/kernel/cpuid.c is a module, a CPU might offline or online
> between the for_each_online_cpu() loop and the call to
> register_hotcpu_notifier in cpuid_init or the call to
> unregister_hotcpu_notifier in cpuid_exit.  The potential races can
> lead to leaks/duplicates, attempts to destroy non-existant devices, or
> random pointer dereferences.
> 
> For example, in cpuid_exit if:
> 
>         for_each_online_cpu(cpu)
>                 cpuid_device_destroy(cpu);
>         class_destroy(cpuid_class);
>         __unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid");
>         <----- CPU onlines
>         unregister_hotcpu_notifier(&cpuid_class_cpu_notifier);
> 
> the hotcpu notifier will attempt to create a device for the
> cpuid_class, which the module already destroyed.
> 
> This fix surrounds for_each_online_cpu and register_hotcpu_notifier or
> unregister_hotcpu_notifier with get_online_cpus+put_online_cpus.
> 
> Tested on a VM.
> 
> Signed-off-by: Silas Boyd-Wickizer <sbw@mit.edu>

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

> ---
>  arch/x86/kernel/cpuid.c |    5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c
> index 39472dd..60c7891 100644
> --- a/arch/x86/kernel/cpuid.c
> +++ b/arch/x86/kernel/cpuid.c
> @@ -199,12 +199,14 @@ static int __init cpuid_init(void)
>  		goto out_chrdev;
>  	}
>  	cpuid_class->devnode = cpuid_devnode;
> +	get_online_cpus();
>  	for_each_online_cpu(i) {
>  		err = cpuid_device_create(i);
>  		if (err != 0)
>  			goto out_class;
>  	}
>  	register_hotcpu_notifier(&cpuid_class_cpu_notifier);
> +	put_online_cpus();
> 
>  	err = 0;
>  	goto out;
> @@ -214,6 +216,7 @@ out_class:
>  	for_each_online_cpu(i) {
>  		cpuid_device_destroy(i);
>  	}
> +	put_online_cpus();
>  	class_destroy(cpuid_class);
>  out_chrdev:
>  	__unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid");
> @@ -225,11 +228,13 @@ static void __exit cpuid_exit(void)
>  {
>  	int cpu = 0;
> 
> +	get_online_cpus();
>  	for_each_online_cpu(cpu)
>  		cpuid_device_destroy(cpu);
>  	class_destroy(cpuid_class);
>  	__unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid");
>  	unregister_hotcpu_notifier(&cpuid_class_cpu_notifier);
> +	put_online_cpus();
>  }
> 
>  module_init(cpuid_init);
> -- 
> 1.7.10.4
> 


      reply	other threads:[~2012-08-13 16:50 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-03 19:34 [PATCH 2/4 V2] Use get_online_cpus to avoid races involving CPU hotplug Silas Boyd-Wickizer
2012-08-13 16:50 ` Paul E. McKenney [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120813165021.GH2458@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sbw@mit.edu \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.