diff options
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.patch | 81 |
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 + |