[libvirt] [PATCH 8/8] lxc: report veth device indexes to systemd

Daniel P. Berrange berrange at redhat.com
Fri Jan 16 17:36:21 UTC 2015


Record the index of each host-side veth device created and report
them to systemd, so they show up in machinectl status for the VM.

lxc-shell(95449419f969d649d9962566ec42af7d)
     Since: Fri 2015-01-16 16:53:37 GMT; 3s ago
    Leader: 28085 (sh)
   Service: libvirt-lxc; class container
     Iface: vnet0
   Address: fe80::216:3eff:fe00:c317%124
        OS: Fedora 21 (Twenty One)
      Unit: machine-lxc\x2dshell.scope
            └─28085 /bin/sh
---
 src/lxc/lxc_cgroup.c     |  6 ++++--
 src/lxc/lxc_cgroup.h     |  4 +++-
 src/lxc/lxc_controller.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 0987050..1dfa9a4 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -463,7 +463,9 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def,
 
 
 virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def,
-                                pid_t initpid)
+                                pid_t initpid,
+                                size_t nnicindexes,
+                                int *nicindexes)
 {
     virCgroupPtr cgroup = NULL;
 
@@ -481,7 +483,7 @@ virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def,
                             NULL,
                             initpid,
                             true,
-                            0, NULL,
+                            nnicindexes, nicindexes,
                             def->resource->partition,
                             -1,
                             &cgroup) < 0)
diff --git a/src/lxc/lxc_cgroup.h b/src/lxc/lxc_cgroup.h
index 31d6800..e85f21c 100644
--- a/src/lxc/lxc_cgroup.h
+++ b/src/lxc/lxc_cgroup.h
@@ -28,7 +28,9 @@
 # include "virusb.h"
 
 virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def,
-                                pid_t initpid);
+                                pid_t initpid,
+                                size_t nnicindexes,
+                                int *nicindexes);
 virCgroupPtr virLXCCgroupJoin(virDomainDefPtr def);
 int virLXCCgroupSetup(virDomainDefPtr def,
                       virCgroupPtr cgroup,
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 03dff29..8a7c7e8 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -110,6 +110,9 @@ struct _virLXCController {
     size_t nveths;
     char **veths;
 
+    size_t nnicindexes;
+    int *nicindexes;
+
     size_t npassFDs;
     int *passFDs;
 
@@ -260,6 +263,7 @@ static void virLXCControllerFree(virLXCControllerPtr ctrl)
     for (i = 0; i < ctrl->nveths; i++)
         VIR_FREE(ctrl->veths[i]);
     VIR_FREE(ctrl->veths);
+    VIR_FREE(ctrl->nicindexes);
 
     for (i = 0; i < ctrl->npassFDs; i++)
         VIR_FORCE_CLOSE(ctrl->passFDs[i]);
@@ -344,6 +348,51 @@ static int virLXCControllerValidateNICs(virLXCControllerPtr ctrl)
 }
 
 
+static int virLXCControllerGetNICIndexes(virLXCControllerPtr ctrl)
+{
+    size_t i;
+    int ret = -1;
+
+    VIR_DEBUG("Getting nic indexes");
+    for (i = 0; i < ctrl->def->nnets; i++) {
+        int nicindex = -1;
+        switch (ctrl->def->nets[i]->type) {
+        case VIR_DOMAIN_NET_TYPE_BRIDGE:
+        case VIR_DOMAIN_NET_TYPE_NETWORK:
+            if (ctrl->def->nets[i]->ifname == NULL)
+                continue;
+            if (virNetDevGetIndex(ctrl->def->nets[i]->ifname,
+                                  &nicindex) < 0)
+                goto cleanup;
+            if (VIR_EXPAND_N(ctrl->nicindexes,
+                             ctrl->nnicindexes,
+                             1) < 0)
+                goto cleanup;
+            VIR_DEBUG("Index %d for %s", nicindex,
+                      ctrl->def->nets[i]->ifname);
+            ctrl->nicindexes[ctrl->nnicindexes-1] = nicindex;
+            break;
+
+        case VIR_DOMAIN_NET_TYPE_USER:
+        case VIR_DOMAIN_NET_TYPE_ETHERNET:
+        case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+        case VIR_DOMAIN_NET_TYPE_SERVER:
+        case VIR_DOMAIN_NET_TYPE_CLIENT:
+        case VIR_DOMAIN_NET_TYPE_MCAST:
+        case VIR_DOMAIN_NET_TYPE_INTERNAL:
+        case VIR_DOMAIN_NET_TYPE_DIRECT:
+        case VIR_DOMAIN_NET_TYPE_HOSTDEV:
+        default:
+            break;
+        }
+    }
+
+    ret = 0;
+ cleanup:
+    return ret;
+}
+
+
 static int virLXCControllerValidateConsoles(virLXCControllerPtr ctrl)
 {
     if (ctrl->def->nconsoles != ctrl->nconsoles) {
@@ -732,7 +781,9 @@ static int virLXCControllerSetupCgroupLimits(virLXCControllerPtr ctrl)
     nodeset = virDomainNumatuneGetNodeset(ctrl->def->numatune, auto_nodeset, -1);
 
     if (!(ctrl->cgroup = virLXCCgroupCreate(ctrl->def,
-                                            ctrl->initpid)))
+                                            ctrl->initpid,
+                                            ctrl->nnicindexes,
+                                            ctrl->nicindexes)))
         goto cleanup;
 
     if (virCgroupAddTask(ctrl->cgroup, getpid()) < 0)
@@ -2494,6 +2545,9 @@ int main(int argc, char *argv[])
     if (virLXCControllerValidateNICs(ctrl) < 0)
         goto cleanup;
 
+    if (virLXCControllerGetNICIndexes(ctrl) < 0)
+        goto cleanup;
+
     if (virLXCControllerValidateConsoles(ctrl) < 0)
         goto cleanup;
 
-- 
2.1.0




More information about the libvir-list mailing list