svn commit: r246188 - in head/sys/amd64/vmm: . io
Neel Natu
neel at FreeBSD.org
Fri Feb 1 01:16:27 UTC 2013
Author: neel
Date: Fri Feb 1 01:16:26 2013
New Revision: 246188
URL: http://svnweb.freebsd.org/changeset/base/246188
Log:
Increase the number of passthru devices supported by bhyve.
The maximum length of an environment variable puts a limitation on the
number of passthru devices that can be specified via a single variable.
The workaround is to allow user to specify passthru devices via multiple
environment variables instead of a single one.
Obtained from: NetApp
Modified:
head/sys/amd64/vmm/io/ppt.c
head/sys/amd64/vmm/vmm.c
Modified: head/sys/amd64/vmm/io/ppt.c
==============================================================================
--- head/sys/amd64/vmm/io/ppt.c Fri Feb 1 00:32:01 2013 (r246187)
+++ head/sys/amd64/vmm/io/ppt.c Fri Feb 1 01:16:26 2013 (r246188)
@@ -89,7 +89,7 @@ static struct pptdev {
void **cookie;
struct pptintr_arg *arg;
} msix;
-} pptdevs[32];
+} pptdevs[64];
static int num_pptdevs;
Modified: head/sys/amd64/vmm/vmm.c
==============================================================================
--- head/sys/amd64/vmm/vmm.c Fri Feb 1 00:32:01 2013 (r246187)
+++ head/sys/amd64/vmm/vmm.c Fri Feb 1 01:16:26 2013 (r246188)
@@ -862,30 +862,42 @@ vm_lapic(struct vm *vm, int cpu)
boolean_t
vmm_is_pptdev(int bus, int slot, int func)
{
- int found, b, s, f, n;
+ int found, i, n;
+ int b, s, f;
char *val, *cp, *cp2;
/*
- * setenv pptdevs "1/2/3 4/5/6 7/8/9 10/11/12"
+ * XXX
+ * The length of an environment variable is limited to 128 bytes which
+ * puts an upper limit on the number of passthru devices that may be
+ * specified using a single environment variable.
+ *
+ * Work around this by scanning multiple environment variable
+ * names instead of a single one - yuck!
*/
+ const char *names[] = { "pptdevs", "pptdevs2", "pptdevs3", NULL };
+
+ /* set pptdevs="1/2/3 4/5/6 7/8/9 10/11/12" */
found = 0;
- cp = val = getenv("pptdevs");
- while (cp != NULL && *cp != '\0') {
- if ((cp2 = strchr(cp, ' ')) != NULL)
- *cp2 = '\0';
-
- n = sscanf(cp, "%d/%d/%d", &b, &s, &f);
- if (n == 3 && bus == b && slot == s && func == f) {
- found = 1;
- break;
- }
+ for (i = 0; names[i] != NULL && !found; i++) {
+ cp = val = getenv(names[i]);
+ while (cp != NULL && *cp != '\0') {
+ if ((cp2 = strchr(cp, ' ')) != NULL)
+ *cp2 = '\0';
+
+ n = sscanf(cp, "%d/%d/%d", &b, &s, &f);
+ if (n == 3 && bus == b && slot == s && func == f) {
+ found = 1;
+ break;
+ }
- if (cp2 != NULL)
- *cp2++ = ' ';
+ if (cp2 != NULL)
+ *cp2++ = ' ';
- cp = cp2;
+ cp = cp2;
+ }
+ freeenv(val);
}
- freeenv(val);
return (found);
}
More information about the svn-src-head
mailing list