aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch')
-rw-r--r--recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch b/recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch
new file mode 100644
index 0000000000..d38d77a04e
--- /dev/null
+++ b/recipes/linux/linux-omap-2.6.37/linus/0053-arch-x86-oprofile-op_model_amd.c-Perform-initialisat.patch
@@ -0,0 +1,81 @@
+From c7c25802b39c443b3745cfa973dc49a97a3491f8 Mon Sep 17 00:00:00 2001
+From: Robert Richter <robert.richter@amd.com>
+Date: Mon, 3 Jan 2011 12:15:14 +0100
+Subject: [PATCH 53/66] arch/x86/oprofile/op_model_amd.c: Perform initialisation on a single CPU
+
+Disable preemption in init_ibs(). The function only checks the
+ibs capabilities and sets up pci devices (if necessary). It runs
+only on one cpu but operates with the local APIC and some MSRs,
+thus it is better to disable preemption.
+
+[ 7.034377] BUG: using smp_processor_id() in preemptible [00000000] code: modprobe/483
+[ 7.034385] caller is setup_APIC_eilvt+0x155/0x180
+[ 7.034389] Pid: 483, comm: modprobe Not tainted 2.6.37-rc1-20101110+ #1
+[ 7.034392] Call Trace:
+[ 7.034400] [<ffffffff812a2b72>] debug_smp_processor_id+0xd2/0xf0
+[ 7.034404] [<ffffffff8101e985>] setup_APIC_eilvt+0x155/0x180
+[ ... ]
+
+Addresses https://bugzilla.kernel.org/show_bug.cgi?id=22812
+
+Reported-by: <atswartz@gmail.com>
+Signed-off-by: Robert Richter <robert.richter@amd.com>
+Cc: oprofile-list@lists.sourceforge.net <oprofile-list@lists.sourceforge.net>
+Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Cc: Frederic Weisbecker <fweisbec@gmail.com>
+Cc: Rafael J. Wysocki <rjw@sisk.pl>
+Cc: Dan Carpenter <error27@gmail.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: <stable@kernel.org> [2.6.37.x]
+LKML-Reference: <20110103111514.GM4739@erda.amd.com>
+[ small cleanups ]
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+---
+ arch/x86/oprofile/op_model_amd.c | 24 ++++++++++++++++--------
+ 1 files changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
+index a011bcc..7d90d47 100644
+--- a/arch/x86/oprofile/op_model_amd.c
++++ b/arch/x86/oprofile/op_model_amd.c
+@@ -630,21 +630,29 @@ static int __init_ibs_nmi(void)
+ return 0;
+ }
+
+-/* initialize the APIC for the IBS interrupts if available */
++/*
++ * check and reserve APIC extended interrupt LVT offset for IBS if
++ * available
++ *
++ * init_ibs() preforms implicitly cpu-local operations, so pin this
++ * thread to its current CPU
++ */
++
+ static void init_ibs(void)
+ {
+- ibs_caps = get_ibs_caps();
++ preempt_disable();
+
++ ibs_caps = get_ibs_caps();
+ if (!ibs_caps)
+- return;
++ goto out;
+
+- if (__init_ibs_nmi()) {
++ if (__init_ibs_nmi() < 0)
+ ibs_caps = 0;
+- return;
+- }
++ else
++ printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n", ibs_caps);
+
+- printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n",
+- (unsigned)ibs_caps);
++out:
++ preempt_enable();
+ }
+
+ static int (*create_arch_files)(struct super_block *sb, struct dentry *root);
+--
+1.6.6.1
+