Commit d589444e authored by Rusty Russell's avatar Rusty Russell Committed by Avi Kivity

KVM: Add kvm_free_lapic() to pair with kvm_create_lapic()

Instead of the asymetry of kvm_free_apic, implement kvm_free_lapic().
And guess what?  I found a minor bug: we don't need to hrtimer_cancel()
from kvm_main.c, because we do that in kvm_free_apic().

Also:
1) kvm_vcpu_uninit should be the reverse order from kvm_vcpu_init.
2) Don't set apic->regs_page to zero before freeing apic.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 82ce2c96
...@@ -139,7 +139,7 @@ int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu); ...@@ -139,7 +139,7 @@ int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu);
int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu); int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu);
int kvm_create_lapic(struct kvm_vcpu *vcpu); int kvm_create_lapic(struct kvm_vcpu *vcpu);
void kvm_lapic_reset(struct kvm_vcpu *vcpu); void kvm_lapic_reset(struct kvm_vcpu *vcpu);
void kvm_free_apic(struct kvm_lapic *apic); void kvm_free_lapic(struct kvm_vcpu *vcpu);
u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu); u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu);
void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8); void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8);
void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value); void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value);
......
...@@ -268,10 +268,8 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_init); ...@@ -268,10 +268,8 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_init);
void kvm_vcpu_uninit(struct kvm_vcpu *vcpu) void kvm_vcpu_uninit(struct kvm_vcpu *vcpu)
{ {
kvm_free_lapic(vcpu);
kvm_mmu_destroy(vcpu); kvm_mmu_destroy(vcpu);
if (vcpu->apic)
hrtimer_cancel(&vcpu->apic->timer.dev);
kvm_free_apic(vcpu->apic);
free_page((unsigned long)vcpu->pio_data); free_page((unsigned long)vcpu->pio_data);
free_page((unsigned long)vcpu->run); free_page((unsigned long)vcpu->run);
} }
......
...@@ -762,19 +762,17 @@ static int apic_mmio_range(struct kvm_io_device *this, gpa_t addr) ...@@ -762,19 +762,17 @@ static int apic_mmio_range(struct kvm_io_device *this, gpa_t addr)
return ret; return ret;
} }
void kvm_free_apic(struct kvm_lapic *apic) void kvm_free_lapic(struct kvm_vcpu *vcpu)
{ {
if (!apic) if (!vcpu->apic)
return; return;
hrtimer_cancel(&apic->timer.dev); hrtimer_cancel(&vcpu->apic->timer.dev);
if (apic->regs_page) { if (vcpu->apic->regs_page)
__free_page(apic->regs_page); __free_page(vcpu->apic->regs_page);
apic->regs_page = 0;
}
kfree(apic); kfree(vcpu->apic);
} }
/* /*
...@@ -962,7 +960,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu) ...@@ -962,7 +960,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
if (apic->regs_page == NULL) { if (apic->regs_page == NULL) {
printk(KERN_ERR "malloc apic regs error for vcpu %x\n", printk(KERN_ERR "malloc apic regs error for vcpu %x\n",
vcpu->vcpu_id); vcpu->vcpu_id);
goto nomem; goto nomem_free_apic;
} }
apic->regs = page_address(apic->regs_page); apic->regs = page_address(apic->regs_page);
memset(apic->regs, 0, PAGE_SIZE); memset(apic->regs, 0, PAGE_SIZE);
...@@ -980,8 +978,9 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu) ...@@ -980,8 +978,9 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
apic->dev.private = apic; apic->dev.private = apic;
return 0; return 0;
nomem_free_apic:
kfree(apic);
nomem: nomem:
kvm_free_apic(apic);
return -ENOMEM; return -ENOMEM;
} }
EXPORT_SYMBOL_GPL(kvm_create_lapic); EXPORT_SYMBOL_GPL(kvm_create_lapic);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment