All of lore.kernel.org
 help / color / mirror / Atom feed
From: Len Brown <lenb@kernel.org>
To: linux-acpi@vger.kernel.org
Cc: "Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com>,
	Len Brown <len.brown@intel.com>
Subject: [PATCH 22/29] x86, acpi_cpufreq: Fix the NULL pointer dereference in get_measured_perf
Date: Thu, 23 Apr 2009 02:23:44 -0400	[thread overview]
Message-ID: <093f13e23137b9e5f7629dd5932ceea1419e2b61.1240467665.git.len.brown@intel.com> (raw)
In-Reply-To: <1240467831-32613-1-git-send-email-lenb@kernel.org>
In-Reply-To: <50a4da890102a455e5cd3dd358c38650d07178d3.1240467664.git.len.brown@intel.com>

From: Pallipadi, Venkatesh <venkatesh.pallipadi@intel.com>

Fix for a regression that was introduced by earlier commit
18b2646fe3babeb40b34a0c1751e0bf5adfdc64c on Mon Apr 6 11:26:08 2009

Regression resulted in the below error happened on systems with
software coordination where per_cpu acpi data will not be initiated for
secondary CPUs in a P-state domain.

On Tue, 2009-04-14 at 23:01 -0700, Zhang, Yanmin wrote:
 My machine hanged with kernel 2.6.30-rc2 when script read
> /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor.
>
> opps happens in get_measured_perf:
>
>         cur.aperf.whole = readin.aperf.whole -
>                                 per_cpu(drv_data, cpu)->saved_aperf;
>
> Because per_cpu(drv_data, cpu)=NULL.
>
> So function get_measured_perf should check if (per_cpu(drv_data,
> cpu)==NULL)
> and return 0 if it's NULL.

--------------sys log------------------

