diff options
Diffstat (limited to 'kernel/perf_counter.c')
-rw-r--r-- | kernel/perf_counter.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 544193cbc478..89d5e3fe9700 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1567,11 +1567,25 @@ sw_perf_counter_init(struct perf_counter *counter) | |||
1567 | { | 1567 | { |
1568 | const struct hw_perf_counter_ops *hw_ops = NULL; | 1568 | const struct hw_perf_counter_ops *hw_ops = NULL; |
1569 | 1569 | ||
1570 | /* | ||
1571 | * Software counters (currently) can't in general distinguish | ||
1572 | * between user, kernel and hypervisor events. | ||
1573 | * However, context switches and cpu migrations are considered | ||
1574 | * to be kernel events, and page faults are never hypervisor | ||
1575 | * events. | ||
1576 | */ | ||
1570 | switch (counter->hw_event.type) { | 1577 | switch (counter->hw_event.type) { |
1571 | case PERF_COUNT_CPU_CLOCK: | 1578 | case PERF_COUNT_CPU_CLOCK: |
1572 | hw_ops = &perf_ops_cpu_clock; | 1579 | if (!(counter->hw_event.exclude_user || |
1580 | counter->hw_event.exclude_kernel || | ||
1581 | counter->hw_event.exclude_hv)) | ||
1582 | hw_ops = &perf_ops_cpu_clock; | ||
1573 | break; | 1583 | break; |
1574 | case PERF_COUNT_TASK_CLOCK: | 1584 | case PERF_COUNT_TASK_CLOCK: |
1585 | if (counter->hw_event.exclude_user || | ||
1586 | counter->hw_event.exclude_kernel || | ||
1587 | counter->hw_event.exclude_hv) | ||
1588 | break; | ||
1575 | /* | 1589 | /* |
1576 | * If the user instantiates this as a per-cpu counter, | 1590 | * If the user instantiates this as a per-cpu counter, |
1577 | * use the cpu_clock counter instead. | 1591 | * use the cpu_clock counter instead. |
@@ -1582,13 +1596,17 @@ sw_perf_counter_init(struct perf_counter *counter) | |||
1582 | hw_ops = &perf_ops_cpu_clock; | 1596 | hw_ops = &perf_ops_cpu_clock; |
1583 | break; | 1597 | break; |
1584 | case PERF_COUNT_PAGE_FAULTS: | 1598 | case PERF_COUNT_PAGE_FAULTS: |
1585 | hw_ops = &perf_ops_page_faults; | 1599 | if (!(counter->hw_event.exclude_user || |
1600 | counter->hw_event.exclude_kernel)) | ||
1601 | hw_ops = &perf_ops_page_faults; | ||
1586 | break; | 1602 | break; |
1587 | case PERF_COUNT_CONTEXT_SWITCHES: | 1603 | case PERF_COUNT_CONTEXT_SWITCHES: |
1588 | hw_ops = &perf_ops_context_switches; | 1604 | if (!counter->hw_event.exclude_kernel) |
1605 | hw_ops = &perf_ops_context_switches; | ||
1589 | break; | 1606 | break; |
1590 | case PERF_COUNT_CPU_MIGRATIONS: | 1607 | case PERF_COUNT_CPU_MIGRATIONS: |
1591 | hw_ops = &perf_ops_cpu_migrations; | 1608 | if (!counter->hw_event.exclude_kernel) |
1609 | hw_ops = &perf_ops_cpu_migrations; | ||
1592 | break; | 1610 | break; |
1593 | default: | 1611 | default: |
1594 | break; | 1612 | break; |