src/conf/domain_conf.c | 1 + src/qemu/qemu_command.c | 3 +++ src/qemu/qemu_validate.c | 1 + 3 files changed, 5 insertions(+)
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
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, >
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
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.