|
@@ -343,8 +343,14 @@ validate_group(struct perf_event *event)
|
|
|
{
|
|
|
struct perf_event *sibling, *leader = event->group_leader;
|
|
|
struct pmu_hw_events fake_pmu;
|
|
|
+ DECLARE_BITMAP(fake_used_mask, ARMPMU_MAX_HWEVENTS);
|
|
|
|
|
|
- memset(&fake_pmu, 0, sizeof(fake_pmu));
|
|
|
+ /*
|
|
|
+ * Initialise the fake PMU. We only need to populate the
|
|
|
+ * used_mask for the purposes of validation.
|
|
|
+ */
|
|
|
+ memset(fake_used_mask, 0, sizeof(fake_used_mask));
|
|
|
+ fake_pmu.used_mask = fake_used_mask;
|
|
|
|
|
|
if (!validate_event(&fake_pmu, leader))
|
|
|
return -ENOSPC;
|
|
@@ -396,6 +402,9 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)
|
|
|
int i, err, irq, irqs;
|
|
|
struct platform_device *pmu_device = armpmu->plat_device;
|
|
|
|
|
|
+ if (!pmu_device)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
err = reserve_pmu(armpmu->type);
|
|
|
if (err) {
|
|
|
pr_warning("unable to reserve pmu\n");
|