From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1425699AbdEZIqB (ORCPT ); Fri, 26 May 2017 04:46:01 -0400 Received: from terminus.zytor.com ([65.50.211.136]:54679 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967539AbdEZIpz (ORCPT ); Fri, 26 May 2017 04:45:55 -0400 Date: Fri, 26 May 2017 01:43:21 -0700 From: tip-bot for Thomas Gleixner Message-ID: Cc: rafael.j.wysocki@intel.com, tglx@linutronix.de, paulmck@linux.vnet.ibm.com, hpa@zytor.com, mingo@kernel.org, peterz@infradead.org, lenb@kernel.org, bigeasy@linutronix.de, linux-kernel@vger.kernel.org, rostedt@goodmis.org Reply-To: paulmck@linux.vnet.ibm.com, tglx@linutronix.de, rafael.j.wysocki@intel.com, mingo@kernel.org, hpa@zytor.com, peterz@infradead.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, bigeasy@linutronix.de, lenb@kernel.org In-Reply-To: <20170524081548.851588594@linutronix.de> References: <20170524081548.851588594@linutronix.de> To: linux-tip-commits@vger.kernel.org Subject: [tip:smp/hotplug] ACPI/processor: Use cpu_hotplug_disable() instead of get_online_cpus() Git-Commit-ID: fdaf0a51bad496289356d11d796095a293794b5f X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: fdaf0a51bad496289356d11d796095a293794b5f Gitweb: http://git.kernel.org/tip/fdaf0a51bad496289356d11d796095a293794b5f Author: Thomas Gleixner AuthorDate: Wed, 24 May 2017 10:15:33 +0200 Committer: Thomas Gleixner CommitDate: Fri, 26 May 2017 10:10:44 +0200 ACPI/processor: Use cpu_hotplug_disable() instead of get_online_cpus() Converting the hotplug locking, i.e. get_online_cpus(), to a percpu rwsem unearthed a circular lock dependency which was hidden from lockdep due to the lockdep annotation of get_online_cpus() which prevents lockdep from creating full dependency chains. CPU0 CPU1 ---- ---- lock((&wfc.work)); lock(cpu_hotplug_lock.rw_sem); lock((&wfc.work)); lock(cpu_hotplug_lock.rw_sem); This dependency is established via acpi_processor_start() which calls into the work queue code. And the work queue code establishes the reverse dependency. This is not a problem of get_online_cpus() recursion, it's a possible deadlock undetected by lockdep so far. The cure is to use cpu_hotplug_disable() instead of get_online_cpus() to protect the probing from acpi_processor_start(). There is a side effect to this: cpu_hotplug_disable() makes a concurrent cpu hotplug attempt via the sysfs interfaces fail with -EBUSY, but that probing usually happens during the boot process where no interaction is possible. Any later invocations are infrequent enough and concurrent hotplug attempts are so unlikely that the danger of user space visible regressions is very close to zero. Anyway, thats preferrable over a real deadlock. Signed-off-by: Thomas Gleixner Acked-by: Ingo Molnar Acked-by: Rafael J. Wysocki Cc: Paul E. McKenney Cc: Peter Zijlstra Cc: Sebastian Siewior Cc: Steven Rostedt Cc: linux-acpi@vger.kernel.org Cc: Len Brown Link: http://lkml.kernel.org/r/20170524081548.851588594@linutronix.de --- drivers/acpi/processor_driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 8697a82..591d1dd 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -268,9 +268,9 @@ static int acpi_processor_start(struct device *dev) return -ENODEV; /* Protect against concurrent CPU hotplug operations */ - get_online_cpus(); + cpu_hotplug_disable(); ret = __acpi_processor_start(device); - put_online_cpus(); + cpu_hotplug_enable(); return ret; }