From: Don Zickus <dzickus@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Vivek Goyal <vgoyal@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
Ingo Molnar <mingo@elte.hu>,
Jason Wessel <jason.wessel@windriver.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Haren Myneni <hbabu@us.ibm.com>
Subject: Re: perf hw in kexeced kernel broken in tip
Date: Wed, 8 Dec 2010 17:37:46 -0500 [thread overview]
Message-ID: <20101208223746.GR21786@redhat.com> (raw)
In-Reply-To: <1291820356.28378.83.camel@laptop>
On Wed, Dec 08, 2010 at 03:59:16PM +0100, Peter Zijlstra wrote:
> On Wed, 2010-12-08 at 15:20 +0100, Peter Zijlstra wrote:
>
> > > I wonder if you should reverse these checks. If the bios has the perf
> > > counter enabled, there might be a high chance that it fails the first
> > > check and never gets to the actually bios checks.
> >
> > Ah, good point.
>
> Something like so..
This seems to work correctly on my Nehalem and broken bios machines during
boot and kexec. As expected it fails during kdump. My p4 box failed
during kexec for some reason. But p4 has other issues.
Cheers,
Don
>
> ---
> Subject: perf, x86: Detect broken BIOSes
> From: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Date: Wed Dec 08 15:56:23 CET 2010
>
> Some BIOSes use PMU resources, this is a bug.
>
> Try to detect this, warn about it, and further refuse to touch the
> PMU ourselves.
>
> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
> ---
> Index: linux-2.6/arch/x86/kernel/cpu/perf_event.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/cpu/perf_event.c
> +++ linux-2.6/arch/x86/kernel/cpu/perf_event.c
> @@ -375,15 +375,51 @@ static void release_pmc_hardware(void) {
> static bool check_hw_exists(void)
> {
> u64 val, val_new = 0;
> - int ret = 0;
> + int i, reg, ret = 0;
>
> + /*
> + * Check to see if the BIOS enabled any of the counters, if so
> + * complain and bail.
> + */
> + for (i = 0; i < x86_pmu.num_counters; i++) {
> + reg = x86_pmu.eventsel + i;
> + ret = rdmsrl_safe(reg, &val);
> + if (ret)
> + goto msr_fail;
> + if (val & ARCH_PERFMON_EVENTSEL_ENABLE)
> + goto bios_fail;
> + }
> +
> + for (i = 0; i < x86_pmu.num_counters_fixed; i++) {
> + reg = MSR_ARCH_PERFMON_FIXED_CTR_CTRL;
> + ret = rdmsrl_safe(reg, &val);
> + if (ret)
> + goto msr_fail;
> + if (val & (0x03 << i*4))
> + goto bios_fail;
> + }
> +
> + /*
> + * Now write a value and read it back to see if it matches,
> + * this is needed to detect certain hardware emulators (qemu/kvm)
> + * that don't trap on the MSR access and always return 0s.
> + */
> val = 0xabcdUL;
> - ret |= checking_wrmsrl(x86_pmu.perfctr, val);
> + ret = checking_wrmsrl(x86_pmu.perfctr, val);
> ret |= rdmsrl_safe(x86_pmu.perfctr, &val_new);
> if (ret || val != val_new)
> - return false;
> + goto msr_fail;
>
> return true;
> +
> +bios_fail:
> + printk(KERN_CONT "Broken BIOS detected, software events only.\n");
> + printk(KERN_ERR FW_BUG "invalid MSR: %x=%Lx\n", reg, val);
> + return false;
> +
> +msr_fail:
> + printk(KERN_CONT "Broken PMU hardware detected, software events only.\n");
> + return false;
> }
>
> static void reserve_ds_buffers(void);
> @@ -1378,10 +1414,8 @@ int __init init_hw_perf_events(void)
> pmu_check_apic();
>
> /* sanity check that the hardware exists or is emulated */
> - if (!check_hw_exists()) {
> - pr_cont("Broken PMU hardware detected, software events only.\n");
> + if (!check_hw_exists())
> return 0;
> - }
>
> pr_cont("%s PMU driver.\n", x86_pmu.name);
>
>
next prev parent reply other threads:[~2010-12-08 22:38 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-01 8:00 perf hw in kexeced kernel broken in tip Yinghai Lu
2010-12-01 11:27 ` Peter Zijlstra
2010-12-01 16:06 ` Vivek Goyal
2010-12-01 16:11 ` Peter Zijlstra
2010-12-01 16:23 ` Vivek Goyal
2010-12-01 19:38 ` Peter Zijlstra
2010-12-01 19:46 ` Vivek Goyal
2010-12-01 19:49 ` Peter Zijlstra
2010-12-01 19:58 ` Vivek Goyal
2010-12-01 20:07 ` Peter Zijlstra
2010-12-01 21:48 ` Eric W. Biederman
2010-12-02 5:23 ` Don Zickus
2010-12-02 7:34 ` Peter Zijlstra
2010-12-02 16:15 ` Don Zickus
2010-12-07 23:30 ` Peter Zijlstra
2010-12-08 14:01 ` Don Zickus
2010-12-08 14:20 ` Peter Zijlstra
2010-12-08 14:42 ` Vivek Goyal
2010-12-08 14:48 ` Peter Zijlstra
2010-12-08 15:02 ` Vivek Goyal
2010-12-08 15:15 ` Peter Zijlstra
2010-12-08 15:22 ` Vivek Goyal
2010-12-08 21:16 ` Eric W. Biederman
2010-12-08 14:59 ` Peter Zijlstra
2010-12-08 18:43 ` Yinghai Lu
2010-12-08 19:01 ` Don Zickus
2010-12-08 19:05 ` Yinghai Lu
2010-12-08 19:17 ` Peter Zijlstra
2010-12-08 19:20 ` Yinghai Lu
2010-12-08 19:06 ` Peter Zijlstra
2010-12-08 19:20 ` Yinghai Lu
2010-12-08 22:37 ` Don Zickus [this message]
2010-12-08 23:20 ` Eric W. Biederman
2010-12-09 4:34 ` Don Zickus
2010-12-09 20:20 ` Don Zickus
2010-12-09 20:44 ` Cyrill Gorcunov
2010-12-08 14:33 ` Peter Zijlstra
2010-12-08 14:39 ` Vivek Goyal
2010-12-07 21:16 ` Don Zickus
2010-12-08 0:26 ` Yinghai Lu
2010-12-08 10:39 ` Peter Zijlstra
2010-12-01 20:41 ` Eric W. Biederman
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=20101208223746.GR21786@redhat.com \
--to=dzickus@redhat.com \
--cc=ebiederm@xmission.com \
--cc=hbabu@us.ibm.com \
--cc=jason.wessel@windriver.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=vgoyal@redhat.com \
--cc=yinghai@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.