@@ -25,35 +25,45 @@ static bool kvm_pmu_switch_needed(struct perf_event_attr *attr)
2525 return (attr -> exclude_host != attr -> exclude_guest );
2626}
2727
28+ static struct kvm_pmu_events * kvm_get_pmu_events (void )
29+ {
30+ struct kvm_host_data * ctx = this_cpu_ptr_hyp_sym (kvm_host_data );
31+
32+ if (!ctx )
33+ return NULL ;
34+
35+ return & ctx -> pmu_events ;
36+ }
37+
2838/*
2939 * Add events to track that we may want to switch at guest entry/exit
3040 * time.
3141 */
3242void kvm_set_pmu_events (u32 set , struct perf_event_attr * attr )
3343{
34- struct kvm_host_data * ctx = this_cpu_ptr_hyp_sym ( kvm_host_data );
44+ struct kvm_pmu_events * pmu = kvm_get_pmu_events ( );
3545
36- if (!kvm_arm_support_pmu_v3 () || !ctx || !kvm_pmu_switch_needed (attr ))
46+ if (!kvm_arm_support_pmu_v3 () || !pmu || !kvm_pmu_switch_needed (attr ))
3747 return ;
3848
3949 if (!attr -> exclude_host )
40- ctx -> pmu_events . events_host |= set ;
50+ pmu -> events_host |= set ;
4151 if (!attr -> exclude_guest )
42- ctx -> pmu_events . events_guest |= set ;
52+ pmu -> events_guest |= set ;
4353}
4454
4555/*
4656 * Stop tracking events
4757 */
4858void kvm_clr_pmu_events (u32 clr )
4959{
50- struct kvm_host_data * ctx = this_cpu_ptr_hyp_sym ( kvm_host_data );
60+ struct kvm_pmu_events * pmu = kvm_get_pmu_events ( );
5161
52- if (!kvm_arm_support_pmu_v3 () || !ctx )
62+ if (!kvm_arm_support_pmu_v3 () || !pmu )
5363 return ;
5464
55- ctx -> pmu_events . events_host &= ~clr ;
56- ctx -> pmu_events . events_guest &= ~clr ;
65+ pmu -> events_host &= ~clr ;
66+ pmu -> events_guest &= ~clr ;
5767}
5868
5969#define PMEVTYPER_READ_CASE (idx ) \
@@ -169,16 +179,16 @@ static void kvm_vcpu_pmu_disable_el0(unsigned long events)
169179 */
170180void kvm_vcpu_pmu_restore_guest (struct kvm_vcpu * vcpu )
171181{
172- struct kvm_host_data * host ;
182+ struct kvm_pmu_events * pmu ;
173183 u32 events_guest , events_host ;
174184
175185 if (!kvm_arm_support_pmu_v3 () || !has_vhe ())
176186 return ;
177187
178188 preempt_disable ();
179- host = this_cpu_ptr_hyp_sym ( kvm_host_data );
180- events_guest = host -> pmu_events . events_guest ;
181- events_host = host -> pmu_events . events_host ;
189+ pmu = kvm_get_pmu_events ( );
190+ events_guest = pmu -> events_guest ;
191+ events_host = pmu -> events_host ;
182192
183193 kvm_vcpu_pmu_enable_el0 (events_guest );
184194 kvm_vcpu_pmu_disable_el0 (events_host );
@@ -190,15 +200,15 @@ void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu)
190200 */
191201void kvm_vcpu_pmu_restore_host (struct kvm_vcpu * vcpu )
192202{
193- struct kvm_host_data * host ;
203+ struct kvm_pmu_events * pmu ;
194204 u32 events_guest , events_host ;
195205
196206 if (!kvm_arm_support_pmu_v3 () || !has_vhe ())
197207 return ;
198208
199- host = this_cpu_ptr_hyp_sym ( kvm_host_data );
200- events_guest = host -> pmu_events . events_guest ;
201- events_host = host -> pmu_events . events_host ;
209+ pmu = kvm_get_pmu_events ( );
210+ events_guest = pmu -> events_guest ;
211+ events_host = pmu -> events_host ;
202212
203213 kvm_vcpu_pmu_enable_el0 (events_host );
204214 kvm_vcpu_pmu_disable_el0 (events_guest );
0 commit comments