aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorSteve Rutherford <srutherford@google.com>2015-07-30 02:21:40 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2015-10-01 09:06:26 -0400
commit49df6397edfc5a8ba8ca813b51fb9729d8e94b40 (patch)
treeb5cb29a28fff01c9c85c4f02961164532fa241b2 /arch/x86/kvm/x86.c
parent4ca7dd8ce4b24e18f94eed90e80c6eb80fb48c9a (diff)
KVM: x86: Split the APIC from the rest of IRQCHIP.
First patch in a series which enables the relocation of the PIC/IOAPIC to userspace. Adds capability KVM_CAP_SPLIT_IRQCHIP; KVM_CAP_SPLIT_IRQCHIP enables the construction of LAPICs without the rest of the irqchip. Compile tested for x86. Signed-off-by: Steve Rutherford <srutherford@google.com> Suggested-by: Andrew Honig <ahonig@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 28c98c8f9d1c..f720774a4797 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2448,6 +2448,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
2448 case KVM_CAP_ENABLE_CAP_VM: 2448 case KVM_CAP_ENABLE_CAP_VM:
2449 case KVM_CAP_DISABLE_QUIRKS: 2449 case KVM_CAP_DISABLE_QUIRKS:
2450 case KVM_CAP_SET_BOOT_CPU_ID: 2450 case KVM_CAP_SET_BOOT_CPU_ID:
2451 case KVM_CAP_SPLIT_IRQCHIP:
2451#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT 2452#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
2452 case KVM_CAP_ASSIGN_DEV_IRQ: 2453 case KVM_CAP_ASSIGN_DEV_IRQ:
2453 case KVM_CAP_PCI_2_3: 2454 case KVM_CAP_PCI_2_3:
@@ -3555,6 +3556,24 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
3555 kvm->arch.disabled_quirks = cap->args[0]; 3556 kvm->arch.disabled_quirks = cap->args[0];
3556 r = 0; 3557 r = 0;
3557 break; 3558 break;
3559 case KVM_CAP_SPLIT_IRQCHIP: {
3560 mutex_lock(&kvm->lock);
3561 r = -EEXIST;
3562 if (irqchip_in_kernel(kvm))
3563 goto split_irqchip_unlock;
3564 if (atomic_read(&kvm->online_vcpus))
3565 goto split_irqchip_unlock;
3566 r = kvm_setup_empty_irq_routing(kvm);
3567 if (r)
3568 goto split_irqchip_unlock;
3569 /* Pairs with irqchip_in_kernel. */
3570 smp_wmb();
3571 kvm->arch.irqchip_split = true;
3572 r = 0;
3573split_irqchip_unlock:
3574 mutex_unlock(&kvm->lock);
3575 break;
3576 }
3558 default: 3577 default:
3559 r = -EINVAL; 3578 r = -EINVAL;
3560 break; 3579 break;
@@ -3668,7 +3687,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
3668 } 3687 }
3669 3688
3670 r = -ENXIO; 3689 r = -ENXIO;
3671 if (!irqchip_in_kernel(kvm)) 3690 if (!irqchip_in_kernel(kvm) || irqchip_split(kvm))
3672 goto get_irqchip_out; 3691 goto get_irqchip_out;
3673 r = kvm_vm_ioctl_get_irqchip(kvm, chip); 3692 r = kvm_vm_ioctl_get_irqchip(kvm, chip);
3674 if (r) 3693 if (r)
@@ -3692,7 +3711,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
3692 } 3711 }
3693 3712
3694 r = -ENXIO; 3713 r = -ENXIO;
3695 if (!irqchip_in_kernel(kvm)) 3714 if (!irqchip_in_kernel(kvm) || irqchip_split(kvm))
3696 goto set_irqchip_out; 3715 goto set_irqchip_out;
3697 r = kvm_vm_ioctl_set_irqchip(kvm, chip); 3716 r = kvm_vm_ioctl_set_irqchip(kvm, chip);
3698 if (r) 3717 if (r)