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;
struct pptintr_arg *arg;
} msix;
} pptdevs[32];
} pptdevs[64];
static int num_pptdevs;

View File

@ -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';
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;
}
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);
}