Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F111880309
D27301.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D27301.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D27301: Pull the check for VM ownership into ppt_find().
Attached
Detach File
Event Timeline
Log In to Comment