diff options
author | Steve Rutherford <srutherford@google.com> | 2015-07-30 02:21:40 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-10-01 09:06:26 -0400 |
commit | 49df6397edfc5a8ba8ca813b51fb9729d8e94b40 (patch) | |
tree | b5cb29a28fff01c9c85c4f02961164532fa241b2 /arch/x86/kvm/x86.c | |
parent | 4ca7dd8ce4b24e18f94eed90e80c6eb80fb48c9a (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.c | 23 |
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; | ||
3573 | split_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) |