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:
parent
2163564eab
commit
c9a45ab898
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user