diff options
Diffstat (limited to 'arch/arm/kernel/perf_event.c')
| -rw-r--r-- | arch/arm/kernel/perf_event.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 24e2347be6b1..8e9c98edc068 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
| @@ -343,19 +343,25 @@ validate_group(struct perf_event *event) | |||
| 343 | { | 343 | { |
| 344 | struct perf_event *sibling, *leader = event->group_leader; | 344 | struct perf_event *sibling, *leader = event->group_leader; |
| 345 | struct pmu_hw_events fake_pmu; | 345 | struct pmu_hw_events fake_pmu; |
| 346 | DECLARE_BITMAP(fake_used_mask, ARMPMU_MAX_HWEVENTS); | ||
| 346 | 347 | ||
| 347 | memset(&fake_pmu, 0, sizeof(fake_pmu)); | 348 | /* |
| 349 | * Initialise the fake PMU. We only need to populate the | ||
| 350 | * used_mask for the purposes of validation. | ||
| 351 | */ | ||
| 352 | memset(fake_used_mask, 0, sizeof(fake_used_mask)); | ||
| 353 | fake_pmu.used_mask = fake_used_mask; | ||
| 348 | 354 | ||
| 349 | if (!validate_event(&fake_pmu, leader)) | 355 | if (!validate_event(&fake_pmu, leader)) |
| 350 | return -ENOSPC; | 356 | return -EINVAL; |
| 351 | 357 | ||
| 352 | list_for_each_entry(sibling, &leader->sibling_list, group_entry) { | 358 | list_for_each_entry(sibling, &leader->sibling_list, group_entry) { |
| 353 | if (!validate_event(&fake_pmu, sibling)) | 359 | if (!validate_event(&fake_pmu, sibling)) |
| 354 | return -ENOSPC; | 360 | return -EINVAL; |
| 355 | } | 361 | } |
| 356 | 362 | ||
| 357 | if (!validate_event(&fake_pmu, event)) | 363 | if (!validate_event(&fake_pmu, event)) |
| 358 | return -ENOSPC; | 364 | return -EINVAL; |
| 359 | 365 | ||
| 360 | return 0; | 366 | return 0; |
| 361 | } | 367 | } |
| @@ -396,6 +402,9 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) | |||
| 396 | int i, err, irq, irqs; | 402 | int i, err, irq, irqs; |
| 397 | struct platform_device *pmu_device = armpmu->plat_device; | 403 | struct platform_device *pmu_device = armpmu->plat_device; |
| 398 | 404 | ||
| 405 | if (!pmu_device) | ||
| 406 | return -ENODEV; | ||
| 407 | |||
| 399 | err = reserve_pmu(armpmu->type); | 408 | err = reserve_pmu(armpmu->type); |
| 400 | if (err) { | 409 | if (err) { |
| 401 | pr_warning("unable to reserve pmu\n"); | 410 | pr_warning("unable to reserve pmu\n"); |
