diff options
author | Weidong Han <weidong.han@intel.com> | 2008-12-02 08:24:23 -0500 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-01-03 08:02:19 -0500 |
commit | 0a920356748df4fb06e86c21c23d2ed6d31d37ad (patch) | |
tree | 545bf8591b48b8f33af3f03f50a536424853a259 /virt/kvm/kvm_main.c | |
parent | 260782bcfdaaa7850f29d6bb2ec6603019168c57 (diff) |
KVM: support device deassignment
Support device deassignment, it can be used in device hotplug.
Signed-off-by: Weidong Han <weidong.han@intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r-- | virt/kvm/kvm_main.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c92b63462b79..3238e08e4651 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -530,6 +530,35 @@ out_free: | |||
530 | } | 530 | } |
531 | #endif | 531 | #endif |
532 | 532 | ||
533 | #ifdef KVM_CAP_DEVICE_DEASSIGNMENT | ||
534 | static int kvm_vm_ioctl_deassign_device(struct kvm *kvm, | ||
535 | struct kvm_assigned_pci_dev *assigned_dev) | ||
536 | { | ||
537 | int r = 0; | ||
538 | struct kvm_assigned_dev_kernel *match; | ||
539 | |||
540 | mutex_lock(&kvm->lock); | ||
541 | |||
542 | match = kvm_find_assigned_dev(&kvm->arch.assigned_dev_head, | ||
543 | assigned_dev->assigned_dev_id); | ||
544 | if (!match) { | ||
545 | printk(KERN_INFO "%s: device hasn't been assigned before, " | ||
546 | "so cannot be deassigned\n", __func__); | ||
547 | r = -EINVAL; | ||
548 | goto out; | ||
549 | } | ||
550 | |||
551 | if (assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU) | ||
552 | kvm_deassign_device(kvm, match); | ||
553 | |||
554 | kvm_free_assigned_device(kvm, match); | ||
555 | |||
556 | out: | ||
557 | mutex_unlock(&kvm->lock); | ||
558 | return r; | ||
559 | } | ||
560 | #endif | ||
561 | |||
533 | static inline int valid_vcpu(int n) | 562 | static inline int valid_vcpu(int n) |
534 | { | 563 | { |
535 | return likely(n >= 0 && n < KVM_MAX_VCPUS); | 564 | return likely(n >= 0 && n < KVM_MAX_VCPUS); |
@@ -1863,6 +1892,19 @@ static long kvm_vm_ioctl(struct file *filp, | |||
1863 | break; | 1892 | break; |
1864 | } | 1893 | } |
1865 | #endif | 1894 | #endif |
1895 | #ifdef KVM_CAP_DEVICE_DEASSIGNMENT | ||
1896 | case KVM_DEASSIGN_PCI_DEVICE: { | ||
1897 | struct kvm_assigned_pci_dev assigned_dev; | ||
1898 | |||
1899 | r = -EFAULT; | ||
1900 | if (copy_from_user(&assigned_dev, argp, sizeof assigned_dev)) | ||
1901 | goto out; | ||
1902 | r = kvm_vm_ioctl_deassign_device(kvm, &assigned_dev); | ||
1903 | if (r) | ||
1904 | goto out; | ||
1905 | break; | ||
1906 | } | ||
1907 | #endif | ||
1866 | default: | 1908 | default: |
1867 | r = kvm_arch_vm_ioctl(filp, ioctl, arg); | 1909 | r = kvm_arch_vm_ioctl(filp, ioctl, arg); |
1868 | } | 1910 | } |