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
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
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
© 2016 - 2024 Red Hat, Inc.