From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/3] drivers/perf: arm_pmu: Defer the setting of __oprofile_cpu_pmu
Date: Tue, 31 May 2016 18:29:38 +0100 [thread overview]
Message-ID: <20160531172937.GG4254@leverpostej> (raw)
In-Reply-To: <20160531162834.GR24936@arm.com>
On Tue, May 31, 2016 at 05:28:34PM +0100, Will Deacon wrote:
> On Tue, May 31, 2016 at 12:41:22PM +0100, Julien Grall wrote:
> > The global variable __oprofile_cpu_pmu is set before the PMU is fully
> > initialized. If an error occurs before the end of the initialization,
> > the PMU will be freed and the variable will contain an invalid pointer.
> >
> > This will result in a kernel crash when perf will be used.
> >
> > Fix it by moving the setting of __oprofile_cpu_pmu when the PMU is fully
> > initialized (i.e when it is no longer possible to fail).
> >
> > Signed-off-by: Julien Grall <julien.grall@arm.com>
> > Acked-by: Mark Rutland <mark.rutland@arm.com>
> > ---
> > drivers/perf/arm_pmu.c | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
>
> Should this one go to -stable too?
I think so.
The bug has been there at least since 76b8a0e4c8bda5f0 ("ARM: perf:
handle armpmu_register failing"), in v3.8...
Prior to that we wouldn't free the PMU, but it might not have been
initialised correctly.
Thanks,
Mark.
> Will
>
> > diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
> > index 6401f0c..95614d2 100644
> > --- a/drivers/perf/arm_pmu.c
> > +++ b/drivers/perf/arm_pmu.c
> > @@ -992,9 +992,6 @@ int arm_pmu_device_probe(struct platform_device *pdev,
> >
> > armpmu_init(pmu);
> >
> > - if (!__oprofile_cpu_pmu)
> > - __oprofile_cpu_pmu = pmu;
> > -
> > pmu->plat_device = pdev;
> >
> > if (node && (of_id = of_match_node(of_table, pdev->dev.of_node))) {
> > @@ -1030,6 +1027,9 @@ int arm_pmu_device_probe(struct platform_device *pdev,
> > if (ret)
> > goto out_destroy;
> >
> > + if (!__oprofile_cpu_pmu)
> > + __oprofile_cpu_pmu = pmu;
> > +
> > pr_info("enabled with %s PMU driver, %d counters available\n",
> > pmu->name, pmu->num_events);
> >
> > --
> > 1.9.1
> >
>
WARNING: multiple messages have this Message-ID (diff)
From: Mark Rutland <mark.rutland@arm.com>
To: Will Deacon <will.deacon@arm.com>
Cc: Julien Grall <julien.grall@arm.com>,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 2/3] drivers/perf: arm_pmu: Defer the setting of __oprofile_cpu_pmu
Date: Tue, 31 May 2016 18:29:38 +0100 [thread overview]
Message-ID: <20160531172937.GG4254@leverpostej> (raw)
In-Reply-To: <20160531162834.GR24936@arm.com>
On Tue, May 31, 2016 at 05:28:34PM +0100, Will Deacon wrote:
> On Tue, May 31, 2016 at 12:41:22PM +0100, Julien Grall wrote:
> > The global variable __oprofile_cpu_pmu is set before the PMU is fully
> > initialized. If an error occurs before the end of the initialization,
> > the PMU will be freed and the variable will contain an invalid pointer.
> >
> > This will result in a kernel crash when perf will be used.
> >
> > Fix it by moving the setting of __oprofile_cpu_pmu when the PMU is fully
> > initialized (i.e when it is no longer possible to fail).
> >
> > Signed-off-by: Julien Grall <julien.grall@arm.com>
> > Acked-by: Mark Rutland <mark.rutland@arm.com>
> > ---
> > drivers/perf/arm_pmu.c | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
>
> Should this one go to -stable too?
I think so.
The bug has been there at least since 76b8a0e4c8bda5f0 ("ARM: perf:
handle armpmu_register failing"), in v3.8...
Prior to that we wouldn't free the PMU, but it might not have been
initialised correctly.
Thanks,
Mark.
> Will
>
> > diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
> > index 6401f0c..95614d2 100644
> > --- a/drivers/perf/arm_pmu.c
> > +++ b/drivers/perf/arm_pmu.c
> > @@ -992,9 +992,6 @@ int arm_pmu_device_probe(struct platform_device *pdev,
> >
> > armpmu_init(pmu);
> >
> > - if (!__oprofile_cpu_pmu)
> > - __oprofile_cpu_pmu = pmu;
> > -
> > pmu->plat_device = pdev;
> >
> > if (node && (of_id = of_match_node(of_table, pdev->dev.of_node))) {
> > @@ -1030,6 +1027,9 @@ int arm_pmu_device_probe(struct platform_device *pdev,
> > if (ret)
> > goto out_destroy;
> >
> > + if (!__oprofile_cpu_pmu)
> > + __oprofile_cpu_pmu = pmu;
> > +
> > pr_info("enabled with %s PMU driver, %d counters available\n",
> > pmu->name, pmu->num_events);
> >
> > --
> > 1.9.1
> >
>
next prev parent reply other threads:[~2016-05-31 17:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-31 11:41 [PATCH 0/3] drivers/perf: arm_pmu: Small bug fixes in the driver Julien Grall
2016-05-31 11:41 ` Julien Grall
2016-05-31 11:41 ` [PATCH 1/3] drivers/perf: arm_pmu: Fix reference count of a device_node in of_pmu_irq_cfg Julien Grall
2016-05-31 11:41 ` Julien Grall
2016-05-31 11:41 ` [PATCH 2/3] drivers/perf: arm_pmu: Defer the setting of __oprofile_cpu_pmu Julien Grall
2016-05-31 11:41 ` Julien Grall
2016-05-31 16:28 ` Will Deacon
2016-05-31 16:28 ` Will Deacon
2016-05-31 17:29 ` Mark Rutland [this message]
2016-05-31 17:29 ` Mark Rutland
2016-05-31 11:41 ` [PATCH 3/3] drivers/perf: arm_pmu: Avoid leaking pmu->irq_affinity on error Julien Grall
2016-05-31 11:41 ` Julien Grall
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=20160531172937.GG4254@leverpostej \
--to=mark.rutland@arm.com \
--cc=linux-arm-kernel@lists.infradead.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.