All of lore.kernel.org
 help / color / mirror / Atom feed
From: Toshi Kani <toshi.kani@hp.com>
To: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
Cc: paulus@samba.org, oleg@redhat.com, mingo@kernel.org,
	rusty@rustcorp.com.au, peterz@infradead.org, tglx@linutronix.de,
	akpm@linux-foundation.org, paulmck@linux.vnet.ibm.com,
	tj@kernel.org, walken@google.com, ego@linux.vnet.ibm.com,
	linux@arm.linux.org.uk, rjw@rjwysocki.net,
	linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Subject: Re: [PATCH v2 02/52] CPU hotplug: Provide lockless versions of callback registration functions
Date: Wed, 19 Feb 2014 14:34:46 -0700	[thread overview]
Message-ID: <1392845686.6784.3.camel@misato.fc.hp.com> (raw)
In-Reply-To: <20140214074922.22701.17949.stgit@srivatsabhat.in.ibm.com>

On Fri, 2014-02-14 at 13:19 +0530, Srivatsa S. Bhat wrote:
> The following method of CPU hotplug callback registration is not safe
> due to the possibility of an ABBA deadlock involving the cpu_add_remove_lock
> and the cpu_hotplug.lock.
> 
> 	get_online_cpus();
> 
> 	for_each_online_cpu(cpu)
> 		init_cpu(cpu);
> 
> 	register_cpu_notifier(&foobar_cpu_notifier);
> 
> 	put_online_cpus();
> 
> The deadlock is shown below:
> 
>           CPU 0                                         CPU 1
>           -----                                         -----
> 
>    Acquire cpu_hotplug.lock
>    [via get_online_cpus()]
> 
>                                               CPU online/offline operation
>                                               takes cpu_add_remove_lock
>                                               [via cpu_maps_update_begin()]
> 
> 
>    Try to acquire
>    cpu_add_remove_lock
>    [via register_cpu_notifier()]
> 
> 
>                                               CPU online/offline operation
>                                               tries to acquire cpu_hotplug.lock
>                                               [via cpu_hotplug_begin()]
> 
> 
>                             *** DEADLOCK! ***
> 
> The problem here is that callback registration takes the locks in one order
> whereas the CPU hotplug operations take the same locks in the opposite order.
> To avoid this issue and to provide a race-free method to register CPU hotplug
> callbacks (along with initialization of already online CPUs), introduce new
> variants of the callback registration APIs that simply register the callbacks
> without holding the cpu_add_remove_lock during the registration. That way,
> we can avoid the ABBA scenario. However, we will need to hold the
> cpu_add_remove_lock throughout the entire critical section, to protect updates
> to the callback/notifier chain.
> 
> This can be achieved by writing the callback registration code as follows:
> 
> 	cpu_maps_update_begin(); [ or cpu_notifier_register_begin(); see below ]
> 
> 	for_each_online_cpu(cpu)
> 		init_cpu(cpu);
> 
> 	/* This doesn't take the cpu_add_remove_lock */
> 	__register_cpu_notifier(&foobar_cpu_notifier);
> 
> 	cpu_maps_update_done();  [ or cpu_notifier_register_done(); see below ]
> 
> Note that we can't use get_online_cpus() here instead of cpu_maps_update_begin()
> because the cpu_hotplug.lock is dropped during the invocation of CPU_POST_DEAD
> notifiers, and hence get_online_cpus() cannot provide the necessary
> synchronization to protect the callback/notifier chains against concurrent
> reads and writes. On the other hand, since the cpu_add_remove_lock protects
> the entire hotplug operation (including CPU_POST_DEAD), we can use
> cpu_maps_update_begin/done() to guarantee proper synchronization.
> 
> Also, since cpu_maps_update_begin/done() is like a super-set of
> get/put_online_cpus(), the former naturally protects the critical sections
> from concurrent hotplug operations.
> 
> Since the names cpu_maps_update_begin/done() don't make much sense in CPU
> hotplug callback registration scenarios, we'll introduce new APIs named
> cpu_notifier_register_begin/done() and map them to cpu_maps_update_begin/done().
> 
> In summary, introduce the lockless variants of un/register_cpu_notifier() and
> also export the cpu_notifier_register_begin/done() APIs for use by modules.
> This way, we provide a race-free way to register hotplug callbacks as well as
> perform initialization for the CPUs that are already online.
> 
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Toshi Kani <toshi.kani@hp.com>
> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Ingo Molnar <mingo@kernel.org>
> Acked-by: Oleg Nesterov <oleg@redhat.com>
> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>

