Record the index of each TAP device created and report them to
systemd, so they show up in machinectl status for the VM.
---
src/qemu/qemu_cgroup.c | 13 ++++++++-----
src/qemu/qemu_cgroup.h | 4 +++-
src/qemu/qemu_command.c | 27 ++++++++++++++++++++++-----
src/qemu/qemu_command.h | 7 +++++--
src/qemu/qemu_driver.c | 7 +++++--
src/qemu/qemu_hotplug.c | 4 +++-
src/qemu/qemu_process.c | 9 +++++++--
tests/qemuxml2argvtest.c | 5 ++++-
tests/qemuxmlnstest.c | 6 +++++-
9 files changed, 62 insertions(+), 20 deletions(-)
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index d71ffbc..fc46450 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -727,7 +727,9 @@ qemuSetupCpuCgroup(virQEMUDriverPtr driver,
static int
qemuInitCgroup(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+ virDomainObjPtr vm,
+ size_t nnicindexes,
+ int *nicindexes)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -769,7 +771,7 @@ qemuInitCgroup(virQEMUDriverPtr driver,
NULL,
vm->pid,
false,
- 0, NULL,
+ nnicindexes, nicindexes,
vm->def->resource->partition,
cfg->cgroupControllers,
&priv->cgroup) < 0) {
@@ -855,7 +857,9 @@ qemuConnectCgroup(virQEMUDriverPtr driver,
int
qemuSetupCgroup(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+ virDomainObjPtr vm,
+ size_t nnicindexes,
+ int *nicindexes)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virCapsPtr caps = NULL;
@@ -867,7 +871,7 @@ qemuSetupCgroup(virQEMUDriverPtr driver,
return -1;
}
- if (qemuInitCgroup(driver, vm) < 0)
+ if (qemuInitCgroup(driver, vm, nnicindexes, nicindexes) < 0)
return -1;
if (!priv->cgroup)
@@ -1023,7 +1027,6 @@ qemuSetupCgroupForVcpu(virDomainObjPtr vm)
/* If we don't know VCPU<->PID mapping or all vcpu runs in the same
* thread, we cannot control each vcpu.
*/
- VIR_WARN("Unable to get vcpus' pids.");
return 0;
}
diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h
index df7e3a1..a5d9c49 100644
--- a/src/qemu/qemu_cgroup.h
+++ b/src/qemu/qemu_cgroup.h
@@ -45,7 +45,9 @@ int qemuTeardownHostdevCgroup(virDomainObjPtr vm,
int qemuConnectCgroup(virQEMUDriverPtr driver,
virDomainObjPtr vm);
int qemuSetupCgroup(virQEMUDriverPtr driver,
- virDomainObjPtr vm);
+ virDomainObjPtr vm,
+ size_t nnicindexes,
+ int *nicindexes);
int qemuSetupCpusetMems(virDomainObjPtr vm);
int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
unsigned long long period,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c041ee7..d50bec9 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -290,7 +290,8 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
virDomainNetDefPtr net,
virQEMUCapsPtr qemuCaps,
int *tapfd,
- size_t *tapfdSize)
+ size_t *tapfdSize,
+ int *nicindex)
{
const char *brname;
int ret = -1;
@@ -331,6 +332,8 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
virDomainAuditNetDevice(def, net, tunpath, false);
goto cleanup;
}
+ if (virNetDevGetIndex(net->ifname, nicindex) < 0)
+ goto cleanup;
if (virDomainNetGetActualBridgeMACTableManager(net)
== VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LIBVIRT) {
/* libvirt is managing the FDB of the bridge this device
@@ -7383,7 +7386,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
int vlan,
int bootindex,
virNetDevVPortProfileOp vmop,
- bool standalone)
+ bool standalone,
+ int *nicindex)
{
int ret = -1;
char *nic = NULL, *host = NULL;
@@ -7397,6 +7401,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
virNetDevBandwidthPtr actualBandwidth;
size_t i;
+ *nicindex = -1;
+
if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)
return qemuBuildVhostuserCommandLine(cmd, def, net, qemuCaps);
@@ -7433,7 +7439,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
if (qemuNetworkIfaceConnect(def, conn, driver, net,
- qemuCaps, tapfd, &tapfdSize) < 0)
+ qemuCaps, tapfd,
+ &tapfdSize, nicindex) < 0)
goto cleanup;
} else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
if (VIR_ALLOC(tapfd) < 0 || VIR_ALLOC(tapfdName) < 0)
@@ -7788,7 +7795,9 @@ qemuBuildCommandLine(virConnectPtr conn,
qemuBuildCommandLineCallbacksPtr callbacks,
bool standalone,
bool enableFips,
- virBitmapPtr nodeset)
+ virBitmapPtr nodeset,
+ size_t *nnicindexes,
+ int **nicindexes)
{
virErrorPtr originalError = NULL;
size_t i, j;
@@ -7833,6 +7842,9 @@ qemuBuildCommandLine(virConnectPtr conn,
virUUIDFormat(def->uuid, uuid);
+ *nnicindexes = 0;
+ *nicindexes = NULL;
+
emulator = def->emulator;
if (!cfg->privileged) {
@@ -8889,10 +8901,15 @@ qemuBuildCommandLine(virConnectPtr conn,
else
vlan = i;
+ if (VIR_EXPAND_N(*nicindexes, *nnicindexes, 1) < 0)
+ goto error;
+
if (qemuBuildInterfaceCommandLine(cmd, driver, conn, def, net,
qemuCaps, vlan, bootNet, vmop,
- standalone) < 0)
+ standalone,
+ &((*nicindexes)[*nnicindexes - 1]))
< 0)
goto error;
+
last_good_net = i;
bootNet = 0;
}
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index dcc7127..7a670cc 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -82,7 +82,9 @@ virCommandPtr qemuBuildCommandLine(virConnectPtr conn,
qemuBuildCommandLineCallbacksPtr callbacks,
bool forXMLToArgv,
bool enableFips,
- virBitmapPtr nodeset)
+ virBitmapPtr nodeset,
+ size_t *nnicindexes,
+ int **nicindexes)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(11);
/* Generate '-device' string for chardev device */
@@ -195,7 +197,8 @@ int qemuNetworkIfaceConnect(virDomainDefPtr def,
virDomainNetDefPtr net,
virQEMUCapsPtr qemuCaps,
int *tapfd,
- size_t *tapfdSize)
+ size_t *tapfdSize,
+ int *nicindex)
ATTRIBUTE_NONNULL(2);
int qemuPhysIfaceConnect(virDomainDefPtr def,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9eed81d..b800555 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6310,6 +6310,8 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
size_t i;
virQEMUDriverConfigPtr cfg;
virCapsPtr caps = NULL;
+ size_t nnicindexes = 0;
+ int *nicindexes = NULL;
virCheckFlags(0, NULL);
@@ -6495,13 +6497,14 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
&buildCommandLineCallbacks,
true,
qemuCheckFips(),
- NULL)))
+ NULL,
+ &nnicindexes, &nicindexes)))
goto cleanup;
ret = virCommandToString(cmd);
cleanup:
-
+ VIR_FREE(nicindexes);
virObjectUnref(qemuCaps);
virCommandFree(cmd);
virDomainDefFree(def);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 6f62345..6b7d9b8 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -825,6 +825,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
qemuDomainObjPrivatePtr priv = vm->privateData;
char **tapfdName = NULL;
int *tapfd = NULL;
+ int nicindex = -1;
size_t tapfdSize = 0;
char **vhostfdName = NULL;
int *vhostfd = NULL;
@@ -894,7 +895,8 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
goto cleanup;
memset(vhostfd, -1, sizeof(*vhostfd) * vhostfdSize);
if (qemuNetworkIfaceConnect(vm->def, conn, driver, net,
- priv->qemuCaps, tapfd, &tapfdSize) < 0)
+ priv->qemuCaps, tapfd, &tapfdSize,
+ &nicindex) < 0)
goto cleanup;
iface_connected = true;
if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd,
&vhostfdSize) < 0)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 2aa195f..da61e2b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4270,6 +4270,8 @@ int qemuProcessStart(virConnectPtr conn,
virQEMUDriverConfigPtr cfg;
virCapsPtr caps = NULL;
unsigned int hostdev_flags = 0;
+ size_t nnicindexes = 0;
+ int *nicindexes = NULL;
VIR_DEBUG("vm=%p name=%s id=%d pid=%llu",
vm, vm->def->name, vm->def->id,
@@ -4589,7 +4591,8 @@ int qemuProcessStart(virConnectPtr conn,
migrateFrom, stdin_fd, snapshot, vmop,
&buildCommandLineCallbacks, false,
qemuCheckFips(),
- nodemask)))
+ nodemask,
+ &nnicindexes, &nicindexes)))
goto cleanup;
/* now that we know it is about to start call the hook if present */
@@ -4726,7 +4729,7 @@ int qemuProcessStart(virConnectPtr conn,
}
VIR_DEBUG("Setting up domain cgroup (if required)");
- if (qemuSetupCgroup(driver, vm) < 0)
+ if (qemuSetupCgroup(driver, vm, nnicindexes, nicindexes) < 0)
goto cleanup;
/* This must be done after cgroup placement to avoid resetting CPU
@@ -4943,6 +4946,7 @@ int qemuProcessStart(virConnectPtr conn,
VIR_FORCE_CLOSE(logfile);
virObjectUnref(cfg);
virObjectUnref(caps);
+ VIR_FREE(nicindexes);
return 0;
@@ -4958,6 +4962,7 @@ int qemuProcessStart(virConnectPtr conn,
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, stop_flags);
virObjectUnref(cfg);
virObjectUnref(caps);
+ VIR_FREE(nicindexes);
return -1;
}
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index d1a95c5..8ef2173 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -279,6 +279,8 @@ static int testCompareXMLToArgvFiles(const char *xml,
char *log = NULL;
virCommandPtr cmd = NULL;
size_t i;
+ size_t nnicindexes = 0;
+ int *nicindexes = NULL;
if (!(conn = virGetConnect()))
goto out;
@@ -363,7 +365,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
&testCallbacks, false,
(flags & FLAG_FIPS),
- NULL))) {
+ NULL, &nnicindexes, &nicindexes))) {
if (!virtTestOOMActive() &&
(flags & FLAG_EXPECT_FAILURE)) {
ret = 0;
@@ -410,6 +412,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
ret = 0;
out:
+ VIR_FREE(nicindexes);
VIR_FREE(log);
VIR_FREE(expectargv);
VIR_FREE(actualargv);
diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c
index 947aa9c..d76f078 100644
--- a/tests/qemuxmlnstest.c
+++ b/tests/qemuxmlnstest.c
@@ -44,6 +44,8 @@ static int testCompareXMLToArgvFiles(const char *xml,
char *log = NULL;
char *emulator = NULL;
virCommandPtr cmd = NULL;
+ size_t nnicindexes = 0;
+ int *nicindexes = NULL;
if (!(conn = virGetConnect()))
goto fail;
@@ -119,7 +121,8 @@ static int testCompareXMLToArgvFiles(const char *xml,
vmdef, &monitor_chr, json, extraFlags,
migrateFrom, migrateFd, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
- &testCallbacks, false, false, NULL)))
+ &testCallbacks, false, false, NULL,
+ &nnicindexes, &nicindexes)))
goto fail;
if (!virtTestOOMActive()) {
@@ -155,6 +158,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
ret = 0;
fail:
+ VIR_FREE(nicindexes);
VIR_FREE(log);
VIR_FREE(emulator);
VIR_FREE(expectargv);
--
2.1.0