Page MenuHomeFreeBSD

D27301.diff
No OneTemporary

D27301.diff

Index: head/sys/amd64/vmm/io/ppt.c
===================================================================
--- head/sys/amd64/vmm/io/ppt.c
+++ head/sys/amd64/vmm/io/ppt.c
@@ -199,8 +199,8 @@
DEFINE_CLASS_0(ppt, ppt_driver, ppt_methods, sizeof(struct pptdev));
DRIVER_MODULE(ppt, pci, ppt_driver, ppt_devclass, NULL, NULL);
-static struct pptdev *
-ppt_find(int bus, int slot, int func)
+static int
+ppt_find(struct vm *vm, int bus, int slot, int func, struct pptdev **pptp)
{
device_t dev;
struct pptdev *ppt;
@@ -212,9 +212,15 @@
s = pci_get_slot(dev);
f = pci_get_function(dev);
if (bus == b && slot == s && func == f)
- return (ppt);
+ break;
}
- return (NULL);
+
+ if (ppt == NULL)
+ return (ENOENT);
+ if (ppt->vm != vm) /* Make sure we own this device */
+ return (EBUSY);
+ *pptp = ppt;
+ return (0);
}
static void
@@ -378,50 +384,40 @@
ppt_assign_device(struct vm *vm, int bus, int slot, int func)
{
struct pptdev *ppt;
+ int error;
- ppt = ppt_find(bus, slot, func);
- if (ppt != NULL) {
- /*
- * If this device is owned by a different VM then we
- * cannot change its owner.
- */
- if (ppt->vm != NULL && ppt->vm != vm)
- return (EBUSY);
+ /* Passing NULL requires the device to be unowned. */
+ error = ppt_find(NULL, bus, slot, func, &ppt);
+ if (error)
+ return (error);
- pci_save_state(ppt->dev);
- ppt_pci_reset(ppt->dev);
- pci_restore_state(ppt->dev);
- ppt->vm = vm;
- iommu_add_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
- return (0);
- }
- return (ENOENT);
+ pci_save_state(ppt->dev);
+ ppt_pci_reset(ppt->dev);
+ pci_restore_state(ppt->dev);
+ ppt->vm = vm;
+ iommu_add_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
+ return (0);
}
int
ppt_unassign_device(struct vm *vm, int bus, int slot, int func)
{
struct pptdev *ppt;
+ int error;
- ppt = ppt_find(bus, slot, func);
- if (ppt != NULL) {
- /*
- * If this device is not owned by this 'vm' then bail out.
- */
- if (ppt->vm != vm)
- return (EBUSY);
+ error = ppt_find(vm, bus, slot, func, &ppt);
+ if (error)
+ return (error);
- pci_save_state(ppt->dev);
- ppt_pci_reset(ppt->dev);
- pci_restore_state(ppt->dev);
- ppt_unmap_mmio(vm, ppt);
- ppt_teardown_msi(ppt);
- ppt_teardown_msix(ppt);
- iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
- ppt->vm = NULL;
- return (0);
- }
- return (ENOENT);
+ pci_save_state(ppt->dev);
+ ppt_pci_reset(ppt->dev);
+ pci_restore_state(ppt->dev);
+ ppt_unmap_mmio(vm, ppt);
+ ppt_teardown_msi(ppt);
+ ppt_teardown_msix(ppt);
+ iommu_remove_device(vm_iommu_domain(vm), pci_get_rid(ppt->dev));
+ ppt->vm = NULL;
+ return (0);
}
int
@@ -452,25 +448,22 @@
struct pptseg *seg;
struct pptdev *ppt;
- ppt = ppt_find(bus, slot, func);
- if (ppt != NULL) {
- if (ppt->vm != vm)
- return (EBUSY);
+ error = ppt_find(vm, bus, slot, func, &ppt);
+ if (error)
+ return (error);
- for (i = 0; i < MAX_MMIOSEGS; i++) {
- seg = &ppt->mmio[i];
- if (seg->len == 0) {
- error = vm_map_mmio(vm, gpa, len, hpa);
- if (error == 0) {
- seg->gpa = gpa;
- seg->len = len;
- }
- return (error);
+ for (i = 0; i < MAX_MMIOSEGS; i++) {
+ seg = &ppt->mmio[i];
+ if (seg->len == 0) {
+ error = vm_map_mmio(vm, gpa, len, hpa);
+ if (error == 0) {
+ seg->gpa = gpa;
+ seg->len = len;
}
+ return (error);
}
- return (ENOSPC);
}
- return (ENOENT);
+ return (ENOSPC);
}
static int
@@ -512,11 +505,9 @@
if (numvec < 0 || numvec > MAX_MSIMSGS)
return (EINVAL);
- ppt = ppt_find(bus, slot, func);
- if (ppt == NULL)
- return (ENOENT);
- if (ppt->vm != vm) /* Make sure we own this device */
- return (EBUSY);
+ error = ppt_find(vm, bus, slot, func, &ppt);
+ if (error)
+ return (error);
/* Reject attempts to enable MSI while MSI-X is active. */
if (ppt->msix.num_msgs != 0 && numvec != 0)
@@ -605,11 +596,9 @@
int numvec, alloced, rid, error;
size_t res_size, cookie_size, arg_size;
- ppt = ppt_find(bus, slot, func);
- if (ppt == NULL)
- return (ENOENT);
- if (ppt->vm != vm) /* Make sure we own this device */
- return (EBUSY);
+ error = ppt_find(vm, bus, slot, func, &ppt);
+ if (error)
+ return (error);
/* Reject attempts to enable MSI-X while MSI is active. */
if (ppt->msi.num_msgs != 0)
@@ -713,12 +702,11 @@
ppt_disable_msix(struct vm *vm, int bus, int slot, int func)
{
struct pptdev *ppt;
+ int error;
- ppt = ppt_find(bus, slot, func);
- if (ppt == NULL)
- return (ENOENT);
- if (ppt->vm != vm) /* Make sure we own this device */
- return (EBUSY);
+ error = ppt_find(vm, bus, slot, func, &ppt);
+ if (error)
+ return (error);
ppt_teardown_msix(ppt);
return (0);

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 10, 5:51 PM (16 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17087578
Default Alt Text
D27301.diff (4 KB)

Event Timeline