mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
bhyve: Add CPU topology support
Recently, bhyve started supporting specifying guest CPU topology. It looks this way: bhyve -c cpus=C,sockets=S,cores=C,threads=T ... The old behaviour was bhyve -c C, where C is a number of vCPUs, is still supported. So if we have CPU topology in the domain XML, use the new syntax, otherwise keep the old behaviour. Also, document this feature in the bhyve driver page. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
922c867f06
commit
b66fda0a74
@ -444,6 +444,22 @@ be wired and cannot be swapped out as follows:</p>
|
|||||||
</memoryBacking>
|
</memoryBacking>
|
||||||
...
|
...
|
||||||
</domain>
|
</domain>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3><a id="cputopology">CPU topology</a></h3>
|
||||||
|
|
||||||
|
<p><span class="since">Since 4.5.0</span>, it's possible to specify guest CPU topology, if bhyve
|
||||||
|
supports that. Support for specifying guest CPU topology was added to bhyve in
|
||||||
|
<a href="http://svnweb.freebsd.org/changeset/base/332298">r332298</a> for <i>-CURRENT</i>.
|
||||||
|
Example:</p>
|
||||||
|
<pre>
|
||||||
|
<domain type="bhyve">
|
||||||
|
...
|
||||||
|
<cpu>
|
||||||
|
<topology sockets='1' cores='2' threads='1'/>
|
||||||
|
</cpu>
|
||||||
|
...
|
||||||
|
</domain>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@ -244,6 +244,12 @@ bhyveProbeCapsFromHelp(unsigned int *caps, char *binary)
|
|||||||
if (strstr(help, "-u:") != NULL)
|
if (strstr(help, "-u:") != NULL)
|
||||||
*caps |= BHYVE_CAP_RTC_UTC;
|
*caps |= BHYVE_CAP_RTC_UTC;
|
||||||
|
|
||||||
|
/* "-c vcpus" was there before CPU topology support was introduced,
|
||||||
|
* then it became
|
||||||
|
* "-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n] */
|
||||||
|
if (strstr(help, "-c vcpus") == NULL)
|
||||||
|
*caps |= BHYVE_CAP_CPUTOPOLOGY;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
VIR_FREE(help);
|
VIR_FREE(help);
|
||||||
virCommandFree(cmd);
|
virCommandFree(cmd);
|
||||||
|
@ -49,6 +49,7 @@ typedef enum {
|
|||||||
BHYVE_CAP_LPC_BOOTROM = 1 << 3,
|
BHYVE_CAP_LPC_BOOTROM = 1 << 3,
|
||||||
BHYVE_CAP_FBUF = 1 << 4,
|
BHYVE_CAP_FBUF = 1 << 4,
|
||||||
BHYVE_CAP_XHCI = 1 << 5,
|
BHYVE_CAP_XHCI = 1 << 5,
|
||||||
|
BHYVE_CAP_CPUTOPOLOGY = 1 << 6,
|
||||||
} virBhyveCapsFlags;
|
} virBhyveCapsFlags;
|
||||||
|
|
||||||
int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps);
|
int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps);
|
||||||
|
@ -462,12 +462,36 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn,
|
|||||||
size_t i;
|
size_t i;
|
||||||
bool add_lpc = false;
|
bool add_lpc = false;
|
||||||
int nusbcontrollers = 0;
|
int nusbcontrollers = 0;
|
||||||
|
unsigned int nvcpus = virDomainDefGetVcpus(def);
|
||||||
|
|
||||||
virCommandPtr cmd = virCommandNew(BHYVE);
|
virCommandPtr cmd = virCommandNew(BHYVE);
|
||||||
|
|
||||||
/* CPUs */
|
/* CPUs */
|
||||||
virCommandAddArg(cmd, "-c");
|
virCommandAddArg(cmd, "-c");
|
||||||
virCommandAddArgFormat(cmd, "%d", virDomainDefGetVcpus(def));
|
if (def->cpu && def->cpu->sockets) {
|
||||||
|
if (nvcpus != def->cpu->sockets * def->cpu->cores * def->cpu->threads) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Invalid CPU topology: total number of vCPUs "
|
||||||
|
"must equal the product of sockets, cores, "
|
||||||
|
"and threads"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bhyveDriverGetCaps(conn) & BHYVE_CAP_CPUTOPOLOGY) != 0) {
|
||||||
|
virCommandAddArgFormat(cmd, "cpus=%d,sockets=%d,cores=%d,threads=%d",
|
||||||
|
nvcpus,
|
||||||
|
def->cpu->sockets,
|
||||||
|
def->cpu->cores,
|
||||||
|
def->cpu->threads);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Installed bhyve binary does not support "
|
||||||
|
"defining CPU topology"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
virCommandAddArgFormat(cmd, "%d", nvcpus);
|
||||||
|
}
|
||||||
|
|
||||||
/* Memory */
|
/* Memory */
|
||||||
virCommandAddArg(cmd, "-m");
|
virCommandAddArg(cmd, "-m");
|
||||||
|
@ -176,7 +176,8 @@ mymain(void)
|
|||||||
driver.grubcaps = BHYVE_GRUB_CAP_CONSDEV;
|
driver.grubcaps = BHYVE_GRUB_CAP_CONSDEV;
|
||||||
driver.bhyvecaps = BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \
|
driver.bhyvecaps = BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \
|
||||||
BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \
|
BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \
|
||||||
BHYVE_CAP_FBUF | BHYVE_CAP_XHCI;
|
BHYVE_CAP_FBUF | BHYVE_CAP_XHCI | \
|
||||||
|
BHYVE_CAP_CPUTOPOLOGY;
|
||||||
|
|
||||||
DO_TEST("base");
|
DO_TEST("base");
|
||||||
DO_TEST("wired");
|
DO_TEST("wired");
|
||||||
@ -207,6 +208,8 @@ mymain(void)
|
|||||||
DO_TEST("vnc-vgaconf-off");
|
DO_TEST("vnc-vgaconf-off");
|
||||||
DO_TEST("vnc-vgaconf-io");
|
DO_TEST("vnc-vgaconf-io");
|
||||||
DO_TEST("vnc-autoport");
|
DO_TEST("vnc-autoport");
|
||||||
|
DO_TEST("cputopology");
|
||||||
|
DO_TEST_FAILURE("cputopology-nvcpu-mismatch");
|
||||||
|
|
||||||
/* Address allocation tests */
|
/* Address allocation tests */
|
||||||
DO_TEST("addr-single-sata-disk");
|
DO_TEST("addr-single-sata-disk");
|
||||||
@ -243,6 +246,9 @@ mymain(void)
|
|||||||
driver.bhyvecaps &= ~BHYVE_CAP_FBUF;
|
driver.bhyvecaps &= ~BHYVE_CAP_FBUF;
|
||||||
DO_TEST_FAILURE("vnc");
|
DO_TEST_FAILURE("vnc");
|
||||||
|
|
||||||
|
driver.bhyvecaps &= ~BHYVE_CAP_CPUTOPOLOGY;
|
||||||
|
DO_TEST_FAILURE("cputopology");
|
||||||
|
|
||||||
virObjectUnref(driver.caps);
|
virObjectUnref(driver.caps);
|
||||||
virObjectUnref(driver.xmlopt);
|
virObjectUnref(driver.xmlopt);
|
||||||
virPortAllocatorRangeFree(driver.remotePorts);
|
virPortAllocatorRangeFree(driver.remotePorts);
|
||||||
|
Loading…
Reference in New Issue
Block a user