@@ -2542,15 +2542,15 @@ static void kvm_synchronize_tsc(struct kvm_vcpu *vcpu, u64 data)
25422542 kvm_vcpu_write_tsc_offset (vcpu , offset );
25432543 raw_spin_unlock_irqrestore (& kvm -> arch .tsc_write_lock , flags );
25442544
2545- spin_lock_irqsave (& kvm -> arch .pvclock_gtod_sync_lock , flags );
2545+ raw_spin_lock_irqsave (& kvm -> arch .pvclock_gtod_sync_lock , flags );
25462546 if (!matched ) {
25472547 kvm -> arch .nr_vcpus_matched_tsc = 0 ;
25482548 } else if (!already_matched ) {
25492549 kvm -> arch .nr_vcpus_matched_tsc ++ ;
25502550 }
25512551
25522552 kvm_track_tsc_matching (vcpu );
2553- spin_unlock_irqrestore (& kvm -> arch .pvclock_gtod_sync_lock , flags );
2553+ raw_spin_unlock_irqrestore (& kvm -> arch .pvclock_gtod_sync_lock , flags );
25542554}
25552555
25562556static inline void adjust_tsc_offset_guest (struct kvm_vcpu * vcpu ,
@@ -2780,9 +2780,9 @@ static void kvm_gen_update_masterclock(struct kvm *kvm)
27802780 kvm_make_mclock_inprogress_request (kvm );
27812781
27822782 /* no guest entries from this point */
2783- spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
2783+ raw_spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
27842784 pvclock_update_vm_gtod_copy (kvm );
2785- spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
2785+ raw_spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
27862786
27872787 kvm_for_each_vcpu (i , vcpu , kvm )
27882788 kvm_make_request (KVM_REQ_CLOCK_UPDATE , vcpu );
@@ -2800,15 +2800,15 @@ u64 get_kvmclock_ns(struct kvm *kvm)
28002800 unsigned long flags ;
28012801 u64 ret ;
28022802
2803- spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
2803+ raw_spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
28042804 if (!ka -> use_master_clock ) {
2805- spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
2805+ raw_spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
28062806 return get_kvmclock_base_ns () + ka -> kvmclock_offset ;
28072807 }
28082808
28092809 hv_clock .tsc_timestamp = ka -> master_cycle_now ;
28102810 hv_clock .system_time = ka -> master_kernel_ns + ka -> kvmclock_offset ;
2811- spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
2811+ raw_spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
28122812
28132813 /* both __this_cpu_read() and rdtsc() should be on the same cpu */
28142814 get_cpu ();
@@ -2902,13 +2902,13 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
29022902 * If the host uses TSC clock, then passthrough TSC as stable
29032903 * to the guest.
29042904 */
2905- spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
2905+ raw_spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
29062906 use_master_clock = ka -> use_master_clock ;
29072907 if (use_master_clock ) {
29082908 host_tsc = ka -> master_cycle_now ;
29092909 kernel_ns = ka -> master_kernel_ns ;
29102910 }
2911- spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
2911+ raw_spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
29122912
29132913 /* Keep irq disabled to prevent changes to the clock */
29142914 local_irq_save (flags );
@@ -6100,13 +6100,13 @@ long kvm_arch_vm_ioctl(struct file *filp,
61006100 * is slightly ahead) here we risk going negative on unsigned
61016101 * 'system_time' when 'user_ns.clock' is very small.
61026102 */
6103- spin_lock_irq (& ka -> pvclock_gtod_sync_lock );
6103+ raw_spin_lock_irq (& ka -> pvclock_gtod_sync_lock );
61046104 if (kvm -> arch .use_master_clock )
61056105 now_ns = ka -> master_kernel_ns ;
61066106 else
61076107 now_ns = get_kvmclock_base_ns ();
61086108 ka -> kvmclock_offset = user_ns .clock - now_ns ;
6109- spin_unlock_irq (& ka -> pvclock_gtod_sync_lock );
6109+ raw_spin_unlock_irq (& ka -> pvclock_gtod_sync_lock );
61106110
61116111 kvm_make_all_cpus_request (kvm , KVM_REQ_CLOCK_UPDATE );
61126112 break ;
@@ -8156,9 +8156,9 @@ static void kvm_hyperv_tsc_notifier(void)
81568156 list_for_each_entry (kvm , & vm_list , vm_list ) {
81578157 struct kvm_arch * ka = & kvm -> arch ;
81588158
8159- spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
8159+ raw_spin_lock_irqsave (& ka -> pvclock_gtod_sync_lock , flags );
81608160 pvclock_update_vm_gtod_copy (kvm );
8161- spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
8161+ raw_spin_unlock_irqrestore (& ka -> pvclock_gtod_sync_lock , flags );
81628162
81638163 kvm_for_each_vcpu (cpu , vcpu , kvm )
81648164 kvm_make_request (KVM_REQ_CLOCK_UPDATE , vcpu );
@@ -8800,9 +8800,17 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu)
88008800
88018801 kvm_run -> cr8 = kvm_get_cr8 (vcpu );
88028802 kvm_run -> apic_base = kvm_get_apic_base (vcpu );
8803+
8804+ /*
8805+ * The call to kvm_ready_for_interrupt_injection() may end up in
8806+ * kvm_xen_has_interrupt() which may require the srcu lock to be
8807+ * held, to protect against changes in the vcpu_info address.
8808+ */
8809+ vcpu -> srcu_idx = srcu_read_lock (& vcpu -> kvm -> srcu );
88038810 kvm_run -> ready_for_interrupt_injection =
88048811 pic_in_kernel (vcpu -> kvm ) ||
88058812 kvm_vcpu_ready_for_interrupt_injection (vcpu );
8813+ srcu_read_unlock (& vcpu -> kvm -> srcu , vcpu -> srcu_idx );
88068814
88078815 if (is_smm (vcpu ))
88088816 kvm_run -> flags |= KVM_RUN_X86_SMM ;
@@ -11199,7 +11207,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
1119911207
1120011208 raw_spin_lock_init (& kvm -> arch .tsc_write_lock );
1120111209 mutex_init (& kvm -> arch .apic_map_lock );
11202- spin_lock_init (& kvm -> arch .pvclock_gtod_sync_lock );
11210+ raw_spin_lock_init (& kvm -> arch .pvclock_gtod_sync_lock );
1120311211
1120411212 kvm -> arch .kvmclock_offset = - get_kvmclock_base_ns ();
1120511213 pvclock_update_vm_gtod_copy (kvm );
0 commit comments