Message ID | 1430363091-27722-1-git-send-email-sukadev@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Michael Ellerman |
Headers | show |
On Thu, 2015-30-04 at 03:04:51 UTC, Sukadev Bhattiprolu wrote: > We currently try to register the 24x7 PMU unconditionally. Not all > Power systems support 24x7 counters (eg: Power7). On these systems > we get a backtrace during boot when trying to register the 24x7 PMU. > > Check if the hypervisor supports 24x7 counters before attempting to > register the 24x7 PMU. The concept is good, but .. > diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c > index ec2eb20..19a59a3 100644 > --- a/arch/powerpc/perf/hv-24x7.c > +++ b/arch/powerpc/perf/hv-24x7.c > @@ -1268,12 +1268,44 @@ static struct pmu h_24x7_pmu = { > .read = h_24x7_event_read, > }; > > +/* > + * Return 1 if we can access the 24x7 counter catalog from the hypervisor. > + * Return 0 otherwise. > + */ > +static int hv_has_24x7(void) bool please > +{ > + int page_size = 4096; > + unsigned long hret; > + void *page; > + struct hv_24x7_catalog_page_0 *page_0; > + > + page_0 = kmalloc(page_size*2, GFP_KERNEL); > + if (!page_0) > + return 0; > + > + /* buffer for catalog needs to be 4K-aligned */ > + page = (void *)((long)page_0 & (~page_size-1)) + page_size; > + hret = h_get_24x7_catalog_page(page, 0, 0); > + kfree(page_0); It shouldn't need to be this complicated. You should just be able to do the hcall with bogus args and if you get H_FUNCTION then 24x7 is not supported. cheers
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index ec2eb20..19a59a3 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c @@ -1268,12 +1268,44 @@ static struct pmu h_24x7_pmu = { .read = h_24x7_event_read, }; +/* + * Return 1 if we can access the 24x7 counter catalog from the hypervisor. + * Return 0 otherwise. + */ +static int hv_has_24x7(void) +{ + int page_size = 4096; + unsigned long hret; + void *page; + struct hv_24x7_catalog_page_0 *page_0; + + page_0 = kmalloc(page_size*2, GFP_KERNEL); + if (!page_0) + return 0; + + /* buffer for catalog needs to be 4K-aligned */ + page = (void *)((long)page_0 & (~page_size-1)) + page_size; + hret = h_get_24x7_catalog_page(page, 0, 0); + kfree(page_0); + + if (hret) { + pr_devel("Error %ld reading catalog, disabling 24x7 PMU\n", hret); + return 0; + } + + return 1; +} + + static int hv_24x7_init(void) { int r; unsigned long hret; struct hv_perf_caps caps; + if (!hv_has_24x7()) + return -ENODEV; + if (!firmware_has_feature(FW_FEATURE_LPAR)) { pr_debug("not a virtualized system, not enabling\n"); return -ENODEV;
We currently try to register the 24x7 PMU unconditionally. Not all Power systems support 24x7 counters (eg: Power7). On these systems we get a backtrace during boot when trying to register the 24x7 PMU. Check if the hypervisor supports 24x7 counters before attempting to register the 24x7 PMU. Reported-by: Gustavo Luiz Duarte <gusld@br.ibm.com> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> --- arch/powerpc/perf/hv-24x7.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)