summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2013-09-11 07:11:14 +0000
committerneel <neel@FreeBSD.org>2013-09-11 07:11:14 +0000
commit348fe8d4cea62927fae0e4f13c251f403348e86c (patch)
tree0189e433f1a1ace4be960b766651bd7f2c1236a6
parentfee688be702f335d54aac7b404d77a37a0852936 (diff)
downloadFreeBSD-src-348fe8d4cea62927fae0e4f13c251f403348e86c.zip
FreeBSD-src-348fe8d4cea62927fae0e4f13c251f403348e86c.tar.gz
Fix a limitation in bhyve that would limit the number of virtual machines to
the maximum number of VT-d domains (256 on a Sandybridge). We now allocate a VT-d domain for a guest only if the administrator has explicitly configured one or more PCI passthru device(s). If there are no PCI passthru devices configured (the common case) then the number of virtual machines is no longer limited by the maximum number of VT-d domains. Reviewed by: grehan@ Approved by: re@
-rw-r--r--sys/amd64/vmm/io/ppt.c6
-rw-r--r--sys/amd64/vmm/io/ppt.h1
-rw-r--r--sys/amd64/vmm/vmm.c3
3 files changed, 9 insertions, 1 deletions
diff --git a/sys/amd64/vmm/io/ppt.c b/sys/amd64/vmm/io/ppt.c
index 878bf8a..64d9ff5 100644
--- a/sys/amd64/vmm/io/ppt.c
+++ b/sys/amd64/vmm/io/ppt.c
@@ -592,3 +592,9 @@ ppt_setup_msix(struct vm *vm, int vcpu, int bus, int slot, int func,
return (0);
}
+int
+ppt_num_devices(void)
+{
+
+ return (num_pptdevs);
+}
diff --git a/sys/amd64/vmm/io/ppt.h b/sys/amd64/vmm/io/ppt.h
index 63c8228..931893c 100644
--- a/sys/amd64/vmm/io/ppt.h
+++ b/sys/amd64/vmm/io/ppt.h
@@ -38,4 +38,5 @@ int ppt_setup_msi(struct vm *vm, int vcpu, int bus, int slot, int func,
int destcpu, int vector, int numvec);
int ppt_setup_msix(struct vm *vm, int vcpu, int bus, int slot, int func,
int idx, uint32_t msg, uint32_t vector_control, uint64_t addr);
+int ppt_num_devices(void);
#endif
diff --git a/sys/amd64/vmm/vmm.c b/sys/amd64/vmm/vmm.c
index b4f3c33..5fc6b94 100644
--- a/sys/amd64/vmm/vmm.c
+++ b/sys/amd64/vmm/vmm.c
@@ -213,7 +213,8 @@ vmm_handler(module_t mod, int what, void *arg)
switch (what) {
case MOD_LOAD:
vmmdev_init();
- iommu_init();
+ if (ppt_num_devices() > 0)
+ iommu_init();
error = vmm_init();
if (error == 0)
vmm_initialized = 1;
OpenPOWER on IntegriCloud