All of lore.kernel.org
 help / color / mirror / Atom feed
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


  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: 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.