]> git.hungrycats.org Git - linux/commitdiff
KVM: x86: flush pending lapic jump label updates on module unload
authorDavid Matlack <dmatlack@google.com>
Fri, 16 Dec 2016 22:30:36 +0000 (14:30 -0800)
committerJiri Slaby <jslaby@suse.cz>
Thu, 26 Jan 2017 16:40:36 +0000 (17:40 +0100)
commit cef84c302fe051744b983a92764d3fcca933415d upstream.

KVM's lapic emulation uses static_key_deferred (apic_{hw,sw}_disabled).
These are implemented with delayed_work structs which can still be
pending when the KVM module is unloaded. We've seen this cause kernel
panics when the kvm_intel module is quickly reloaded.

Use the new static_key_deferred_flush() API to flush pending updates on
module unload.

Signed-off-by: David Matlack <dmatlack@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
arch/x86/kvm/lapic.c
arch/x86/kvm/lapic.h
arch/x86/kvm/x86.c

index a4ce2b2f14186e5518b08496aa2a20001079b1a8..33d479540373a774c8f6f2d50104a2f46bee4974 100644 (file)
@@ -1908,3 +1908,9 @@ void kvm_lapic_init(void)
        jump_label_rate_limit(&apic_hw_disabled, HZ);
        jump_label_rate_limit(&apic_sw_disabled, HZ);
 }
+
+void kvm_lapic_exit(void)
+{
+       static_key_deferred_flush(&apic_hw_disabled);
+       static_key_deferred_flush(&apic_sw_disabled);
+}
index fc87568fc4093177b48192954408da6f58105b07..f1fd0753b6ba22c6368618b106a7cf0207cc5e22 100644 (file)
@@ -93,6 +93,7 @@ static inline bool kvm_hv_vapic_assist_page_enabled(struct kvm_vcpu *vcpu)
 
 int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data);
 void kvm_lapic_init(void);
+void kvm_lapic_exit(void);
 
 static inline u32 kvm_apic_get_reg(struct kvm_lapic *apic, int reg_off)
 {
index 8562aff688841d42a1e5accc03aeb546ae565a8e..69e7b0b9a6bbfba2d4b8a91a7898b919b84b414e 100644 (file)
@@ -5573,6 +5573,7 @@ out:
 
 void kvm_arch_exit(void)
 {
+       kvm_lapic_exit();
        perf_unregister_guest_info_callbacks(&kvm_guest_cbs);
 
        if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))