From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] KVM: x86: cancel delayed EOI work on vm shutdown Date: Tue, 28 Apr 2015 16:13:33 +0200 Message-ID: <553F958D.40509@redhat.com> References: <1430229615-19990-1-git-send-email-rkrcmar@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm@vger.kernel.org To: =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , linux-kernel@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:41931 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030355AbbD1ONh (ORCPT ); Tue, 28 Apr 2015 10:13:37 -0400 In-Reply-To: <1430229615-19990-1-git-send-email-rkrcmar@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 28/04/2015 16:00, Radim Kr=C4=8Dm=C3=A1=C5=99 wrote: > kvm_ioapic_eoi_inject_work() can be called after ioapic has been free= d, > fix it by cancelling its delayed work via a slightly better freeing. > (Could have been a one-liner.) >=20 > Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 > --- > I noticed it while reviewing the "KVM: x86: drop unneeded null test"= , > so it applies after. >=20 > arch/x86/kvm/ioapic.c | 6 ++++++ > arch/x86/kvm/ioapic.h | 1 + > arch/x86/kvm/x86.c | 2 +- > 3 files changed, 8 insertions(+), 1 deletion(-) >=20 > diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c > index 09828e2cacfb..88de47ba4058 100644 > --- a/arch/x86/kvm/ioapic.c > +++ b/arch/x86/kvm/ioapic.c > @@ -642,6 +642,12 @@ void kvm_ioapic_destroy(struct kvm *kvm) > kfree(ioapic); > } > =20 > +void kvm_free_ioapic(struct kvm *kvm) > +{ > + if (kvm->arch.vioapic) > + kvm_ioapic_destroy(kvm); > +} > + > int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state) > { > struct kvm_ioapic *ioapic =3D ioapic_irqchip(kvm); > diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h > index ca0b0b4e6256..7c5579c24fc8 100644 > --- a/arch/x86/kvm/ioapic.h > +++ b/arch/x86/kvm/ioapic.h > @@ -122,5 +122,6 @@ int kvm_get_ioapic(struct kvm *kvm, struct kvm_io= apic_state *state); > int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state); > void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitm= ap, > u32 *tmr); > +void kvm_free_ioapic(struct kvm *kvm); > =20 > #endif > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index c73efcd03e29..bb7f1b5881d5 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -7468,6 +7468,7 @@ void kvm_arch_sync_events(struct kvm *kvm) > cancel_delayed_work_sync(&kvm->arch.kvmclock_update_work); > kvm_free_all_assigned_devices(kvm); > kvm_free_pit(kvm); > + kvm_free_ioapic(kvm); > } > =20 > void kvm_arch_destroy_vm(struct kvm *kvm) > @@ -7491,7 +7492,6 @@ void kvm_arch_destroy_vm(struct kvm *kvm) > } > kvm_iommu_unmap_guest(kvm); > kfree(kvm->arch.vpic); > - kfree(kvm->arch.vioapic); > kvm_free_vcpus(kvm); > kfree(rcu_dereference_check(kvm->arch.apic_map, 1)); > } >=20 You beat me. :) Reviewed-by: Paolo Bonzini and will apply it too. Paolo