All of lore.kernel.org
 help / color / mirror / Atom feed
* pmu: armv7_a9_pmu_init() fails with -ENXIO
@ 2015-10-21 13:01 Mason
  2015-10-21 13:46 ` Mason
  0 siblings, 1 reply; 5+ messages in thread
From: Mason @ 2015-10-21 13:01 UTC (permalink / raw)
  To: linux-arm-kernel

Hello,

On my (dual-core) system, armv7_a9_pmu_init() fails with -ENXIO
(I'm running v4.2)

[    0.090148] cpu=4 nr_cpu_ids=2
[    0.090164] armv7_a9_pmu_init: ret=-6
[    0.090171] hw perfevents: failed to probe PMU!
[    0.090175] hw perfevents: failed to register PMU devices!

armv7_a9_pmu_init() eventually calls generic_exec_single()
which fails this test:

	if ((unsigned)cpu >= nr_cpu_ids || !cpu_online(cpu))

cpu = 4 looks fishy, doesn't it?
<grasping@straws> I'm wondering if commit 0e3038d18adce or
commit cc88116da0d18 might be related at all?

The value 4 comes from smp_call_function_any()

  /* Any online will do: smp_call_function_single handles nr_cpu_ids. */
  cpu = cpumask_any_and(mask, cpu_online_mask);

mask = &arm_pmu->supported_cpus
p arm_pmu->supported_cpus
$3 = {bits = {0}}

/**
 * cpumask_next_and - get the next cpu in *src1p & *src2p
 * @n: the cpu prior to the place to search (ie. return will be > @n)
 * @src1p: the first cpumask pointer
 * @src2p: the second cpumask pointer
 *
 * Returns >= nr_cpu_ids if no further cpus set in both.
 */

Shouldn't cpu_pmu->supported_cpus be cpu_present_mask or cpu_possible_mask?
Shouldn't armv7pmu_init() set arm_pmu->supported_cpus?

Regards.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* pmu: armv7_a9_pmu_init() fails with -ENXIO
  2015-10-21 13:01 pmu: armv7_a9_pmu_init() fails with -ENXIO Mason
@ 2015-10-21 13:46 ` Mason
  2015-10-21 14:27   ` Sudeep Holla
  0 siblings, 1 reply; 5+ messages in thread
From: Mason @ 2015-10-21 13:46 UTC (permalink / raw)
  To: linux-arm-kernel

On 21/10/2015 15:01, Mason wrote:

> On my (dual-core) system, armv7_a9_pmu_init() fails with -ENXIO
> (I'm running v4.2)
> 
> [    0.090148] cpu=4 nr_cpu_ids=2
> [    0.090164] armv7_a9_pmu_init: ret=-6
> [    0.090171] hw perfevents: failed to probe PMU!
> [    0.090175] hw perfevents: failed to register PMU devices!
> 
> armv7_a9_pmu_init() eventually calls generic_exec_single()
> which fails this test:
> 
> 	if ((unsigned)cpu >= nr_cpu_ids || !cpu_online(cpu))
> 
> cpu = 4 looks fishy, doesn't it?
> <grasping@straws> I'm wondering if commit 0e3038d18adce or
> commit cc88116da0d18 might be related at all?
> 
> The value 4 comes from smp_call_function_any()
> 
>   /* Any online will do: smp_call_function_single handles nr_cpu_ids. */
>   cpu = cpumask_any_and(mask, cpu_online_mask);
> 
> mask = &arm_pmu->supported_cpus
> p arm_pmu->supported_cpus
> $3 = {bits = {0}}
> 
> /**
>  * cpumask_next_and - get the next cpu in *src1p & *src2p
>  * @n: the cpu prior to the place to search (ie. return will be > @n)
>  * @src1p: the first cpumask pointer
>  * @src2p: the second cpumask pointer
>  *
>  * Returns >= nr_cpu_ids if no further cpus set in both.
>  */
> 
> Shouldn't cpu_pmu->supported_cpus be cpu_present_mask or cpu_possible_mask?
> Shouldn't armv7pmu_init() set arm_pmu->supported_cpus?

Looking more closely at Documentation/devicetree/bindings/arm/pmu.txt
I now see commit 71bbf038eaa44

- interrupt-affinity : Valid only when using SPIs, specifies a list of phandles
                       to CPU nodes corresponding directly to the affinity of
		       the SPIs listed in the interrupts property.

		       This property should be present when there is more than
		       a single SPI.

I currently have

	pmu {
		compatible = "arm,cortex-a9-pmu";
		interrupts =
			<GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
			<GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>;
	};

<confused> I wrote the above node by sampling other platforms,
and they don't define any interrupt-affinity property, e.g.

exynos4415.dtsi:

		pmu {
			compatible = "arm,cortex-a9-pmu";
			interrupts = <0 18 0>, <0 19 0>, <0 20 0>, <0 21 0>;
		};

exynos5440.dtsi:

	arm-pmu {
		compatible = "arm,cortex-a15-pmu", "arm,cortex-a9-pmu";
		interrupts = <0 52 4>,
			     <0 53 4>,
			     <0 54 4>,
			     <0 55 4>;
	};

highbank.dts:

		pmu {
			compatible = "arm,cortex-a9-pmu";
			interrupts = <0 76 4  0 75 4  0 74 4  0 73 4>;
		};

omap4460.dtsi:

	pmu {
		compatible = "arm,cortex-a9-pmu";
		interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
			     <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
		ti,hwmods = "debugss";
	};


I also looked more closely at of_pmu_irq_cfg()

platform_get_irq(pdev, 0); returns -6
pdev->num_resources is 0 therefore...

	if (i == pdev->num_resources) {
		pmu->irq_affinity = irqs;
	} else {
		kfree(irqs);
		cpumask_setall(&pmu->supported_cpus);
	}

pmu->irq_affinity gets set to an invalid pointer (0x00000010)
and cpumask_setall() is not called.

Something is not working as expected, right?

Regards.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* pmu: armv7_a9_pmu_init() fails with -ENXIO
  2015-10-21 13:46 ` Mason
