Skip to content

Commit

Permalink
KVM: x86: make pic setup code look like ioapic setup
Browse files Browse the repository at this point in the history
We don't treat kvm->arch.vpic specially anymore, so the setup can look
like ioapic.  This gets a bit more information out of return values.

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Radim Krčmář committed Jan 9, 2017
1 parent 49776fa commit 0994136
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 22 deletions.
16 changes: 11 additions & 5 deletions arch/x86/kvm/i8259.c
Original file line number Diff line number Diff line change
Expand Up @@ -598,14 +598,14 @@ static const struct kvm_io_device_ops picdev_eclr_ops = {
.write = picdev_eclr_write,
};

struct kvm_pic *kvm_create_pic(struct kvm *kvm)
int kvm_pic_init(struct kvm *kvm)
{
struct kvm_pic *s;
int ret;

s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL);
if (!s)
return NULL;
return -ENOMEM;
spin_lock_init(&s->lock);
s->kvm = kvm;
s->pics[0].elcr_mask = 0xf8;
Expand Down Expand Up @@ -635,7 +635,9 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm)

mutex_unlock(&kvm->slots_lock);

return s;
kvm->arch.vpic = s;

return 0;

fail_unreg_1:
kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &s->dev_slave);
Expand All @@ -648,13 +650,17 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm)

kfree(s);

return NULL;
return ret;
}

void kvm_destroy_pic(struct kvm_pic *vpic)
void kvm_pic_destroy(struct kvm *kvm)
{
struct kvm_pic *vpic = kvm->arch.vpic;

kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_master);
kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_slave);
kvm_io_bus_unregister_dev(vpic->kvm, KVM_PIO_BUS, &vpic->dev_eclr);

kvm->arch.vpic = NULL;
kfree(vpic);
}
4 changes: 2 additions & 2 deletions arch/x86/kvm/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ struct kvm_pic {
unsigned long irq_states[PIC_NUM_PINS];
};

struct kvm_pic *kvm_create_pic(struct kvm *kvm);
void kvm_destroy_pic(struct kvm_pic *vpic);
int kvm_pic_init(struct kvm *kvm);
void kvm_pic_destroy(struct kvm *kvm);
int kvm_pic_read_irq(struct kvm *kvm);
void kvm_pic_update_irq(struct kvm_pic *s);

Expand Down
30 changes: 15 additions & 15 deletions arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -3957,41 +3957,41 @@ long kvm_arch_vm_ioctl(struct file *filp,
r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
break;
case KVM_CREATE_IRQCHIP: {
struct kvm_pic *vpic;

mutex_lock(&kvm->lock);

r = -EEXIST;
if (irqchip_in_kernel(kvm))
goto create_irqchip_unlock;

r = -EINVAL;
if (kvm->created_vcpus)
goto create_irqchip_unlock;
r = -ENOMEM;
vpic = kvm_create_pic(kvm);
if (vpic) {
r = kvm_ioapic_init(kvm);
if (r) {
mutex_lock(&kvm->slots_lock);
kvm_destroy_pic(vpic);
mutex_unlock(&kvm->slots_lock);
goto create_irqchip_unlock;
}
} else

r = kvm_pic_init(kvm);
if (r)
goto create_irqchip_unlock;

r = kvm_ioapic_init(kvm);
if (r) {
mutex_lock(&kvm->slots_lock);
kvm_pic_destroy(kvm);
mutex_unlock(&kvm->slots_lock);
goto create_irqchip_unlock;
}

r = kvm_setup_default_irq_routing(kvm);
if (r) {
mutex_lock(&kvm->slots_lock);
mutex_lock(&kvm->irq_lock);
kvm_ioapic_destroy(kvm);
kvm_destroy_pic(vpic);
kvm_pic_destroy(kvm);
mutex_unlock(&kvm->irq_lock);
mutex_unlock(&kvm->slots_lock);
goto create_irqchip_unlock;
}
/* Write kvm->irq_routing before enabling irqchip_in_kernel. */
smp_wmb();
kvm->arch.irqchip_mode = KVM_IRQCHIP_KERNEL;
kvm->arch.vpic = vpic;
create_irqchip_unlock:
mutex_unlock(&kvm->lock);
break;
Expand Down

0 comments on commit 0994136

Please sign in to comment.