[PATCH] conf: add realtime parameter for rtc

Michal Privoznik mprivozn at redhat.com
Wed Feb 3 09:20:28 UTC 2021


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 at 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 at redhat.com>

and pushing. Congratulations on your first libvirt contribution!

Michal




More information about the libvir-list mailing list