From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
x86@kernel.org, Peter Zijlstra <a.p.zijlstra@chello.nl>,
Joerg Roedel <joerg.roedel@amd.com>,
linux-kernel@vger.kernel.org
Subject: fix BUG: using smp_processor_id() in preemptible code (resend)
Date: Wed, 18 Aug 2010 12:11:58 +0300 [thread overview]
Message-ID: <20100818091157.GA5238@swordfish.minsk.epam.com> (raw)
Hello,
[ 100.666169] lockdep: fixing up alternatives.
[ 100.666183] SMP alternatives: switching to UP code
[ 106.942505] BUG: using smp_processor_id() in preemptible [00000000] code: bash/5165
[ 106.942541] caller is thermal_throttle_add_dev+0x20/0xa4
[ 106.942548] Pid: 5165, comm: bash Not tainted 2.6.36-rc1-dbg-git1-00187-g358afc9-dirty #132
[ 106.942553] Call Trace:
[ 106.942565] [<ffffffff811f6c01>] debug_smp_processor_id+0xc9/0xe4
[ 106.942571] [<ffffffff8136d377>] thermal_throttle_add_dev+0x20/0xa4
[ 106.942578] [<ffffffff8136d44d>] thermal_throttle_cpu_callback+0x52/0xb5
[ 106.942587] [<ffffffff810573f8>] notifier_call_chain+0x32/0x5e
[ 106.942595] [<ffffffff8103c840>] ? cpu_maps_update_begin+0x12/0x14
[ 106.942602] [<ffffffff81057443>] __raw_notifier_call_chain+0x9/0xb
[ 106.942609] [<ffffffff8103c703>] __cpu_notify+0x1b/0x2d
[ 106.942616] [<ffffffff8136f57d>] _cpu_up+0x6b/0xe9
[ 106.942622] [<ffffffff8136f645>] cpu_up+0x4a/0x57
[ 106.942629] [<ffffffff81363f77>] store_online+0x41/0x6e
[ 106.942637] [<ffffffff81291b4f>] sysdev_store+0x1b/0x1d
[ 106.942644] [<ffffffff81132186>] sysfs_write_file+0x103/0x13f
[ 106.942653] [<ffffffff810db026>] vfs_write+0xb0/0x14f
[ 106.942659] [<ffffffff810db2c2>] sys_write+0x45/0x6c
[ 106.942668] [<ffffffff81002002>] system_call_fastpath+0x16/0x1b
I have several solutions. Please kindly review.
The first one is:
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
index c2a8b26..1269661 100644
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
@@ -205,7 +205,9 @@ static int therm_throt_process(bool new_event, int event, int level)
static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev)
{
int err;
- struct cpuinfo_x86 *c = &cpu_data(smp_processor_id());
+ int cpu = get_cpu();
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
+ put_cpu();
err = sysfs_create_group(&sys_dev->kobj, &thermal_attr_group);
if (err)
Should we call smp_processor_id/get_cpu in thermal_throttle_add_dev?
We know the cpu when calling thermal_throttle_add_dev (in thermal_throttle_cpu_callback and
thermal_throttle_init_device) so we can pass the cpu number when calling it.
My second solution is:
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
index c2a8b26..bcd8499 100644
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
@@ -202,11 +202,12 @@ static int therm_throt_process(bool new_event, int event, int level)
#ifdef CONFIG_SYSFS
/* Add/Remove thermal_throttle interface for CPU device: */
-static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev)
+static __cpuinit int thermal_throttle_add_dev(struct sys_device *sys_dev,
+ unsigned int cpu)
{
int err;
- struct cpuinfo_x86 *c = &cpu_data(smp_processor_id());
-
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
+
err = sysfs_create_group(&sys_dev->kobj, &thermal_attr_group);
if (err)
return err;
@@ -251,7 +252,7 @@ thermal_throttle_cpu_callback(struct notifier_block *nfb,
case CPU_UP_PREPARE:
case CPU_UP_PREPARE_FROZEN:
mutex_lock(&therm_cpu_lock);
- err = thermal_throttle_add_dev(sys_dev);
+ err = thermal_throttle_add_dev(sys_dev, cpu);
mutex_unlock(&therm_cpu_lock);
WARN_ON(err);
break;
@@ -287,7 +288,7 @@ static __init int thermal_throttle_init_device(void)
#endif
/* connect live CPUs to sysfs */
for_each_online_cpu(cpu) {
- err = thermal_throttle_add_dev(get_cpu_sysdev(cpu));
+ err = thermal_throttle_add_dev(get_cpu_sysdev(cpu), cpu);
WARN_ON(err);
}
#ifdef CONFIG_HOTPLUG_CPU
next reply other threads:[~2010-08-18 9:12 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-18 9:11 Sergey Senozhatsky [this message]
2010-08-19 15:04 ` fix BUG: using smp_processor_id() in preemptible code (resend) Maciej Rutecki
2010-08-19 17:03 ` Roedel, Joerg
2010-08-19 21:46 ` H. Peter Anvin
2010-08-20 7:36 ` [PATCH] fix BUG using smp_processor_id() in preemptible thermal_throttle_add_dev Sergey Senozhatsky
2010-08-21 4:43 ` [tip:x86/urgent] x86, hwmon: Fix unsafe smp_processor_id() in thermal_throttle_add_dev tip-bot for Sergey Senozhatsky
2010-08-21 5:51 ` Fenghua Yu
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=20100818091157.GA5238@swordfish.minsk.epam.com \
--to=sergey.senozhatsky@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=hpa@zytor.com \
--cc=joerg.roedel@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@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.