ARM: perf: hook up perf_sample_event_took around pmu irq handling
Since we indirect all of our PMU IRQ handling through a dispatcher, it's trivial to hook up perf_sample_event_took to prevent applications such as oprofile from generating interrupt storms due to an unrealisticly low sample period. Reported-by: Robert Richter <rric@kernel.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
d84c47837d
commit
5f5092e72c
@ -302,6 +302,8 @@ static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
|
|||||||
struct arm_pmu *armpmu;
|
struct arm_pmu *armpmu;
|
||||||
struct platform_device *plat_device;
|
struct platform_device *plat_device;
|
||||||
struct arm_pmu_platdata *plat;
|
struct arm_pmu_platdata *plat;
|
||||||
|
int ret;
|
||||||
|
u64 start_clock, finish_clock;
|
||||||
|
|
||||||
if (irq_is_percpu(irq))
|
if (irq_is_percpu(irq))
|
||||||
dev = *(void **)dev;
|
dev = *(void **)dev;
|
||||||
@ -309,10 +311,15 @@ static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
|
|||||||
plat_device = armpmu->plat_device;
|
plat_device = armpmu->plat_device;
|
||||||
plat = dev_get_platdata(&plat_device->dev);
|
plat = dev_get_platdata(&plat_device->dev);
|
||||||
|
|
||||||
|
start_clock = sched_clock();
|
||||||
if (plat && plat->handle_irq)
|
if (plat && plat->handle_irq)
|
||||||
return plat->handle_irq(irq, dev, armpmu->handle_irq);
|
ret = plat->handle_irq(irq, dev, armpmu->handle_irq);
|
||||||
else
|
else
|
||||||
return armpmu->handle_irq(irq, dev);
|
ret = armpmu->handle_irq(irq, dev);
|
||||||
|
finish_clock = sched_clock();
|
||||||
|
|
||||||
|
perf_sample_event_took(finish_clock - start_clock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user