MFC 260972:

There is no need to initialize the IOMMU if no passthru devices have been
configured for bhyve to use.
This commit is contained in:
jhb 2014-06-04 17:57:48 +00:00
parent d820529bb0
commit 79dc832193
4 changed files with 34 additions and 7 deletions

View File

@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h> #include <sys/types.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/bus.h> #include <sys/bus.h>
#include <sys/sysctl.h>
#include <dev/pci/pcivar.h> #include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h> #include <dev/pci/pcireg.h>
@ -43,7 +44,13 @@ __FBSDID("$FreeBSD$");
#include "vmm_mem.h" #include "vmm_mem.h"
#include "iommu.h" #include "iommu.h"
static boolean_t iommu_avail; SYSCTL_DECL(_hw_vmm);
SYSCTL_NODE(_hw_vmm, OID_AUTO, iommu, CTLFLAG_RW, 0, "bhyve iommu parameters");
static int iommu_avail;
SYSCTL_INT(_hw_vmm_iommu, OID_AUTO, initialized, CTLFLAG_RD, &iommu_avail,
0, "bhyve iommu initialized?");
static struct iommu_ops *ops; static struct iommu_ops *ops;
static void *host_domain; static void *host_domain;
@ -160,7 +167,7 @@ iommu_init(void)
if (error) if (error)
return; return;
iommu_avail = TRUE; iommu_avail = 1;
/* /*
* Create a domain for the devices owned by the host * Create a domain for the devices owned by the host

View File

@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/pciio.h> #include <sys/pciio.h>
#include <sys/rman.h> #include <sys/rman.h>
#include <sys/smp.h> #include <sys/smp.h>
#include <sys/sysctl.h>
#include <dev/pci/pcivar.h> #include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h> #include <dev/pci/pcireg.h>
@ -100,7 +101,12 @@ static struct pptdev {
} msix; } msix;
} pptdevs[64]; } pptdevs[64];
SYSCTL_DECL(_hw_vmm);
SYSCTL_NODE(_hw_vmm, OID_AUTO, ppt, CTLFLAG_RW, 0, "bhyve passthru devices");
static int num_pptdevs; static int num_pptdevs;
SYSCTL_INT(_hw_vmm_ppt, OID_AUTO, devices, CTLFLAG_RD, &num_pptdevs, 0,
"number of pci passthru devices");
static int static int
ppt_probe(device_t dev) ppt_probe(device_t dev)
@ -282,7 +288,14 @@ ppt_teardown_msix(struct pptdev *ppt)
} }
int int
ppt_num_devices(struct vm *vm) ppt_avail_devices(void)
{
return (num_pptdevs);
}
int
ppt_assigned_devices(struct vm *vm)
{ {
int i, num; int i, num;

View File

@ -36,9 +36,15 @@ int ppt_setup_msi(struct vm *vm, int vcpu, int bus, int slot, int func,
uint64_t addr, uint64_t msg, int numvec); uint64_t addr, uint64_t msg, int numvec);
int ppt_setup_msix(struct vm *vm, int vcpu, int bus, int slot, int func, int ppt_setup_msix(struct vm *vm, int vcpu, int bus, int slot, int func,
int idx, uint64_t addr, uint64_t msg, uint32_t vector_control); int idx, uint64_t addr, uint64_t msg, uint32_t vector_control);
int ppt_num_devices(struct vm *vm); int ppt_assigned_devices(struct vm *vm);
boolean_t ppt_is_mmio(struct vm *vm, vm_paddr_t gpa); boolean_t ppt_is_mmio(struct vm *vm, vm_paddr_t gpa);
/*
* Returns the number of devices sequestered by the ppt driver for assignment
* to virtual machines.
*/
int ppt_avail_devices(void);
/* /*
* The following functions should never be called directly. * The following functions should never be called directly.
* Use 'vm_assign_pptdev()' and 'vm_unassign_pptdev()' instead. * Use 'vm_assign_pptdev()' and 'vm_unassign_pptdev()' instead.

View File

@ -266,6 +266,7 @@ vmm_handler(module_t mod, int what, void *arg)
switch (what) { switch (what) {
case MOD_LOAD: case MOD_LOAD:
vmmdev_init(); vmmdev_init();
if (ppt_avail_devices() > 0)
iommu_init(); iommu_init();
error = vmm_init(); error = vmm_init();
if (error == 0) if (error == 0)
@ -604,7 +605,7 @@ vm_unassign_pptdev(struct vm *vm, int bus, int slot, int func)
if (error) if (error)
return (error); return (error);
if (ppt_num_devices(vm) == 0) { if (ppt_assigned_devices(vm) == 0) {
vm_iommu_unmap(vm); vm_iommu_unmap(vm);
vm_gpa_unwire(vm); vm_gpa_unwire(vm);
} }
@ -624,7 +625,7 @@ vm_assign_pptdev(struct vm *vm, int bus, int slot, int func)
* *
* We need to do this before the first pci passthru device is attached. * We need to do this before the first pci passthru device is attached.
*/ */
if (ppt_num_devices(vm) == 0) { if (ppt_assigned_devices(vm) == 0) {
KASSERT(vm->iommu == NULL, KASSERT(vm->iommu == NULL,
("vm_assign_pptdev: iommu must be NULL")); ("vm_assign_pptdev: iommu must be NULL"));
maxaddr = vmm_mem_maxaddr(); maxaddr = vmm_mem_maxaddr();