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: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
Родитель
82ce2c9683
Коммит
d589444e92
|
@ -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_create_lapic(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);
|
||||
void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8);
|
||||
void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value);
|
||||
|
|
|
@ -268,10 +268,8 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_init);
|
|||
|
||||
void kvm_vcpu_uninit(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
kvm_free_lapic(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->run);
|
||||
}
|
||||
|
|
|
@ -762,19 +762,17 @@ static int apic_mmio_range(struct kvm_io_device *this, gpa_t addr)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void kvm_free_apic(struct kvm_lapic *apic)
|
||||
void kvm_free_lapic(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (!apic)
|
||||
if (!vcpu->apic)
|
||||
return;
|
||||
|
||||
hrtimer_cancel(&apic->timer.dev);
|
||||
hrtimer_cancel(&vcpu->apic->timer.dev);
|
||||
|
||||
if (apic->regs_page) {
|
||||
__free_page(apic->regs_page);
|
||||
apic->regs_page = 0;
|
||||
}
|
||||
if (vcpu->apic->regs_page)
|
||||
__free_page(vcpu->apic->regs_page);
|
||||
|
||||
kfree(apic);
|
||||
kfree(vcpu->apic);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -962,7 +960,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
|
|||
if (apic->regs_page == NULL) {
|
||||
printk(KERN_ERR "malloc apic regs error for vcpu %x\n",
|
||||
vcpu->vcpu_id);
|
||||
goto nomem;
|
||||
goto nomem_free_apic;
|
||||
}
|
||||
apic->regs = page_address(apic->regs_page);
|
||||
memset(apic->regs, 0, PAGE_SIZE);
|
||||
|
@ -980,8 +978,9 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
|
|||
apic->dev.private = apic;
|
||||
|
||||
return 0;
|
||||
nomem_free_apic:
|
||||
kfree(apic);
|
||||
nomem:
|
||||
kvm_free_apic(apic);
|
||||
return -ENOMEM;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_create_lapic);
|
||||
|
|
Загрузка…
Ссылка в новой задаче