[PATCH v5 2/2] lxc: Add HPET device into allowed devices

Julio Faracco jcfaracco at gmail.com
Mon Mar 2 00:54:13 UTC 2020


This commit is related to RTC timer device too. HPET is being shared
from host device through `localtime` clock. This timer is available
creating a new timer using `hpet` name.

Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
---
 docs/formatdomain.html.in |  2 +-
 src/lxc/lxc_cgroup.c      | 11 ++++++++++-
 src/lxc/lxc_controller.c  | 24 +++++++++++++++++++++++-
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 96d06e9c3e..d1d2955e51 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2464,7 +2464,7 @@
             The <code>name</code> attribute selects which timer is
             being modified, and can be one of
             "platform" (currently unsupported),
-            "hpet" (libxl, xen, qemu), "kvmclock" (qemu),
+            "hpet" (libxl, xen, qemu, lxc), "kvmclock" (qemu),
             "pit" (qemu), "rtc" (qemu, lxc), "tsc" (libxl, qemu -
             <span class="since">since 3.2.0</span>), "hypervclock"
             (qemu - <span class="since">since 1.2.2</span>) or
diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
index 065996b3a4..cb5d0da980 100644
--- a/src/lxc/lxc_cgroup.c
+++ b/src/lxc/lxc_cgroup.c
@@ -349,7 +349,6 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def,
         case VIR_DOMAIN_TIMER_NAME_KVMCLOCK:
         case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK:
         case VIR_DOMAIN_TIMER_NAME_PIT:
-        case VIR_DOMAIN_TIMER_NAME_HPET:
         case VIR_DOMAIN_TIMER_NAME_ARMVTIMER:
         case VIR_DOMAIN_TIMER_NAME_LAST:
             break;
@@ -363,6 +362,16 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def,
                 VIR_DEBUG("Ignoring non-existent device /dev/rtc");
             }
             break;
+        case VIR_DOMAIN_TIMER_NAME_HPET:
+            if (virFileExists("/dev/hpet")) {
+                if (virCgroupAllowDevicePath(cgroup, "/dev/hpet",
+                                             VIR_CGROUP_DEVICE_READ,
+                                             false) < 0)
+                    return -1;
+            } else {
+                VIR_DEBUG("Ignoring non-existent device /dev/hpet");
+            }
+            break;
         }
     }
 
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index d97c4ad1b5..8dcfd4c97e 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -1538,6 +1538,7 @@ virLXCControllerSetupTimers(virLXCControllerPtr ctrl)
     struct stat sb;
     virDomainDefPtr def = ctrl->def;
     const char *rtc_dev = "/dev/rtc";
+    const char *hpet_dev = "/dev/hpet";
 
     /* Not sync'ed with Host clock */
     if (def->clock.offset != VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME)
@@ -1557,7 +1558,6 @@ virLXCControllerSetupTimers(virLXCControllerPtr ctrl)
         case VIR_DOMAIN_TIMER_NAME_KVMCLOCK:
         case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK:
         case VIR_DOMAIN_TIMER_NAME_PIT:
-        case VIR_DOMAIN_TIMER_NAME_HPET:
         case VIR_DOMAIN_TIMER_NAME_ARMVTIMER:
         case VIR_DOMAIN_TIMER_NAME_LAST:
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -1583,6 +1583,28 @@ virLXCControllerSetupTimers(virLXCControllerPtr ctrl)
                 return -1;
             }
 
+            if (lxcContainerChown(ctrl->def, path) < 0)
+                return -1;
+            break;
+        case VIR_DOMAIN_TIMER_NAME_HPET:
+            if (stat(hpet_dev, &sb) < 0) {
+                virReportSystemError(errno, _("Unable to access %s"),
+                                     hpet_dev);
+                return -1;
+            }
+
+            path = g_strdup_printf("/%s/%s.dev/%s", LXC_STATE_DIR,
+                                   ctrl->def->name, "/hpet");
+
+            dev = makedev(major(sb.st_rdev), minor(sb.st_rdev));
+            if (mknod(path, S_IFCHR, dev) < 0 ||
+                chmod(path, sb.st_mode)) {
+                virReportSystemError(errno,
+                                     _("Failed to make device %s"),
+                                     path);
+                return -1;
+            }
+
             if (lxcContainerChown(ctrl->def, path) < 0)
                 return -1;
             break;
-- 
2.24.1





More information about the libvir-list mailing list