On Mon, Mar 24, 2025 at 05:30:49PM +0000, Mingwei Zhang wrote: > @@ -1822,7 +1835,7 @@ extern int perf_event_period(struct perf_event *event, > u64 value); > extern u64 perf_event_pause(struct perf_event *event, bool reset); > int perf_get_mediated_pmu(void); > void perf_put_mediated_pmu(void); > -void perf_guest_enter(void); > +void perf_guest_enter(u32 guest_lvtpc); > void perf_guest_exit(void); > #else /* !CONFIG_PERF_EVENTS: */ > static inline void * > @@ -1921,7 +1934,7 @@ static inline int perf_get_mediated_pmu(void) > } > > static inline void perf_put_mediated_pmu(void) { } > -static inline void perf_guest_enter(void) { } > +static inline void perf_guest_enter(u32 guest_lvtpc) { } > static inline void perf_guest_exit(void) { } > #endif > > diff --git a/kernel/events/core.c b/kernel/events/core.c > index d05487d465c9..406b86641f02 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -451,6 +451,7 @@ static inline bool is_include_guest_event(struct > perf_event *event) > static LIST_HEAD(pmus); > static DEFINE_MUTEX(pmus_lock); > static struct srcu_struct pmus_srcu; > +static DEFINE_PER_CPU(struct mediated_pmus_list, mediated_pmus); > static cpumask_var_t perf_online_mask; > static cpumask_var_t perf_online_core_mask; > static cpumask_var_t perf_online_die_mask; > @@ -6053,8 +6054,26 @@ static inline void perf_host_exit(struct > perf_cpu_context *cpuctx) > } > } > > +static void perf_switch_guest_ctx(bool enter, u32 guest_lvtpc) > +{ > + struct mediated_pmus_list *pmus = this_cpu_ptr(&mediated_pmus); > + struct perf_cpu_pmu_context *cpc; > + struct pmu *pmu; > + > + lockdep_assert_irqs_disabled(); > + > + rcu_read_lock(); > + list_for_each_entry_rcu(cpc, &pmus->list, mediated_entry) { > + pmu = cpc->epc.pmu; > + > + if (pmu->switch_guest_ctx) > + pmu->switch_guest_ctx(enter, (void *)&guest_lvtpc); > + } > + rcu_read_unlock(); > +} > + > /* When entering a guest, schedule out all exclude_guest events. */ > -void perf_guest_enter(void) > +void perf_guest_enter(u32 guest_lvtpc) > { > struct perf_cpu_context *cpuctx = this_cpu_ptr(&perf_cpu_context); > > @@ -6067,6 +6086,8 @@ void perf_guest_enter(void) > > perf_host_exit(cpuctx); > > + perf_switch_guest_ctx(true, guest_lvtpc); > + > __this_cpu_write(perf_in_guest, true); > > unlock:
This, I'm still utterly hating on that lvtpc argument. That doesn't belong here. Make it go away.