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
This commit is contained in:
neel 2013-02-01 01:16:26 +00:00
parent 2163564eab
commit c9a45ab898
2 changed files with 28 additions and 16 deletions

View File

@ -89,7 +89,7 @@ static struct pptdev {
void **cookie; void **cookie;
struct pptintr_arg *arg; struct pptintr_arg *arg;
} msix; } msix;
} pptdevs[32]; } pptdevs[64];
static int num_pptdevs; static int num_pptdevs;

View File

@ -862,30 +862,42 @@ vm_lapic(struct vm *vm, int cpu)
boolean_t boolean_t
vmm_is_pptdev(int bus, int slot, int func) 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; 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; found = 0;
cp = val = getenv("pptdevs"); for (i = 0; names[i] != NULL && !found; i++) {
while (cp != NULL && *cp != '\0') { cp = val = getenv(names[i]);
if ((cp2 = strchr(cp, ' ')) != NULL) while (cp != NULL && *cp != '\0') {
*cp2 = '\0'; if ((cp2 = strchr(cp, ' ')) != NULL)
*cp2 = '\0';
n = sscanf(cp, "%d/%d/%d", &b, &s, &f); n = sscanf(cp, "%d/%d/%d", &b, &s, &f);
if (n == 3 && bus == b && slot == s && func == f) { if (n == 3 && bus == b && slot == s && func == f) {
found = 1; found = 1;
break; break;
} }
if (cp2 != NULL) if (cp2 != NULL)
*cp2++ = ' '; *cp2++ = ' ';
cp = cp2; cp = cp2;
}
freeenv(val);
} }
freeenv(val);
return (found); return (found);
} }