@ 2015-10-21 14:27   ` Sudeep Holla
  2015-10-21 15:44     ` Mason
  0 siblings, 1 reply; 5+ messages in thread
From: Sudeep Holla @ 2015-10-21 14:27 UTC (permalink / raw)
  To: linux-arm-kernel



On 21/10/15 14:46, Mason wrote:

[...]

>
> I also looked more closely at of_pmu_irq_cfg()
>
> platform_get_irq(pdev, 0); returns -6

Won't it return here ? Though you must first check why is that returning
error.

         irq = platform_get_irq(pdev, 0);
         if (irq >= 0 && irq_is_percpu(irq))
                 return 0;

> pdev->num_resources is 0 therefore...
>
> 	if (i == pdev->num_resources) {
> 		pmu->irq_affinity = irqs;
> 	} else {
> 		kfree(irqs);
> 		cpumask_setall(&pmu->supported_cpus);
> 	}
>
> pmu->irq_affinity gets set to an invalid pointer (0x00000010)
> and cpumask_setall() is not called.
>
> Something is not working as expected, right?
>

So you won't execute this in that case.

Sorry if I missed something, I briefly checked v4.2
Code have been changed and even moved since then.

-- 
Regards,
Sudeep

^ permalink raw reply	[flat|nested] 5+ messages in thread

* pmu: armv7_a9_pmu_init() fails with -ENXIO
  2015-10-21 14:27   ` Sudeep Holla
@ 2015-10-21 15:44     ` Mason
  2015-10-21 16:26       ` Sudeep Holla
  0 siblings, 1 reply; 5+ messages in thread
From: Mason @ 2015-10-21 15:44 UTC (permalink / raw)
  To: linux-arm-kernel

On 21/10/2015 16:27, Sudeep Holla wrote:

> On 21/10/15 14:46, Mason wrote:
> 
>> I also looked more closely at of_pmu_irq_cfg()
>>
>> platform_get_irq(pdev, 0); returns -6
> 
> Won't it return here ?
> Though you must first check why is that returning error.
> 
>          irq = platform_get_irq(pdev, 0);
>          if (irq >= 0 && irq_is_percpu(irq))
>                  return 0;

Thanks for prodding me in the right direction.
platform_get_irq() was failing because I hadn't properly defined
the node's interrupt-parent...

I've added
  interrupt-parent = <&gic>;
at the root of my DT, and things now work as expected.
(Haven't tested actually using the counters yet.)

[    0.090058] irq=212 irqs=e7603400 pdev->num_resources=2
[    0.090091] hw perfevents: Failed to parse /pmu/interrupt-affinity[0]
[    0.090103] armv7_a9_pmu_init: ret=0
[    0.090145] hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available

Thanks again.

Regards.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* pmu: armv7_a9_pmu_init() fails with -ENXIO
  2015-10-21 15:44     ` Mason
@ 2015-10-21 16:26       ` Sudeep Holla
  0 siblings, 0 replies; 5+ messages in thread
From: Sudeep Holla @ 2015-10-21 16:26 UTC (permalink / raw)
  To: linux-arm-kernel



On 21/10/15 16:44, Mason wrote:
> On 21/10/2015 16:27, Sudeep Holla wrote:
>
>> On 21/10/15 14:46, Mason wrote:
>>
>>> I also looked more closely at of_pmu_irq_cfg()
>>>
>>> platform_get_irq(pdev, 0); returns -6
>>
>> Won't it return here ?
>> Though you must first check why is that returning error.
>>
>>           irq = platform_get_irq(pdev, 0);
>>           if (irq >= 0 && irq_is_percpu(irq))
>>                   return 0;
>
> Thanks for prodding me in the right direction.
> platform_get_irq() was failing because I hadn't properly defined
> the node's interrupt-parent...
>

Yes that's what I guessed seeing of_irq_get.

> I've added
>    interrupt-parent = <&gic>;
> at the root of my DT, and things now work as expected.
> (Haven't tested actually using the counters yet.)
>
> [    0.090058] irq=212 irqs=e7603400 pdev->num_resources=2
> [    0.090091] hw perfevents: Failed to parse /pmu/interrupt-affinity[0]

Better to add this property. It assigns the cpu affinity in logical
order which might break if your logical and physical cpu ordering
differs.(e.g. you boot on CPU#1 instead of CPU#0)

> [    0.090103] armv7_a9_pmu_init: ret=0
> [    0.090145] hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
>

Cool

-- 
Regards,
Sudeep

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-10-21 16:26 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-21 13:01 pmu: armv7_a9_pmu_init() fails with -ENXIO Mason
2015-10-21 13:46 ` Mason
2015-10-21 14:27   ` Sudeep Holla
2015-10-21 15:44     ` Mason
2015-10-21 16:26       ` Sudeep Holla

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.