Acked-by: Toshi Kani <toshi.kani@hp.com>

Thanks,
-Toshi



  parent reply	other threads:[~2014-02-19 21:42 UTC|newest]

Thread overview: 202+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-14  7:49 [PATCH v2 00/52] CPU hotplug: Fix issues with callback registration Srivatsa S. Bhat
2014-02-14  7:49 ` [PATCH v2 01/52] CPU hotplug: Add lockdep annotations to get/put_online_cpus() Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49 ` [PATCH v2 02/52] CPU hotplug: Provide lockless versions of callback registration functions Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-17 13:26   ` Gautham R Shenoy
2014-02-19 21:34   ` Toshi Kani [this message]
2014-02-14  7:49 ` [PATCH v2 03/52] Doc/cpu-hotplug: Specify race-free way to register CPU hotplug callbacks Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49 ` [PATCH v2 04/52] CPU hotplug, perf: Fix CPU hotplug callback registration Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:49   ` Srivatsa S. Bhat
2014-02-14  7:50 ` [PATCH v2 05/52] ia64, salinfo: Fix " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50 ` [PATCH v2 06/52] ia64, palinfo: Fix CPU " Srivatsa S. Bhat
2014-02-14  8:02   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50 ` [PATCH v2 07/52] ia64, topology: " Srivatsa S. Bhat
2014-02-14  8:02   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50 ` [PATCH v2 08/52] ia64, err-inject: " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:50   ` Srivatsa S. Bhat
2014-02-14  7:51 ` [PATCH v2 09/52] arm, hw-breakpoint: " Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51 ` [PATCH v2 10/52] arm, kvm: " Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14 10:29   ` Paolo Bonzini
2014-02-14 10:29     ` Paolo Bonzini
2014-02-14  7:51 ` [PATCH v2 11/52] s390, cacheinfo: " Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51 ` [PATCH v2 12/52] s390, smp: " Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:51   ` Srivatsa S. Bhat
2014-02-14  7:52 ` [PATCH v2 13/52] sparc, sysfs: " Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14 18:30   ` David Miller
2014-02-14 18:30     ` David Miller
2014-02-14  7:52 ` [PATCH v2 14/52] powerpc, " Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-03-07  2:57   ` Benjamin Herrenschmidt
2014-03-07  2:57     ` Benjamin Herrenschmidt
2014-03-07  2:57     ` Benjamin Herrenschmidt
2014-03-07  6:21     ` Gautham R Shenoy
2014-03-07  6:21       ` Gautham R Shenoy
2014-02-14  7:52 ` [PATCH v2 15/52] x86, msr: " Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52 ` [PATCH v2 16/52] x86, cpuid: " Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52 ` [PATCH v2 17/52] x86, vsyscall: " Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:52   ` Srivatsa S. Bhat
2014-02-14  7:53 ` [PATCH v2 18/52] x86, intel, uncore: " Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53 ` [PATCH v2 19/52] x86, mce: " Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53 ` [PATCH v2 20/52] x86, therm_throt.c: " Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53 ` [PATCH v2 21/52] x86, therm_throt.c: Remove unused therm_cpu_lock Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:53   ` Srivatsa S. Bhat
2014-02-14  7:54 ` [PATCH v2 22/52] x86, amd, ibs: Fix CPU hotplug callback registration Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54 ` [PATCH v2 23/52] x86, intel, cacheinfo: " Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54 ` [PATCH v2 24/52] x86, intel, rapl: " Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54 ` [PATCH v2 25/52] x86, amd, uncore: " Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:54   ` Srivatsa S. Bhat
2014-02-14  7:55 ` [PATCH v2 26/52] x86, hpet: " Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55 ` [PATCH v2 27/52] x86, pci, amd-bus: " Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14 17:35   ` Bjorn Helgaas
2014-02-14 18:03     ` Srivatsa S. Bhat
2014-02-14  7:55 ` [PATCH v2 28/52] x86, oprofile, nmi: " Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55 ` [PATCH v2 29/52] x86, kvm: " Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14 10:29   ` Paolo Bonzini
2014-02-14  7:55 ` [PATCH v2 30/52] arm64, hw_breakpoint.c: " Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:55   ` Srivatsa S. Bhat
2014-02-14  7:56 ` [PATCH v2 31/52] arm64, debug-monitors: " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56 ` [PATCH v2 32/52] powercap, intel-rapl: " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56 ` [PATCH v2 33/52] scsi, bnx2i: " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56 ` [PATCH v2 34/52] scsi, bnx2fc: " Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:56   ` Srivatsa S. Bhat
2014-02-14  7:57 ` [PATCH v2 35/52] scsi, fcoe: " Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57 ` [PATCH v2 36/52] zsmalloc: " Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57 ` [PATCH v2 37/52] acpi-cpufreq: " Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57 ` [PATCH v2 38/52] drivers/base/topology.c: " Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-14  7:57   ` Srivatsa S. Bhat
2014-02-15 19:38   ` Greg Kroah-Hartman
2014-02-14  7:58 ` [PATCH v2 39/52] clocksource, dummy-timer: " Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58 ` [PATCH v2 40/52] intel-idle: " Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58 ` [PATCH v2 41/52] oprofile, nmi-timer: " Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58 ` [PATCH v2 42/52] octeon, watchdog: " Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58 ` [PATCH v2 43/52] thermal, x86-pkg-temp: " Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:58   ` Srivatsa S. Bhat
2014-02-14  7:59 ` [PATCH v2 44/52] hwmon, coretemp: " Srivatsa S. Bhat
2014-02-14  8:11   ` [lm-sensors] " Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59 ` [PATCH v2 45/52] hwmon, via-cputemp: " Srivatsa S. Bhat
2014-02-14  8:11   ` [lm-sensors] " Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59 ` [PATCH v2 46/52] xen, balloon: " Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14 16:49   ` Boris Ostrovsky
2014-02-14 16:50     ` Srivatsa S. Bhat
2014-02-15 16:51       ` [UPDATED][PATCH " Srivatsa S. Bhat
2014-02-15 16:51       ` Srivatsa S. Bhat
2014-02-17 14:50         ` Boris Ostrovsky
2014-02-17 14:50         ` Boris Ostrovsky
2014-02-14 16:50     ` [PATCH " Srivatsa S. Bhat
2014-02-14 16:49   ` Boris Ostrovsky
2014-02-14  7:59 ` Srivatsa S. Bhat
2014-02-14  7:59 ` [PATCH v2 47/52] trace, ring-buffer: " Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  7:59   ` Srivatsa S. Bhat
2014-02-14  8:00 ` [PATCH v2 48/52] profile: " Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00 ` [PATCH v2 49/52] mm, vmstat: " Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14 14:26   ` Rik van Riel
2014-02-14 14:26     ` Rik van Riel
2014-02-14  8:00 ` [PATCH v2 50/52] mm, zswap: " Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00 ` [PATCH v2 51/52] net/core/flow.c: " Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14 18:31   ` David Miller
2014-02-14  8:00 ` [PATCH v2 52/52] net/iucv/iucv.c: " Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14  8:00   ` Srivatsa S. Bhat
2014-02-14 18:31   ` David Miller
2014-02-18  8:56 ` [PATCH v2 00/52] CPU hotplug: Fix issues with " Srivatsa S. Bhat

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=1392845686.6784.3.camel@misato.fc.hp.com \
    --to=toshi.kani@hp.com \
    --cc=akpm@linux-foundation.org \
    --cc=ego@linux.vnet.ibm.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=paulus@samba.org \
    --cc=peterz@infradead.org \
    --cc=rjw@rjwysocki.net \
    --cc=rusty@rustcorp.com.au \
    --cc=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=walken@google.com \
    /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.