| From cef84c302fe051744b983a92764d3fcca933415d Mon Sep 17 00:00:00 2001 |
| From: David Matlack <dmatlack@google.com> |
| Date: Fri, 16 Dec 2016 14:30:36 -0800 |
| Subject: KVM: x86: flush pending lapic jump label updates on module unload |
| |
| From: David Matlack <dmatlack@google.com> |
| |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/lapic.c | 6 ++++++ |
| arch/x86/kvm/lapic.h | 1 + |
| arch/x86/kvm/x86.c | 1 + |
| 3 files changed, 8 insertions(+) |
| |
| --- a/arch/x86/kvm/lapic.c |
| +++ b/arch/x86/kvm/lapic.c |
| @@ -2187,3 +2187,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); |
| +} |
| --- a/arch/x86/kvm/lapic.h |
| +++ b/arch/x86/kvm/lapic.h |
| @@ -95,6 +95,7 @@ static inline bool kvm_hv_vapic_assist_p |
| |
| 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) |
| { |
| --- a/arch/x86/kvm/x86.c |
| +++ b/arch/x86/kvm/x86.c |
| @@ -5842,6 +5842,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)) |