From: Len Brown <lenb@kernel.org> To: linux-acpi@vger.kernel.org, linux-pm@lists.linux-foundation.org Cc: Len Brown <len.brown@intel.com>, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Stuart Hayes <Stuart_Hayes@Dell.com> Subject: [PATCH 8/8] acpi_pad: fix power_saving thread deadlock Date: Sat, 30 Jun 2012 01:07:35 -0400 [thread overview] Message-ID: <5f1601261050251a5ca293378b492a69d590dacb.1341032550.git.len.brown@intel.com> (raw) In-Reply-To: <1341032855-27139-1-git-send-email-lenb@kernel.org> In-Reply-To: <9f132652d94c96476b0b0a8caf0c10e96ab10fa8.1341032550.git.len.brown@intel.com> From: Stuart Hayes <Stuart_Hayes@Dell.com> The acpi_pad driver can get stuck in destroy_power_saving_task() waiting for kthread_stop() to stop a power_saving thread. The problem is that the isolated_cpus_lock mutex is owned when destroy_power_saving_task() calls kthread_stop(), which waits for a power_saving thread to end, and the power_saving thread tries to acquire the isolated_cpus_lock when it calls round_robin_cpu(). This patch fixes the issue by making round_robin_cpu() use its own mutex. https://bugzilla.kernel.org/show_bug.cgi?id=42981 Cc: stable@vger.kernel.org Signed-off-by: Stuart Hayes <Stuart_Hayes@Dell.com> Signed-off-by: Len Brown <len.brown@intel.com> --- drivers/acpi/acpi_pad.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c index a43fa1a..1502c502 100644 --- a/drivers/acpi/acpi_pad.c +++ b/drivers/acpi/acpi_pad.c @@ -36,6 +36,7 @@ #define ACPI_PROCESSOR_AGGREGATOR_DEVICE_NAME "Processor Aggregator" #define ACPI_PROCESSOR_AGGREGATOR_NOTIFY 0x80 static DEFINE_MUTEX(isolated_cpus_lock); +static DEFINE_MUTEX(round_robin_lock); static unsigned long power_saving_mwait_eax; @@ -107,7 +108,7 @@ static void round_robin_cpu(unsigned int tsk_index) if (!alloc_cpumask_var(&tmp, GFP_KERNEL)) return; - mutex_lock(&isolated_cpus_lock); + mutex_lock(&round_robin_lock); cpumask_clear(tmp); for_each_cpu(cpu, pad_busy_cpus) cpumask_or(tmp, tmp, topology_thread_cpumask(cpu)); @@ -116,7 +117,7 @@ static void round_robin_cpu(unsigned int tsk_index) if (cpumask_empty(tmp)) cpumask_andnot(tmp, cpu_online_mask, pad_busy_cpus); if (cpumask_empty(tmp)) { - mutex_unlock(&isolated_cpus_lock); + mutex_unlock(&round_robin_lock); return; } for_each_cpu(cpu, tmp) { @@ -131,7 +132,7 @@ static void round_robin_cpu(unsigned int tsk_index) tsk_in_cpu[tsk_index] = preferred_cpu; cpumask_set_cpu(preferred_cpu, pad_busy_cpus); cpu_weight[preferred_cpu]++; - mutex_unlock(&isolated_cpus_lock); + mutex_unlock(&round_robin_lock); set_cpus_allowed_ptr(current, cpumask_of(preferred_cpu)); } -- 1.7.11.1.104.ge7b44f1
WARNING: multiple messages have this Message-ID (diff)
From: Len Brown <lenb@kernel.org> To: linux-acpi@vger.kernel.org, linux-pm@lists.linux-foundation.org Cc: linux-kernel@vger.kernel.org, Stuart Hayes <Stuart_Hayes@Dell.com>, stable@vger.kernel.org, Len Brown <len.brown@intel.com> Subject: [PATCH 8/8] acpi_pad: fix power_saving thread deadlock Date: Sat, 30 Jun 2012 01:07:35 -0400 [thread overview] Message-ID: <5f1601261050251a5ca293378b492a69d590dacb.1341032550.git.len.brown@intel.com> (raw) In-Reply-To: <1341032855-27139-1-git-send-email-lenb@kernel.org> In-Reply-To: <9f132652d94c96476b0b0a8caf0c10e96ab10fa8.1341032550.git.len.brown@intel.com> From: Stuart Hayes <Stuart_Hayes@Dell.com> The acpi_pad driver can get stuck in destroy_power_saving_task() waiting for kthread_stop() to stop a power_saving thread. The problem is that the isolated_cpus_lock mutex is owned when destroy_power_saving_task() calls kthread_stop(), which waits for a power_saving thread to end, and the power_saving thread tries to acquire the isolated_cpus_lock when it calls round_robin_cpu(). This patch fixes the issue by making round_robin_cpu() use its own mutex. https://bugzilla.kernel.org/show_bug.cgi?id=42981 Cc: stable@vger.kernel.org Signed-off-by: Stuart Hayes <Stuart_Hayes@Dell.com> Signed-off-by: Len Brown <len.brown@intel.com> --- drivers/acpi/acpi_pad.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c index a43fa1a..1502c502 100644 --- a/drivers/acpi/acpi_pad.c +++ b/drivers/acpi/acpi_pad.c @@ -36,6 +36,7 @@ #define ACPI_PROCESSOR_AGGREGATOR_DEVICE_NAME "Processor Aggregator" #define ACPI_PROCESSOR_AGGREGATOR_NOTIFY 0x80 static DEFINE_MUTEX(isolated_cpus_lock); +static DEFINE_MUTEX(round_robin_lock); static unsigned long power_saving_mwait_eax; @@ -107,7 +108,7 @@ static void round_robin_cpu(unsigned int tsk_index) if (!alloc_cpumask_var(&tmp, GFP_KERNEL)) return; - mutex_lock(&isolated_cpus_lock); + mutex_lock(&round_robin_lock); cpumask_clear(tmp); for_each_cpu(cpu, pad_busy_cpus) cpumask_or(tmp, tmp, topology_thread_cpumask(cpu)); @@ -116,7 +117,7 @@ static void round_robin_cpu(unsigned int tsk_index) if (cpumask_empty(tmp)) cpumask_andnot(tmp, cpu_online_mask, pad_busy_cpus); if (cpumask_empty(tmp)) { - mutex_unlock(&isolated_cpus_lock); + mutex_unlock(&round_robin_lock); return; } for_each_cpu(cpu, tmp) { @@ -131,7 +132,7 @@ static void round_robin_cpu(unsigned int tsk_index) tsk_in_cpu[tsk_index] = preferred_cpu; cpumask_set_cpu(preferred_cpu, pad_busy_cpus); cpu_weight[preferred_cpu]++; - mutex_unlock(&isolated_cpus_lock); + mutex_unlock(&round_robin_lock); set_cpus_allowed_ptr(current, cpumask_of(preferred_cpu)); } -- 1.7.11.1.104.ge7b44f1
next prev parent reply other threads:[~2012-06-30 5:07 UTC|newest] Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-06-30 5:07 ACPI & Power Management Patches for Linux 3.5-rc4 Len Brown 2012-06-30 5:07 ` [PATCH 1/8] ACPI sysfs.c strlen fix Len Brown 2012-06-30 5:07 ` [PATCH 2/8] ACPI, x86: fix Dell M6600 ACPI reboot regression via DMI Len Brown 2012-06-30 5:07 ` Len Brown 2012-07-06 11:09 ` Ingo Molnar 2012-06-30 5:07 ` [PATCH 3/8] ACPI: Make acpi_skip_timer_override cover all source_irq==0 cases Len Brown 2012-06-30 5:07 ` Len Brown 2012-06-30 5:07 ` [PATCH 4/8] ACPI: Remove one board specific WARN when ignoring timer overriding Len Brown 2012-06-30 5:07 ` Len Brown 2012-06-30 5:07 ` [PATCH 5/8] ACPI: Add a quirk for "AMILO PRO V2030" to ignore the " Len Brown 2012-06-30 5:07 ` Len Brown 2012-06-30 5:07 ` [PATCH 6/8] ACPI, APEI, Avoid too much error reporting in runtime Len Brown 2012-06-30 5:07 ` Len Brown 2012-06-30 5:07 ` [PATCH 7/8] ACPI video: Still use ACPI backlight control if _DOS doesn't exist Len Brown 2012-06-30 5:07 ` Len Brown [this message] 2012-06-30 5:07 ` [PATCH 8/8] acpi_pad: fix power_saving thread deadlock Len Brown 2012-06-30 14:25 ` [PATCH 1/8] ACPI sysfs.c strlen fix Alan Stern 2012-06-30 14:25 ` [linux-pm] " Alan Stern 2012-07-27 1:39 ` [PATCH] ACPI: replace strlen("string") with sizeof("string") -1 Len Brown 2012-07-27 1:39 ` Len Brown 2012-07-30 14:26 ` Ian Campbell 2012-07-30 14:41 ` richard -rw- weinberger 2012-08-06 10:21 ` [linux-pm] " Pavel Machek 2012-08-06 14:36 ` Alan Stern 2012-08-06 14:36 ` [linux-pm] " Alan Stern 2012-08-06 16:00 ` Pavel Vasilyev 2012-08-06 16:28 ` Alan Stern 2012-08-06 16:28 ` [linux-pm] " Alan Stern 2012-08-06 18:47 ` Pavel Vasilyev 2012-08-06 19:59 ` Alan Stern 2012-08-06 19:59 ` [linux-pm] " Alan Stern 2012-08-06 22:57 ` Daniel Taylor 2012-08-06 22:57 ` Daniel Taylor 2012-08-07 13:19 ` Bernd Petrovitsch 2012-08-07 13:19 ` [linux-pm] " Bernd Petrovitsch 2012-08-08 0:59 ` Daniel Taylor 2012-08-08 0:59 ` Daniel Taylor 2012-08-07 1:07 ` Pavel Vasilyev 2012-08-07 1:07 ` Pavel Vasilyev 2012-08-07 17:24 ` Alan Stern 2012-08-07 17:24 ` [linux-pm] " Alan Stern 2012-08-07 23:23 ` Pavel Vasilyev 2012-08-08 1:27 ` Alan Stern 2012-08-08 1:27 ` Alan Stern 2012-08-06 10:26 ` Andreas Schwab
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=5f1601261050251a5ca293378b492a69d590dacb.1341032550.git.len.brown@intel.com \ --to=lenb@kernel.org \ --cc=Stuart_Hayes@Dell.com \ --cc=len.brown@intel.com \ --cc=linux-acpi@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@lists.linux-foundation.org \ --cc=stable@vger.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: linkBe 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.