diff options
Diffstat (limited to 'virt/kvm/assigned-dev.c')
| -rw-r--r-- | virt/kvm/assigned-dev.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c index 01f572c10c71..23a41a9f8db9 100644 --- a/virt/kvm/assigned-dev.c +++ b/virt/kvm/assigned-dev.c | |||
| @@ -334,6 +334,11 @@ static int assigned_device_enable_host_intx(struct kvm *kvm, | |||
| 334 | } | 334 | } |
| 335 | 335 | ||
| 336 | #ifdef __KVM_HAVE_MSI | 336 | #ifdef __KVM_HAVE_MSI |
| 337 | static irqreturn_t kvm_assigned_dev_msi(int irq, void *dev_id) | ||
| 338 | { | ||
| 339 | return IRQ_WAKE_THREAD; | ||
| 340 | } | ||
| 341 | |||
| 337 | static int assigned_device_enable_host_msi(struct kvm *kvm, | 342 | static int assigned_device_enable_host_msi(struct kvm *kvm, |
| 338 | struct kvm_assigned_dev_kernel *dev) | 343 | struct kvm_assigned_dev_kernel *dev) |
| 339 | { | 344 | { |
| @@ -346,7 +351,7 @@ static int assigned_device_enable_host_msi(struct kvm *kvm, | |||
| 346 | } | 351 | } |
| 347 | 352 | ||
| 348 | dev->host_irq = dev->dev->irq; | 353 | dev->host_irq = dev->dev->irq; |
| 349 | if (request_threaded_irq(dev->host_irq, NULL, | 354 | if (request_threaded_irq(dev->host_irq, kvm_assigned_dev_msi, |
| 350 | kvm_assigned_dev_thread_msi, 0, | 355 | kvm_assigned_dev_thread_msi, 0, |
| 351 | dev->irq_name, dev)) { | 356 | dev->irq_name, dev)) { |
| 352 | pci_disable_msi(dev->dev); | 357 | pci_disable_msi(dev->dev); |
| @@ -358,6 +363,11 @@ static int assigned_device_enable_host_msi(struct kvm *kvm, | |||
| 358 | #endif | 363 | #endif |
| 359 | 364 | ||
| 360 | #ifdef __KVM_HAVE_MSIX | 365 | #ifdef __KVM_HAVE_MSIX |
| 366 | static irqreturn_t kvm_assigned_dev_msix(int irq, void *dev_id) | ||
| 367 | { | ||
| 368 | return IRQ_WAKE_THREAD; | ||
| 369 | } | ||
| 370 | |||
| 361 | static int assigned_device_enable_host_msix(struct kvm *kvm, | 371 | static int assigned_device_enable_host_msix(struct kvm *kvm, |
| 362 | struct kvm_assigned_dev_kernel *dev) | 372 | struct kvm_assigned_dev_kernel *dev) |
| 363 | { | 373 | { |
| @@ -374,7 +384,8 @@ static int assigned_device_enable_host_msix(struct kvm *kvm, | |||
| 374 | 384 | ||
| 375 | for (i = 0; i < dev->entries_nr; i++) { | 385 | for (i = 0; i < dev->entries_nr; i++) { |
| 376 | r = request_threaded_irq(dev->host_msix_entries[i].vector, | 386 | r = request_threaded_irq(dev->host_msix_entries[i].vector, |
| 377 | NULL, kvm_assigned_dev_thread_msix, | 387 | kvm_assigned_dev_msix, |
| 388 | kvm_assigned_dev_thread_msix, | ||
| 378 | 0, dev->irq_name, dev); | 389 | 0, dev->irq_name, dev); |
| 379 | if (r) | 390 | if (r) |
| 380 | goto err; | 391 | goto err; |
| @@ -635,7 +646,6 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
| 635 | int r = 0, idx; | 646 | int r = 0, idx; |
| 636 | struct kvm_assigned_dev_kernel *match; | 647 | struct kvm_assigned_dev_kernel *match; |
| 637 | struct pci_dev *dev; | 648 | struct pci_dev *dev; |
| 638 | u8 header_type; | ||
| 639 | 649 | ||
| 640 | if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)) | 650 | if (!(assigned_dev->flags & KVM_DEV_ASSIGN_ENABLE_IOMMU)) |
| 641 | return -EINVAL; | 651 | return -EINVAL; |
| @@ -668,8 +678,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, | |||
| 668 | } | 678 | } |
| 669 | 679 | ||
| 670 | /* Don't allow bridges to be assigned */ | 680 | /* Don't allow bridges to be assigned */ |
| 671 | pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type); | 681 | if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL) { |
| 672 | if ((header_type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) { | ||
| 673 | r = -EPERM; | 682 | r = -EPERM; |
| 674 | goto out_put; | 683 | goto out_put; |
| 675 | } | 684 | } |
