From: Lan Tianyu <tianyu.lan@intel.com>
To: Tejun Heo <tj@kernel.org>, Oleg Nesterov <oleg@redhat.com>,
Jiri Olsa <jolsa@redhat.com>
Cc: Zhang Rui <rui.zhang@intel.com>,
linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: Re: WARNING at kernel/workqueue.c:829 wq_worker_waking_up+0x53/0x70()
Date: Thu, 20 Feb 2014 21:28:26 +0800 [thread overview]
Message-ID: <530602FA.1020103@intel.com> (raw)
In-Reply-To: <20140218224907.GG31892@mtj.dyndns.org>
[-- Attachment #1: Type: text/plain, Size: 4096 bytes --]
On 02/19/2014 06:49 AM, Tejun Heo wrote:
> Hello,
>
> On Mon, Feb 17, 2014 at 06:19:00PM +0100, Oleg Nesterov wrote:
>> acpi_processor_set_throttling() plays with set_cpus_allowed_ptr(current),
>> this is obviously wrong, and the worker is bound.
>
> Umm... yeah, anything running on workqueues shouldn't be diddling with
> cpu affinity. The function even has /* FIXME: use work_on_cpu() */ in
> it. I suppose it's about time to actually implement that?
>
> Thanks.
>
Hi Jiri:
Could you try this patch which reworks ACPI processor throttling with
work_on_cpu()?
diff --git a/drivers/acpi/processor_throttling.c
b/drivers/acpi/processor_throttling.c
index 28baa05..9122d64 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -1060,6 +1060,23 @@ static int
acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
return 0;
}
+struct acpi_processor_throttling_arg {
+ struct acpi_processor *pr;
+ int target_state;
+ bool force;
+};
+
+static long acpi_processor_throttling_fn(void *data)
+{
+ struct acpi_processor_throttling_arg *arg = data;
+ struct acpi_processor *pr = arg->pr;
+ struct acpi_processor_throttling *p_throttling = &pr->throttling;
+
+ return p_throttling->acpi_processor_set_throttling(pr,
+ arg->target_state, arg->force);
+}
+
+
int acpi_processor_set_throttling(struct acpi_processor *pr,
int state, bool force)
{
@@ -1068,7 +1085,8 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
unsigned int i;
struct acpi_processor *match_pr;
struct acpi_processor_throttling *p_throttling;
- struct throttling_tstate t_state;
+ struct acpi_processor_throttling_arg arg;
+ struct throttling_tstate t_state;
cpumask_var_t online_throttling_cpus;
if (!pr)
@@ -1083,10 +1101,8 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL))
return -ENOMEM;
- if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) {
- free_cpumask_var(saved_mask);
+ if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL))
return -ENOMEM;
- }
if (cpu_is_offline(pr->id)) {
/*
@@ -1096,7 +1112,6 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
return -ENODEV;
}
- cpumask_copy(saved_mask, ¤t->cpus_allowed);
t_state.target_state = state;
p_throttling = &(pr->throttling);
cpumask_and(online_throttling_cpus, cpu_online_mask,
@@ -1118,14 +1133,10 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
* it can be called only for the cpu pointed by pr.
*/
if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) {
- /* FIXME: use work_on_cpu() */
- if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) {
- /* Can't migrate to the pr->id CPU. Exit */
- ret = -ENODEV;
- goto exit;
- }
- ret = p_throttling->acpi_processor_set_throttling(pr,
- t_state.target_state, force);
+ arg.pr = pr;
+ arg.target_state = state;
+ arg.force = force;
+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg);
} else {
/*
* When the T-state coordination is SW_ALL or HW_ALL,
@@ -1153,13 +1164,11 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
"on CPU %d\n", i));
continue;
}
- t_state.cpu = i;
- /* FIXME: use work_on_cpu() */
- if (set_cpus_allowed_ptr(current, cpumask_of(i)))
- continue;
- ret = match_pr->throttling.
- acpi_processor_set_throttling(
- match_pr, t_state.target_state, force);
+
+ arg.pr = match_pr;
+ arg.target_state = state;
+ arg.force = force;
+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg);
}
}
/*
@@ -1173,12 +1182,8 @@ int acpi_processor_set_throttling(struct
acpi_processor *pr,
acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE,
&t_state);
}
- /* restore the previous state */
- /* FIXME: use work_on_cpu() */
- set_cpus_allowed_ptr(current, saved_mask);
-exit:
+
free_cpumask_var(online_throttling_cpus);
- free_cpumask_var(saved_mask);
return ret;
}
--
Best Regards
Tianyu Lan
[-- Attachment #2: pt.patch --]
[-- Type: text/x-patch, Size: 3458 bytes --]
diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
index 28baa05..9122d64 100644
--- a/drivers/acpi/processor_throttling.c
+++ b/drivers/acpi/processor_throttling.c
@@ -1060,6 +1060,23 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
return 0;
}
+struct acpi_processor_throttling_arg {
+ struct acpi_processor *pr;
+ int target_state;
+ bool force;
+};
+
+static long acpi_processor_throttling_fn(void *data)
+{
+ struct acpi_processor_throttling_arg *arg = data;
+ struct acpi_processor *pr = arg->pr;
+ struct acpi_processor_throttling *p_throttling = &pr->throttling;
+
+ return p_throttling->acpi_processor_set_throttling(pr,
+ arg->target_state, arg->force);
+}
+
+
int acpi_processor_set_throttling(struct acpi_processor *pr,
int state, bool force)
{
@@ -1068,7 +1085,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
unsigned int i;
struct acpi_processor *match_pr;
struct acpi_processor_throttling *p_throttling;
- struct throttling_tstate t_state;
+ struct acpi_processor_throttling_arg arg;
+ struct throttling_tstate t_state;
cpumask_var_t online_throttling_cpus;
if (!pr)
@@ -1083,10 +1101,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
if (!alloc_cpumask_var(&saved_mask, GFP_KERNEL))
return -ENOMEM;
- if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL)) {
- free_cpumask_var(saved_mask);
+ if (!alloc_cpumask_var(&online_throttling_cpus, GFP_KERNEL))
return -ENOMEM;
- }
if (cpu_is_offline(pr->id)) {
/*
@@ -1096,7 +1112,6 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
return -ENODEV;
}
- cpumask_copy(saved_mask, ¤t->cpus_allowed);
t_state.target_state = state;
p_throttling = &(pr->throttling);
cpumask_and(online_throttling_cpus, cpu_online_mask,
@@ -1118,14 +1133,10 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
* it can be called only for the cpu pointed by pr.
*/
if (p_throttling->shared_type == DOMAIN_COORD_TYPE_SW_ANY) {
- /* FIXME: use work_on_cpu() */
- if (set_cpus_allowed_ptr(current, cpumask_of(pr->id))) {
- /* Can't migrate to the pr->id CPU. Exit */
- ret = -ENODEV;
- goto exit;
- }
- ret = p_throttling->acpi_processor_set_throttling(pr,
- t_state.target_state, force);
+ arg.pr = pr;
+ arg.target_state = state;
+ arg.force = force;
+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg);
} else {
/*
* When the T-state coordination is SW_ALL or HW_ALL,
@@ -1153,13 +1164,11 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
"on CPU %d\n", i));
continue;
}
- t_state.cpu = i;
- /* FIXME: use work_on_cpu() */
- if (set_cpus_allowed_ptr(current, cpumask_of(i)))
- continue;
- ret = match_pr->throttling.
- acpi_processor_set_throttling(
- match_pr, t_state.target_state, force);
+
+ arg.pr = match_pr;
+ arg.target_state = state;
+ arg.force = force;
+ ret = work_on_cpu(pr->id, acpi_processor_throttling_fn, &arg);
}
}
/*
@@ -1173,12 +1182,8 @@ int acpi_processor_set_throttling(struct acpi_processor *pr,
acpi_processor_throttling_notifier(THROTTLING_POSTCHANGE,
&t_state);
}
- /* restore the previous state */
- /* FIXME: use work_on_cpu() */
- set_cpus_allowed_ptr(current, saved_mask);
-exit:
+
free_cpumask_var(online_throttling_cpus);
- free_cpumask_var(saved_mask);
return ret;
}
next prev parent reply other threads:[~2014-02-20 13:28 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20140213124059.GA2908@krava.brq.redhat.com>
2014-02-17 17:19 ` WARNING at kernel/workqueue.c:829 wq_worker_waking_up+0x53/0x70() Oleg Nesterov
2014-02-18 22:49 ` Tejun Heo
2014-02-20 13:28 ` Lan Tianyu [this message]
2014-02-20 14:31 ` Jiri Olsa
2014-02-20 14:45 ` Lan Tianyu
2014-02-20 14:53 ` Jiri Olsa
2014-02-20 15:13 ` Oleg Nesterov
2014-02-20 15:17 ` Oleg Nesterov
2014-02-21 2:34 ` Lan Tianyu
2014-02-21 5:35 ` [PATCH] ACPI/Processor: Rework processor throttling with work_on_cpu() Lan Tianyu
2014-02-21 10:06 ` Jiri Olsa
2014-02-21 17:07 ` Jiri Olsa
2014-02-24 9:27 ` Lan Tianyu
2014-02-26 1:23 ` Rafael J. Wysocki
2014-02-26 1:08 ` Lan Tianyu
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=530602FA.1020103@intel.com \
--to=tianyu.lan@intel.com \
--cc=jolsa@redhat.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=rui.zhang@intel.com \
--cc=tj@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).