From: Will Deacon <will.deacon@arm.com> To: Jeremy Linton <jeremy.linton@arm.com> Cc: linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org, mark.rutland@arm.com, lorenzo.pieralisi@arm.com, catalin.marinas@arm.com, peterz@infradead.org, mingo@redhat.com, acme@kernel.org, alexander.shishkin@linux.intel.com, mlangsdorf@redhat.com Subject: Re: [PATCH 5/8] arm: arm64: pmu: Assign platform PMU CPU affinity Date: Wed, 15 Jun 2016 14:09:50 +0100 [thread overview] Message-ID: <20160615130950.GK24029@arm.com> (raw) In-Reply-To: <1465511013-10742-6-git-send-email-jeremy.linton@arm.com> On Thu, Jun 09, 2016 at 05:23:30PM -0500, Jeremy Linton wrote: > On systems with multiple PMU types the PMU to CPU affinity > needs to be detected and set. The CPU to interrupt affinity > should also be set. > > Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> > --- > drivers/perf/arm_pmu.c | 52 ++++++++++++++++++++++++++++++++++++++++---------- > 1 file changed, 42 insertions(+), 10 deletions(-) > > diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c > index fee4be0e8..865a9db 100644 > --- a/drivers/perf/arm_pmu.c > +++ b/drivers/perf/arm_pmu.c > @@ -11,6 +11,7 @@ > */ > #define pr_fmt(fmt) "hw perfevents: " fmt > > +#include <linux/acpi.h> > #include <linux/bitmap.h> > #include <linux/cpumask.h> > #include <linux/cpu_pm.h> > @@ -24,6 +25,7 @@ > #include <linux/irq.h> > #include <linux/irqdesc.h> > > +#include <asm/cpu.h> > #include <asm/cputype.h> > #include <asm/irq_regs.h> > > @@ -872,25 +874,56 @@ static void cpu_pmu_destroy(struct arm_pmu *cpu_pmu) > } > > /* > - * CPU PMU identification and probing. > + * CPU PMU identification and probing. Its possible to have > + * multiple CPU types in an ARM machine. Assure that we are > + * picking the right PMU types based on the CPU in question > */ > -static int probe_current_pmu(struct arm_pmu *pmu, > - const struct pmu_probe_info *info) > +static int probe_plat_pmu(struct arm_pmu *pmu, > + const struct pmu_probe_info *info, > + unsigned int pmuid) > { > - int cpu = get_cpu(); > - unsigned int cpuid = read_cpuid_id(); > int ret = -ENODEV; > + int cpu; > + int aff_ctr = 0; > + struct platform_device *pdev = pmu->plat_device; > + int irq = platform_get_irq(pdev, 0); > > - pr_info("probing PMU on CPU %d\n", cpu); > + if (irq >= 0 && !irq_is_percpu(irq)) { > + pmu->irq_affinity = kcalloc(pdev->num_resources, sizeof(int), > + GFP_KERNEL); > + if (!pmu->irq_affinity) > + return -ENOMEM; > + } > + > + for_each_possible_cpu(cpu) { > + unsigned int cpuid = read_specific_cpuid(cpu); > + > + if (cpuid == pmuid) { > + cpumask_set_cpu(cpu, &pmu->supported_cpus); > + pr_devel("enable pmu on cpu %d\n", cpu); Please remove the pr_devels that you've added (similarly elsewhere in the patch). > + if (pmu->irq_affinity) { > + pmu->irq_affinity[aff_ctr] = cpu; > + aff_ctr++; > + } > + } > + } > > + pr_debug("probing PMU %X\n", pmuid); You can also kill this now -- I don't think it's much use. > + /* find the type of PMU given the CPU */ > for (; info->init != NULL; info++) { > - if ((cpuid & info->mask) != info->cpuid) > + if ((pmuid & info->mask) != info->cpuid) > continue; > + pr_devel("Found PMU\n"); > ret = info->init(pmu); > + if (!info->cpuid) { > + pmu->name = kasprintf(GFP_KERNEL, "%s_0x%x", > + pmu->name, ARM_PARTNUM(pmuid)); Hmm, I'm not so keen on this. I think we should name the first PMU "armv8_pmuv3" (i.e. pmu->name) and then any subsequent PMUs should inherit an index, e.g. "armv8_pmuv3_1". That follows a similar style to uncore PMUs and also keeps this backwards compatible with what's currently done with devicetree. You can create a 'cpumask' file in the sysfs directory that identifies the cores for the PMU (again, there is precedent for this elsewhere). Will
WARNING: multiple messages have this Message-ID (diff)
From: will.deacon@arm.com (Will Deacon) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 5/8] arm: arm64: pmu: Assign platform PMU CPU affinity Date: Wed, 15 Jun 2016 14:09:50 +0100 [thread overview] Message-ID: <20160615130950.GK24029@arm.com> (raw) In-Reply-To: <1465511013-10742-6-git-send-email-jeremy.linton@arm.com> On Thu, Jun 09, 2016 at 05:23:30PM -0500, Jeremy Linton wrote: > On systems with multiple PMU types the PMU to CPU affinity > needs to be detected and set. The CPU to interrupt affinity > should also be set. > > Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> > --- > drivers/perf/arm_pmu.c | 52 ++++++++++++++++++++++++++++++++++++++++---------- > 1 file changed, 42 insertions(+), 10 deletions(-) > > diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c > index fee4be0e8..865a9db 100644 > --- a/drivers/perf/arm_pmu.c > +++ b/drivers/perf/arm_pmu.c > @@ -11,6 +11,7 @@ > */ > #define pr_fmt(fmt) "hw perfevents: " fmt > > +#include <linux/acpi.h> > #include <linux/bitmap.h> > #include <linux/cpumask.h> > #include <linux/cpu_pm.h> > @@ -24,6 +25,7 @@ > #include <linux/irq.h> > #include <linux/irqdesc.h> > > +#include <asm/cpu.h> > #include <asm/cputype.h> > #include <asm/irq_regs.h> > > @@ -872,25 +874,56 @@ static void cpu_pmu_destroy(struct arm_pmu *cpu_pmu) > } > > /* > - * CPU PMU identification and probing. > + * CPU PMU identification and probing. Its possible to have > + * multiple CPU types in an ARM machine. Assure that we are > + * picking the right PMU types based on the CPU in question > */ > -static int probe_current_pmu(struct arm_pmu *pmu, > - const struct pmu_probe_info *info) > +static int probe_plat_pmu(struct arm_pmu *pmu, > + const struct pmu_probe_info *info, > + unsigned int pmuid) > { > - int cpu = get_cpu(); > - unsigned int cpuid = read_cpuid_id(); > int ret = -ENODEV; > + int cpu; > + int aff_ctr = 0; > + struct platform_device *pdev = pmu->plat_device; > + int irq = platform_get_irq(pdev, 0); > > - pr_info("probing PMU on CPU %d\n", cpu); > + if (irq >= 0 && !irq_is_percpu(irq)) { > + pmu->irq_affinity = kcalloc(pdev->num_resources, sizeof(int), > + GFP_KERNEL); > + if (!pmu->irq_affinity) > + return -ENOMEM; > + } > + > + for_each_possible_cpu(cpu) { > + unsigned int cpuid = read_specific_cpuid(cpu); > + > + if (cpuid == pmuid) { > + cpumask_set_cpu(cpu, &pmu->supported_cpus); > + pr_devel("enable pmu on cpu %d\n", cpu); Please remove the pr_devels that you've added (similarly elsewhere in the patch). > + if (pmu->irq_affinity) { > + pmu->irq_affinity[aff_ctr] = cpu; > + aff_ctr++; > + } > + } > + } > > + pr_debug("probing PMU %X\n", pmuid); You can also kill this now -- I don't think it's much use. > + /* find the type of PMU given the CPU */ > for (; info->init != NULL; info++) { > - if ((cpuid & info->mask) != info->cpuid) > + if ((pmuid & info->mask) != info->cpuid) > continue; > + pr_devel("Found PMU\n"); > ret = info->init(pmu); > + if (!info->cpuid) { > + pmu->name = kasprintf(GFP_KERNEL, "%s_0x%x", > + pmu->name, ARM_PARTNUM(pmuid)); Hmm, I'm not so keen on this. I think we should name the first PMU "armv8_pmuv3" (i.e. pmu->name) and then any subsequent PMUs should inherit an index, e.g. "armv8_pmuv3_1". That follows a similar style to uncore PMUs and also keeps this backwards compatible with what's currently done with devicetree. You can create a 'cpumask' file in the sysfs directory that identifies the cores for the PMU (again, there is precedent for this elsewhere). Will
next prev parent reply other threads:[~2016-06-15 13:09 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-06-09 22:23 [PATCH 0/8] arm64: pmu: Detect multiple PMU types in an ACPI system Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-09 22:23 ` [PATCH 1/8] arm64: pmu: add fallback probe table Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-15 10:59 ` Will Deacon 2016-06-15 10:59 ` Will Deacon 2016-06-09 22:23 ` [PATCH 2/8] arm64: pmu: Probe default hw/cache counters Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-15 11:14 ` Will Deacon 2016-06-15 11:14 ` Will Deacon 2016-06-09 22:23 ` [PATCH 3/8] arm64: pmu: Add support for probing with ACPI Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-15 11:33 ` Will Deacon 2016-06-15 11:33 ` Will Deacon 2016-06-15 15:07 ` Jeremy Linton 2016-06-15 15:07 ` Jeremy Linton 2016-06-09 22:23 ` [PATCH 4/8] arm: arm64: Add routine to determine cpuid of other cpus Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-20 16:49 ` Punit Agrawal 2016-06-20 16:49 ` Punit Agrawal 2016-06-09 22:23 ` [PATCH 5/8] arm: arm64: pmu: Assign platform PMU CPU affinity Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-15 13:09 ` Will Deacon [this message] 2016-06-15 13:09 ` Will Deacon 2016-06-20 16:40 ` Punit Agrawal 2016-06-20 16:40 ` Punit Agrawal 2016-06-20 16:49 ` Jeremy Linton 2016-06-20 16:49 ` Jeremy Linton 2016-06-20 17:01 ` Punit Agrawal 2016-06-20 17:01 ` Punit Agrawal 2016-06-09 22:23 ` [PATCH 6/8] arm64: pmu: Add routines for detecting differing PMU types in the system Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-09 22:23 ` [PATCH 7/8] arm64: pmu: Enable multiple PMUs in an ACPI system Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-15 13:22 ` Will Deacon 2016-06-15 13:22 ` Will Deacon 2016-06-15 15:21 ` Jeremy Linton 2016-06-15 15:21 ` Jeremy Linton 2016-06-15 15:30 ` Will Deacon 2016-06-15 15:30 ` Will Deacon 2016-06-20 16:37 ` Punit Agrawal 2016-06-20 16:37 ` Punit Agrawal 2016-06-20 21:44 ` Jeremy Linton 2016-06-20 21:44 ` Jeremy Linton 2016-06-21 8:34 ` Punit Agrawal 2016-06-21 8:34 ` Punit Agrawal 2016-06-09 22:23 ` [PATCH 8/8] MAINTAINERS: Tweak ARM PMU maintainers Jeremy Linton 2016-06-09 22:23 ` Jeremy Linton 2016-06-20 16:47 ` [PATCH 0/8] arm64: pmu: Detect multiple PMU types in an ACPI system Punit Agrawal 2016-06-20 16:47 ` Punit Agrawal
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=20160615130950.GK24029@arm.com \ --to=will.deacon@arm.com \ --cc=acme@kernel.org \ --cc=alexander.shishkin@linux.intel.com \ --cc=catalin.marinas@arm.com \ --cc=jeremy.linton@arm.com \ --cc=linux-acpi@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=lorenzo.pieralisi@arm.com \ --cc=mark.rutland@arm.com \ --cc=mingo@redhat.com \ --cc=mlangsdorf@redhat.com \ --cc=peterz@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: linkBe 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.