[PATCH] conf: add realtime parameter for rtc

gongwei posted 1 patch 3 years, 3 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/1611555807-42423-1-git-send-email-gongwei@smartx.com
There is a newer version of this series
src/conf/domain_conf.c   | 1 +
src/qemu/qemu_command.c  | 3 +++
src/qemu/qemu_validate.c | 1 +
3 files changed, 5 insertions(+)
[PATCH] conf: add realtime parameter for rtc
Posted by gongwei 3 years, 3 months ago
    Pass the parameter clock rt to qemu to ensure that the
    virtual machine is not synchronized with the host time
---
 src/conf/domain_conf.c   | 1 +
 src/qemu/qemu_command.c  | 3 +++
 src/qemu/qemu_validate.c | 1 +
 3 files changed, 5 insertions(+)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dab4f10..c19124d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1106,6 +1106,7 @@ VIR_ENUM_IMPL(virDomainTimerTrack,
               "boot",
               "guest",
               "wall",
+              "realtime",
 );
 
 VIR_ENUM_IMPL(virDomainTimerTickpolicy,
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1ec302d..5e09aa0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5947,6 +5947,9 @@ qemuBuildClockArgStr(virDomainClockDefPtr def)
             case VIR_DOMAIN_TIMER_TRACK_WALL:
                 virBufferAddLit(&buf, ",clock=host");
                 break;
+            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
+                virBufferAddLit(&buf, ",clock=rt");
+                break;
             }
 
             switch (def->timers[i]->tickpolicy) {
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index a060bd9..d4fe40f 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -444,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
             case -1: /* unspecified - use hypervisor default */
             case VIR_DOMAIN_TIMER_TRACK_GUEST:
             case VIR_DOMAIN_TIMER_TRACK_WALL:
+            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
                 break;
             case VIR_DOMAIN_TIMER_TRACK_BOOT:
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- 
1.8.3.1

Re: [PATCH] conf: add realtime parameter for rtc
Posted by Daniel Henrique Barboza 3 years, 2 months ago
This patch won't compile in my env:

domain_conf.c.o -c ../src/conf/domain_conf.c
In file included from /usr/lib64/glib-2.0/include/glibconfig.h:9,
                  from /usr/include/glib-2.0/glib/gtypes.h:32,
                  from /usr/include/glib-2.0/glib/galloca.h:32,
                  from /usr/include/glib-2.0/glib.h:30,
                  from ../src/util/glibcompat.h:21,
                  from ../src/internal.h:30,
                  from ../src/conf/domain_conf.c:30:
/usr/include/glib-2.0/glib/gmacros.h:745:53: error: size of array ‘_GStaticAssertCompileTimeAssertion_111’ is negative
   745 | #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
       |                                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/glib-2.0/glib/gmacros.h:735:47: note: in definition of macro ‘G_PASTE_ARGS’
   735 | #define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
       |                                               ^~~~~~~~~~~
/usr/include/glib-2.0/glib/gmacros.h:745:44: note: in expansion of macro ‘G_PASTE’
   745 | #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
       |                                            ^~~~~~~
../src/util/virenum.h:45:5: note: in expansion of macro ‘G_STATIC_ASSERT’
    45 |     G_STATIC_ASSERT(G_N_ELEMENTS(name ## TypeList) == lastVal)
       |     ^~~~~~~~~~~~~~~
../src/conf/domain_conf.c:1104:1: note: in expansion of macro ‘VIR_ENUM_IMPL’
  1104 | VIR_ENUM_IMPL(virDomainTimerTrack,
       | ^~~~~~~~~~~~~
[107/1007] Compiling C object src/util/libvirt_util.a.p/virutil.c.o
ninja: build stopped: subcommand failed.


You're missing this chunk in domain_conf.h:


$ git diff
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 0a5d151150..51b1189951 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2160,6 +2160,7 @@ typedef enum {
      VIR_DOMAIN_TIMER_TRACK_BOOT = 0,
      VIR_DOMAIN_TIMER_TRACK_GUEST,
      VIR_DOMAIN_TIMER_TRACK_WALL,
+    VIR_DOMAIN_TIMER_TRACK_REALTIME,
  
      VIR_DOMAIN_TIMER_TRACK_LAST
  } virDomainTimerTrackType;



Also, I believe that since you're adding a new timer track attribute
"realtime" you'll also need to:

- change domaincommon.rng to add it as a valid timer track value
- change formatdomain.rst, section 'Time keeping' - clock - timer - track,
and add this new "realtime" value


I would also claim that you would also need a new qemuxmlargvtest.c since you're
adding a new QEMU command line option, but given that we do not have any test
for the others existing timer track command lines I'd consider this new test
good to have, but optional.


Thanks,


DHB


On 1/25/21 3:23 AM, gongwei wrote:
>      Pass the parameter clock rt to qemu to ensure that the
>      virtual machine is not synchronized with the host time
> ---
>   src/conf/domain_conf.c   | 1 +
>   src/qemu/qemu_command.c  | 3 +++
>   src/qemu/qemu_validate.c | 1 +
>   3 files changed, 5 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index dab4f10..c19124d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1106,6 +1106,7 @@ VIR_ENUM_IMPL(virDomainTimerTrack,
>                 "boot",
>                 "guest",
>                 "wall",
> +              "realtime",
>   );
>   
>   VIR_ENUM_IMPL(virDomainTimerTickpolicy,
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 1ec302d..5e09aa0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5947,6 +5947,9 @@ qemuBuildClockArgStr(virDomainClockDefPtr def)
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
>                   virBufferAddLit(&buf, ",clock=host");
>                   break;
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
> +                virBufferAddLit(&buf, ",clock=rt");
> +                break;
>               }
>   
>               switch (def->timers[i]->tickpolicy) {
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index a060bd9..d4fe40f 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -444,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
>               case -1: /* unspecified - use hypervisor default */
>               case VIR_DOMAIN_TIMER_TRACK_GUEST:
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
>                   break;
>               case VIR_DOMAIN_TIMER_TRACK_BOOT:
>                   virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> 

Re: [PATCH] conf: add realtime parameter for rtc
Posted by Michal Privoznik 3 years, 2 months ago
On 1/25/21 7:23 AM, gongwei wrote:
 >

Hey, patch looks almost good. Couple of comments.

>      Pass the parameter clock rt to qemu to ensure that the
>      virtual machine is not synchronized with the host time

We require that commits are Signed-off so that we know that contributors 
comply with Developer Certificate of Origin

https://libvirt.org/hacking.html#developer-certificate-of-origin

> ---
>   src/conf/domain_conf.c   | 1 +
>   src/qemu/qemu_command.c  | 3 +++
>   src/qemu/qemu_validate.c | 1 +
>   3 files changed, 5 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index dab4f10..c19124d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1106,6 +1106,7 @@ VIR_ENUM_IMPL(virDomainTimerTrack,
>                 "boot",
>                 "guest",
>                 "wall",
> +              "realtime",
>   );
>   
>   VIR_ENUM_IMPL(virDomainTimerTickpolicy,
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 1ec302d..5e09aa0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5947,6 +5947,9 @@ qemuBuildClockArgStr(virDomainClockDefPtr def)
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
>                   virBufferAddLit(&buf, ",clock=host");
>                   break;
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:

This is undeclared. You need to add this to virDomainTimerTrackType enum 
too.

> +                virBufferAddLit(&buf, ",clock=rt");
> +                break;
>               }
>   
>               switch (def->timers[i]->tickpolicy) {
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index a060bd9..d4fe40f 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -444,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
>               case -1: /* unspecified - use hypervisor default */
>               case VIR_DOMAIN_TIMER_TRACK_GUEST:
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
>                   break;
>               case VIR_DOMAIN_TIMER_TRACK_BOOT:
>                   virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> 

What is furthermore missing in this patch is documentation 
(docs/formatdomain.rst), schema adjustment 
(docs/schemas/domaincommon.rng) and a test case (qemuxml2argv and 
qemuxml2xml).

Looking forward to v2.

Michal

[PATCH] conf: add realtime parameter for rtc
Posted by gongwei 3 years, 2 months ago
    Pass the parameter clock rt to qemu to ensure that the
    virtual machine is not synchronized with the host time

Signed-off-by: gongwei <gongwei@smartx.com>
---
 docs/formatdomain.rst                       |  2 +-
 docs/schemas/domaincommon.rng               |  1 +
 src/conf/domain_conf.c                      |  1 +
 src/conf/domain_conf.h                      |  1 +
 src/qemu/qemu_command.c                     |  3 +++
 src/qemu/qemu_validate.c                    |  1 +
 tests/qemuxml2argvdata/clock-realtime.args  | 30 +++++++++++++++++++++++
 tests/qemuxml2argvdata/clock-realtime.xml   | 31 +++++++++++++++++++++++
 tests/qemuxml2xmloutdata/clock-realtime.xml | 38 +++++++++++++++++++++++++++++
 9 files changed, 107 insertions(+), 1 deletion(-)
 create mode 100644 tests/qemuxml2argvdata/clock-realtime.args
 create mode 100644 tests/qemuxml2argvdata/clock-realtime.xml
 create mode 100644 tests/qemuxml2xmloutdata/clock-realtime.xml

diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index c738078..75cc60b 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2059,7 +2059,7 @@ Windows, however, expects it to be in so called 'localtime'.
       feature for guests running the Microsoft Windows operating system.
    ``track``
       The ``track`` attribute specifies what the timer tracks, and can be
-      "boot", "guest", or "wall". Only valid for ``name="rtc"`` or
+      "boot", "guest", or "wall", or "realtime". Only valid for ``name="rtc"`` or
       ``name="platform"``.
    ``tickpolicy``
       The ``tickpolicy`` attribute determines what happens when QEMU misses a
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index a4bddcf..d882f90 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1209,6 +1209,7 @@
                 <value>boot</value>
                 <value>guest</value>
                 <value>wall</value>
+                <value>realtime</value>
               </choice>
             </attribute>
           </optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dab4f10..c19124d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1106,6 +1106,7 @@ VIR_ENUM_IMPL(virDomainTimerTrack,
               "boot",
               "guest",
               "wall",
+              "realtime",
 );
 
 VIR_ENUM_IMPL(virDomainTimerTickpolicy,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 95ad052..e73b69c 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2160,6 +2160,7 @@ typedef enum {
     VIR_DOMAIN_TIMER_TRACK_BOOT = 0,
     VIR_DOMAIN_TIMER_TRACK_GUEST,
     VIR_DOMAIN_TIMER_TRACK_WALL,
+    VIR_DOMAIN_TIMER_TRACK_REALTIME,
 
     VIR_DOMAIN_TIMER_TRACK_LAST
 } virDomainTimerTrackType;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1ec302d..5e09aa0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5947,6 +5947,9 @@ qemuBuildClockArgStr(virDomainClockDefPtr def)
             case VIR_DOMAIN_TIMER_TRACK_WALL:
                 virBufferAddLit(&buf, ",clock=host");
                 break;
+            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
+                virBufferAddLit(&buf, ",clock=rt");
+                break;
             }
 
             switch (def->timers[i]->tickpolicy) {
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index a060bd9..d4fe40f 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -444,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
             case -1: /* unspecified - use hypervisor default */
             case VIR_DOMAIN_TIMER_TRACK_GUEST:
             case VIR_DOMAIN_TIMER_TRACK_WALL:
+            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
                 break;
             case VIR_DOMAIN_TIMER_TRACK_BOOT:
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
diff --git a/tests/qemuxml2argvdata/clock-realtime.args b/tests/qemuxml2argvdata/clock-realtime.args
new file mode 100644
index 0000000..7965696
--- /dev/null
+++ b/tests/qemuxml2argvdata/clock-realtime.args
@@ -0,0 +1,30 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-i386 \
+-name QEMUGuest1 \
+-S \
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
+-m 214 \
+-realtime mlock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc,driftfix=slew,clock=rt \
+-no-shutdown \
+-no-acpi \
+-usb \
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
+-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/clock-realtime.xml b/tests/qemuxml2argvdata/clock-realtime.xml
new file mode 100644
index 0000000..71bdc5a
--- /dev/null
+++ b/tests/qemuxml2argvdata/clock-realtime.xml
@@ -0,0 +1,31 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'>
+    <timer name='rtc' track='realtime'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-i386</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='usb' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/clock-realtime.xml b/tests/qemuxml2xmloutdata/clock-realtime.xml
new file mode 100644
index 0000000..3ba6b4c
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/clock-realtime.xml
@@ -0,0 +1,38 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'>
+    <timer name='rtc' track='realtime'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-i386</emulator>
+    <disk type='block' device='disk'>
+      <driver name='qemu' type='raw'/>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='usb' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='ide' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <memballoon model='virtio'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
-- 
1.8.3.1

Re: [PATCH] conf: add realtime parameter for rtc
Posted by Michal Privoznik 3 years, 2 months ago
On 2/2/21 3:20 PM, gongwei wrote:
>      Pass the parameter clock rt to qemu to ensure that the
>      virtual machine is not synchronized with the host time
> 
> Signed-off-by: gongwei <gongwei@smartx.com>
> ---
>   docs/formatdomain.rst                       |  2 +-
>   docs/schemas/domaincommon.rng               |  1 +
>   src/conf/domain_conf.c                      |  1 +
>   src/conf/domain_conf.h                      |  1 +
>   src/qemu/qemu_command.c                     |  3 +++
>   src/qemu/qemu_validate.c                    |  1 +
>   tests/qemuxml2argvdata/clock-realtime.args  | 30 +++++++++++++++++++++++
>   tests/qemuxml2argvdata/clock-realtime.xml   | 31 +++++++++++++++++++++++
>   tests/qemuxml2xmloutdata/clock-realtime.xml | 38 +++++++++++++++++++++++++++++
>   9 files changed, 107 insertions(+), 1 deletion(-)
>   create mode 100644 tests/qemuxml2argvdata/clock-realtime.args
>   create mode 100644 tests/qemuxml2argvdata/clock-realtime.xml
>   create mode 100644 tests/qemuxml2xmloutdata/clock-realtime.xml

So you introduced .xml files for tests but probably forgot to include 
calls of test cases - those DO_TEST(...) from qemuxml2argvtest.c and 
qemuxml2xmltest.c? But that should be trivial to do:

diff --git i/tests/qemuxml2argvtest.c w/tests/qemuxml2argvtest.c
index c5d82ac72e..0f4ec4533c 100644
--- i/tests/qemuxml2argvtest.c
+++ w/tests/qemuxml2argvtest.c
@@ -1064,6 +1064,7 @@ mymain(void)
      DO_TEST("cpu-host-kvmclock", NONE);
      DO_TEST("kvmclock", QEMU_CAPS_KVM);
      DO_TEST("clock-timer-hyperv-rtc", QEMU_CAPS_KVM);
+    DO_TEST("clock-realtime", NONE);

      DO_TEST("cpu-eoi-disabled", NONE);
      DO_TEST("cpu-eoi-enabled", NONE);

diff --git i/tests/qemuxml2xmltest.c w/tests/qemuxml2xmltest.c
index 50dd970789..342d70935f 100644
--- i/tests/qemuxml2xmltest.c
+++ w/tests/qemuxml2xmltest.c
@@ -233,6 +233,7 @@ mymain(void)
      DO_TEST("kvmclock", NONE);
      DO_TEST("clock-timer-hyperv-rtc", NONE);
      DO_TEST_CAPS_ARCH_LATEST("clock-timer-armvtimer", "aarch64");
+    DO_TEST("clock-realtime", NONE);

      DO_TEST("cpu-eoi-disabled", NONE);
      DO_TEST("cpu-eoi-enabled", NONE);

However, if I do that I get slightly different .args output [1]

> 
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index c738078..75cc60b 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -2059,7 +2059,7 @@ Windows, however, expects it to be in so called 'localtime'.
>         feature for guests running the Microsoft Windows operating system.
>      ``track``
>         The ``track`` attribute specifies what the timer tracks, and can be
> -      "boot", "guest", or "wall". Only valid for ``name="rtc"`` or
> +      "boot", "guest", or "wall", or "realtime". Only valid for ``name="rtc"`` or
>         ``name="platform"``.
>      ``tickpolicy``
>         The ``tickpolicy`` attribute determines what happens when QEMU misses a
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index a4bddcf..d882f90 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -1209,6 +1209,7 @@
>                   <value>boot</value>
>                   <value>guest</value>
>                   <value>wall</value>
> +                <value>realtime</value>
>                 </choice>
>               </attribute>
>             </optional>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index dab4f10..c19124d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1106,6 +1106,7 @@ VIR_ENUM_IMPL(virDomainTimerTrack,
>                 "boot",
>                 "guest",
>                 "wall",
> +              "realtime",
>   );
>   
>   VIR_ENUM_IMPL(virDomainTimerTickpolicy,
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 95ad052..e73b69c 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2160,6 +2160,7 @@ typedef enum {
>       VIR_DOMAIN_TIMER_TRACK_BOOT = 0,
>       VIR_DOMAIN_TIMER_TRACK_GUEST,
>       VIR_DOMAIN_TIMER_TRACK_WALL,
> +    VIR_DOMAIN_TIMER_TRACK_REALTIME,
>   
>       VIR_DOMAIN_TIMER_TRACK_LAST
>   } virDomainTimerTrackType;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 1ec302d..5e09aa0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5947,6 +5947,9 @@ qemuBuildClockArgStr(virDomainClockDefPtr def)
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
>                   virBufferAddLit(&buf, ",clock=host");
>                   break;
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
> +                virBufferAddLit(&buf, ",clock=rt");
> +                break;
>               }
>   
>               switch (def->timers[i]->tickpolicy) {
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index a060bd9..d4fe40f 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -444,6 +444,7 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
>               case -1: /* unspecified - use hypervisor default */
>               case VIR_DOMAIN_TIMER_TRACK_GUEST:
>               case VIR_DOMAIN_TIMER_TRACK_WALL:
> +            case VIR_DOMAIN_TIMER_TRACK_REALTIME:
>                   break;
>               case VIR_DOMAIN_TIMER_TRACK_BOOT:
>                   virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> diff --git a/tests/qemuxml2argvdata/clock-realtime.args b/tests/qemuxml2argvdata/clock-realtime.args
> new file mode 100644
> index 0000000..7965696
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/clock-realtime.args
> @@ -0,0 +1,30 @@
> +LC_ALL=C \
> +PATH=/bin \
> +HOME=/tmp/lib/domain--1-QEMUGuest1 \
> +USER=test \
> +LOGNAME=test \
> +XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
> +XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
> +XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
> +QEMU_AUDIO_DRV=none \
> +/usr/bin/qemu-system-i386 \
> +-name QEMUGuest1 \
> +-S \
> +-machine pc,accel=tcg,usb=off,dump-guest-core=off \
> +-m 214 \
> +-realtime mlock=off \
> +-smp 1,sockets=1,cores=1,threads=1 \
> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
> +-display none \
> +-no-user-config \
> +-nodefaults \
> +-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
> +server,nowait \
> +-mon chardev=charmonitor,id=monitor,mode=control \
> +-rtc base=utc,driftfix=slew,clock=rt \

1: here ^^^ only "-rtc base=utc,clock=rt" is generated. And looking into 
the corresponding input XML there is no tickpolicy='catchup' [2]

> +-no-shutdown \
> +-no-acpi \
> +-usb \
> +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
> +-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 \
> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
> diff --git a/tests/qemuxml2argvdata/clock-realtime.xml b/tests/qemuxml2argvdata/clock-realtime.xml
> new file mode 100644
> index 0000000..71bdc5a
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/clock-realtime.xml
> @@ -0,0 +1,31 @@
> +<domain type='qemu'>
> +  <name>QEMUGuest1</name>
> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> +  <memory unit='KiB'>219100</memory>
> +  <currentMemory unit='KiB'>219100</currentMemory>
> +  <vcpu placement='static'>1</vcpu>
> +  <os>
> +    <type arch='i686' machine='pc'>hvm</type>
> +    <boot dev='hd'/>
> +  </os>
> +  <clock offset='utc'>
> +    <timer name='rtc' track='realtime'/>

2: here ^^^

> +  </clock>
> +  <on_poweroff>destroy</on_poweroff>
> +  <on_reboot>restart</on_reboot>
> +  <on_crash>destroy</on_crash>
> +  <devices>
> +    <emulator>/usr/bin/qemu-system-i386</emulator>
> +    <disk type='block' device='disk'>
> +      <source dev='/dev/HostVG/QEMUGuest1'/>
> +      <target dev='hda' bus='ide'/>
> +      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> +    </disk>
> +    <controller type='usb' index='0'/>
> +    <controller type='ide' index='0'/>
> +    <controller type='pci' index='0' model='pci-root'/>
> +    <input type='mouse' bus='ps2'/>
> +    <input type='keyboard' bus='ps2'/>
> +    <memballoon model='virtio'/>
> +  </devices>
> +</domain>
> diff --git a/tests/qemuxml2xmloutdata/clock-realtime.xml b/tests/qemuxml2xmloutdata/clock-realtime.xml
> new file mode 100644
> index 0000000..3ba6b4c
> --- /dev/null
> +++ b/tests/qemuxml2xmloutdata/clock-realtime.xml

Unless we need to have input and output XMLs different for xml2xml test 
(e.g. to test automagic filling of some values, placing of devices onto 
a bus, etc.), we tend to make the output XML file a symlink to the input 
file. The reason is that we don't have to store nearly identical copy of 
the input file in git/in checkout.


Long story short, I'm fixing all the small bits I've raised and:

Reviewed-by: Michal Privoznik <mprivozn@redhat.com>

and pushing. Congratulations on your first libvirt contribution!

Michal