Skip to content

Commit dd127b3

Browse files
hbruecknerMartin Schwidefsky
authored andcommitted
s390/cpum_sf: Filter perf events based event->attr.exclude_* settings
Introduce the perf_exclude_event() function to filter perf samples according to event->attr.exclude_* settings. During event initialization, reset event exclude settings that are not supported. Signed-off-by: Hendrik Brueckner <[email protected]> Signed-off-by: Martin Schwidefsky <[email protected]>
1 parent 443e802 commit dd127b3

File tree

1 file changed

+35
-1
lines changed

1 file changed

+35
-1
lines changed

arch/s390/kernel/perf_cpum_sf.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,10 +723,19 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
723723
return -ENOENT;
724724
}
725725

726+
/* Check online status of the CPU to which the event is pinned */
726727
if (event->cpu >= nr_cpumask_bits ||
727728
(event->cpu >= 0 && !cpu_online(event->cpu)))
728729
return -ENODEV;
729730

731+
/* Force reset of idle/hv excludes regardless of what the
732+
* user requested.
733+
*/
734+
if (event->attr.exclude_hv)
735+
event->attr.exclude_hv = 0;
736+
if (event->attr.exclude_idle)
737+
event->attr.exclude_idle = 0;
738+
730739
err = __hw_perf_event_init(event);
731740
if (unlikely(err))
732741
if (event->destroy)
@@ -824,6 +833,29 @@ static void cpumsf_pmu_disable(struct pmu *pmu)
824833
cpuhw->flags &= ~PMU_F_ENABLED;
825834
}
826835

836+
/* perf_exclude_event() - Filter event
837+
* @event: The perf event
838+
* @regs: pt_regs structure
839+
* @sde_regs: Sample-data-entry (sde) regs structure
840+
*
841+
* Filter perf events according to their exclude specification.
842+
*
843+
* Return non-zero if the event shall be excluded.
844+
*/
845+
static int perf_exclude_event(struct perf_event *event, struct pt_regs *regs,
846+
struct perf_sf_sde_regs *sde_regs)
847+
{
848+
if (event->attr.exclude_user && user_mode(regs))
849+
return 1;
850+
if (event->attr.exclude_kernel && !user_mode(regs))
851+
return 1;
852+
if (event->attr.exclude_guest && sde_regs->in_guest)
853+
return 1;
854+
if (event->attr.exclude_host && !sde_regs->in_guest)
855+
return 1;
856+
return 0;
857+
}
858+
827859
/* perf_push_sample() - Push samples to perf
828860
* @event: The perf event
829861
* @sample: Hardware sample data
@@ -894,12 +926,14 @@ static int perf_push_sample(struct perf_event *event,
894926
sde_regs->in_guest = 1;
895927

896928
overflow = 0;
929+
if (perf_exclude_event(event, &regs, sde_regs))
930+
goto out;
897931
if (perf_event_overflow(event, &data, &regs)) {
898932
overflow = 1;
899933
event->pmu->stop(event, 0);
900934
}
901935
perf_event_update_userpage(event);
902-
936+
out:
903937
return overflow;
904938
}
905939

0 commit comments

Comments
 (0)