Re: [PATCH] perf/x86: check ucode before disabling PEBS on SandyBridge

Peter Zijlstra
2012-06-07T10:18:54Z

On Thu, 2012-06-07 at 09:15 +0200, Stephane Eranian wrote:
> +static int check_pebs_quirks(void)
> +{
> + int uversion = cpu_data(smp_processor_id()).microcode;
> + int model = cpu_data(smp_processor_id()).x86_model;
> +
> + /* do not have PEBS to begin with */
> + if (!x86_pmu.pebs)
> + return 0;
> +
> + /*
> + * check ucode version for SNB, SNB-EP
> + */
> + if ((model == 42 || model == 45) && uversion < 0x28) {
> + pr_warn("SandyBridge PEBS unavailable due to CPU erratum, "
> + " update microcode (was 0x%x, needs at least 0x28).\n",
> + uversion);
> + return -ENOTSUPP;
> + }
> + return 0;
> +}
> +
> static int intel_pmu_hw_config(struct perf_event *event)
> {
> int ret = x86_pmu_hw_config(event);
> @@ -1401,8 +1422,14 @@ static int intel_pmu_hw_config(struct perf_event *event)
> if (ret)
> return ret;
>
> - if (event->attr.precise_ip && x86_pmu.pebs_aliases)
> - x86_pmu.pebs_aliases(event);
> + if (event->attr.precise_ip) {
> +
> + if (check_pebs_quirks())
> + return -ENOTSUPP;

This will only warn about the PEBS issue once you try and use a PEBS
counter. Shouldn't we do this on boot? IOW. put check_pebs_quirks()
inside the existing quirk code instead of here?

> +
> + if (x86_pmu.pebs_aliases)
> + x86_pmu.pebs_aliases(event);
> + }
>
> if (intel_pmu_needs_lbr_smpl(event)) {
> ret = intel_pmu_setup_lbr_filter(event);
> @@ -1714,13 +1741,6 @@ static __init void intel_clovertown_quirk(void)
> x86_pmu.pebs_constraints = NULL;
> }