diff options
Diffstat (limited to 'kernel/events/hw_breakpoint.c')
-rw-r--r-- | kernel/events/hw_breakpoint.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index b7971d6f38bf..bb38c4d3ee12 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
@@ -581,6 +581,12 @@ static int hw_breakpoint_event_init(struct perf_event *bp) | |||
581 | if (bp->attr.type != PERF_TYPE_BREAKPOINT) | 581 | if (bp->attr.type != PERF_TYPE_BREAKPOINT) |
582 | return -ENOENT; | 582 | return -ENOENT; |
583 | 583 | ||
584 | /* | ||
585 | * no branch sampling for breakpoint events | ||
586 | */ | ||
587 | if (has_branch_stack(bp)) | ||
588 | return -EOPNOTSUPP; | ||
589 | |||
584 | err = register_perf_hw_breakpoint(bp); | 590 | err = register_perf_hw_breakpoint(bp); |
585 | if (err) | 591 | if (err) |
586 | return err; | 592 | return err; |
@@ -613,6 +619,11 @@ static void hw_breakpoint_stop(struct perf_event *bp, int flags) | |||
613 | bp->hw.state = PERF_HES_STOPPED; | 619 | bp->hw.state = PERF_HES_STOPPED; |
614 | } | 620 | } |
615 | 621 | ||
622 | static int hw_breakpoint_event_idx(struct perf_event *bp) | ||
623 | { | ||
624 | return 0; | ||
625 | } | ||
626 | |||
616 | static struct pmu perf_breakpoint = { | 627 | static struct pmu perf_breakpoint = { |
617 | .task_ctx_nr = perf_sw_context, /* could eventually get its own */ | 628 | .task_ctx_nr = perf_sw_context, /* could eventually get its own */ |
618 | 629 | ||
@@ -622,6 +633,8 @@ static struct pmu perf_breakpoint = { | |||
622 | .start = hw_breakpoint_start, | 633 | .start = hw_breakpoint_start, |
623 | .stop = hw_breakpoint_stop, | 634 | .stop = hw_breakpoint_stop, |
624 | .read = hw_breakpoint_pmu_read, | 635 | .read = hw_breakpoint_pmu_read, |
636 | |||
637 | .event_idx = hw_breakpoint_event_idx, | ||
625 | }; | 638 | }; |
626 | 639 | ||
627 | int __init init_hw_breakpoint(void) | 640 | int __init init_hw_breakpoint(void) |
@@ -651,10 +664,10 @@ int __init init_hw_breakpoint(void) | |||
651 | 664 | ||
652 | err_alloc: | 665 | err_alloc: |
653 | for_each_possible_cpu(err_cpu) { | 666 | for_each_possible_cpu(err_cpu) { |
654 | if (err_cpu == cpu) | ||
655 | break; | ||
656 | for (i = 0; i < TYPE_MAX; i++) | 667 | for (i = 0; i < TYPE_MAX; i++) |
657 | kfree(per_cpu(nr_task_bp_pinned[i], cpu)); | 668 | kfree(per_cpu(nr_task_bp_pinned[i], cpu)); |
669 | if (err_cpu == cpu) | ||
670 | break; | ||
658 | } | 671 | } |
659 | 672 | ||
660 | return -ENOMEM; | 673 | return -ENOMEM; |