BUG: unable to handle kernel NULL pointer dereference at
0000000000000020
IP: [<ffffffff8021af75>] get_measured_perf+0x4a/0xf9
PGD a7dd88067 PUD a7ccf5067 PMD 0
Oops: 0000 [#1] SMP
last sysfs file: /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
CPU 0
Modules linked in: video output
Pid: 2091, comm: kondemand/0 Not tainted 2.6.30-rc2 #1 MP Server
RIP: 0010:[<ffffffff8021af75>]  [<ffffffff8021af75>]
get_measured_perf+0x4a/0xf9
RSP: 0018:ffff880a7d56de20  EFLAGS: 00010246
RAX: 0000000000000000 RBX: 00000046241a42b6 RCX: ffff88004d219000
RDX: 000000000000b660 RSI: 0000000000000020 RDI: 0000000000000001
RBP: ffff880a7f052000 R08: 00000046241a42b6 R09: ffffffff807639f0
R10: 00000000ffffffea R11: ffffffff802207f4 R12: ffff880a7f052000
R13: ffff88004d20e460 R14: 0000000000ddd5a6 R15: 0000000000000001
FS:  0000000000000000(0000) GS:ffff88004d200000(0000)
knlGS:0000000000000000
CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
CR2: 0000000000000020 CR3: 0000000a7f1bf000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process kondemand/0 (pid: 2091, threadinfo ffff880a7d56c000, task
ffff880a7d4d18c0)
Stack:
 ffff880a7f052078 ffffffff803efd54 00000046241a42b6 000000462ffa9e95
 0000000000000001 0000000000000001 00000000ffffffea ffffffff8064f41a
 0000000000000012 0000000000000012 ffff880a7f052000 ffffffff80650547
Call Trace:
 [<ffffffff803efd54>] ? kobject_get+0x12/0x17
 [<ffffffff8064f41a>] ? __cpufreq_driver_getavg+0x42/0x57
 [<ffffffff80650547>] ? do_dbs_timer+0x147/0x272
 [<ffffffff80650400>] ? do_dbs_timer+0x0/0x272
 [<ffffffff802474ca>] ? worker_thread+0x15b/0x1f5
 [<ffffffff8024a02c>] ? autoremove_wake_function+0x0/0x2e
 [<ffffffff8024736f>] ? worker_thread+0x0/0x1f5
 [<ffffffff80249f0d>] ? kthread+0x54/0x83
 [<ffffffff8020c87a>] ? child_rip+0xa/0x20
 [<ffffffff80249eb9>] ? kthread+0x0/0x83
 [<ffffffff8020c870>] ? child_rip+0x0/0x20
Code: 99 a6 03 00 31 c9 85 c0 0f 85 c3 00 00 00 89 df 4c 8b 44 24 10 48
c7 c2 60 b6 00 00 48 8b 0c fd e0 30 a5 80 4c 89 c3 48 8b 04 0a <48> 2b
58 20 48 8b 44 24 18 48 89 1c 24 48 8b 34 0a 48 2b 46 28
RIP  [<ffffffff8021af75>] get_measured_perf+0x4a/0xf9
 RSP <ffff880a7d56de20>
CR2: 0000000000000020
---[ end trace 2b8fac9a49e19ad4 ]---

Tested-by: "Zhang, Yanmin" <yanmin_zhang@linux.intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
---
 arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index ecdb682..dd0bd76 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -68,11 +68,16 @@ struct acpi_cpufreq_data {
 	unsigned int max_freq;
 	unsigned int resume;
 	unsigned int cpu_feature;
-	u64 saved_aperf, saved_mperf;
 };
 
 static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
 
+struct acpi_msr_data {
+	u64 saved_aperf, saved_mperf;
+};
+
+static DEFINE_PER_CPU(struct acpi_msr_data, msr_data);
+
 DEFINE_TRACE(power_mark);
 
 /* acpi_perf_data is a pointer to percpu data. */
@@ -287,11 +292,11 @@ static unsigned int get_measured_perf(struct cpufreq_policy *policy,
 		return 0;
 
 	cur.aperf.whole = readin.aperf.whole -
-				per_cpu(drv_data, cpu)->saved_aperf;
+				per_cpu(msr_data, cpu).saved_aperf;
 	cur.mperf.whole = readin.mperf.whole -
-				per_cpu(drv_data, cpu)->saved_mperf;
-	per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole;
-	per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole;
+				per_cpu(msr_data, cpu).saved_mperf;
+	per_cpu(msr_data, cpu).saved_aperf = readin.aperf.whole;
+	per_cpu(msr_data, cpu).saved_mperf = readin.mperf.whole;
 
 #ifdef __i386__
 	/*
-- 
1.6.0.6


  parent reply	other threads:[~2009-04-23  6:24 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-23  6:23 ACPI patches queued for 2.6.30-rc3 Len Brown
2009-04-23  6:23 ` [PATCH 01/29] ACPI: button: whitespace changes Len Brown
2009-04-23  6:23   ` [PATCH 02/29] ACPI: button: remove unnecessary null pointer checks Len Brown
2009-04-23  6:23   ` [PATCH 03/29] ACPI: button: use Linux style for getting driver_data Len Brown
2009-04-23  6:23   ` [PATCH 04/29] ACPI: button: cache hid/name/class pointers Len Brown
2009-04-23  6:23   ` [PATCH 05/29] ACPI: button: remove button->device pointer Len Brown
2009-04-23  6:23   ` [PATCH 06/29] ACPI: button: remove control method/fixed hardware distinctions Len Brown
2009-04-23  6:23   ` [PATCH 07/29] ACPI: Revert conflicting workaround for BIOS w/ mangled PRT entries Len Brown
2009-04-23  6:23   ` [PATCH 08/29] ACPI video: handle indexed _BQC correctly Len Brown
2009-04-23  6:23   ` [PATCH 09/29] ACPI: Disable _GTS and _BFS support by default Len Brown
2009-04-23  6:23   ` [PATCH 10/29] thermal: Fix polling frequency for systems without passive cooling Len Brown
2009-04-23  6:23   ` [PATCH 11/29] sony-laptop: Duplicate SNC 127 Event Fix Len Brown
2009-04-23  6:23   ` [PATCH 12/29] sony-laptop: SNC 127 Initialization Fix Len Brown
2009-04-23  6:23   ` [PATCH 13/29] sony-laptop: SNC input event 38 fix Len Brown
2009-04-23  6:23   ` [PATCH 14/29] ec.c: Fix ACPI EC resume non-query interrupt message Len Brown
2009-04-23  6:23   ` [PATCH 15/29] sony-laptop: fix bogus error message display on resume Len Brown
2009-04-23  6:23   ` [PATCH 16/29] sony-laptop: always try to unblock rfkill on load Len Brown
2009-04-23  6:23   ` [PATCH 17/29] thinkpad-acpi: silence hotkey enable warning for module parameter Len Brown
2009-04-23  6:23   ` [PATCH 18/29] thinkpad-acpi: fix LED blinking through timer trigger Len Brown
2009-04-23  6:23   ` [PATCH 19/29] thinkpad-acpi: fix use of MODULE_AUTHOR Len Brown
2009-04-23  6:23   ` [PATCH 20/29] thinkpad-acpi: simplify module autoloading Len Brown
2009-04-23  6:23   ` [PATCH 21/29] thinkpad-acpi: bump up version to 0.23 Len Brown
2009-04-23  6:23   ` Len Brown [this message]
2009-04-23  6:23   ` [PATCH 23/29] acpi-cpufreq: Cleanup: Use printk_once Len Brown
2009-04-23  6:23   ` [PATCH 24/29] acpi-cpufreq: style-only: add parens to math expression Len Brown
2009-04-23  6:23   ` [PATCH 25/29] acpi-cpufreq: Do not let get_measured perf depend on internal variable Len Brown
2009-04-23  6:23   ` [PATCH 26/29] ACPI video: fix an error when the brightness levels on AC and on Battery are same Len Brown
2009-04-23  6:23   ` [PATCH 27/29] ACPI: add /sys/firmware/acpi/interrupts/sci_not counter Len Brown
2009-04-23  6:23   ` [PATCH 28/29] ACPI: idle: mark_tsc_unstable() at init-time, not run-time Len Brown
2009-04-23  6:23   ` [PATCH 29/29] ACPI: delete obsolete "bus master activity" proc field Len Brown

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=093f13e23137b9e5f7629dd5932ceea1419e2b61.1240467665.git.len.brown@intel.com \
    --to=lenb@kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=venkatesh.pallipadi@intel.com \
    /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.