regression in qtest clock_set/clock_step
Host environment
- Operating system: Ubunut 24.04
- OS/kernel version:
- Architecture: x86_64
- QEMU flavor: qemu-system-x86_64
- QEMU version: 3428a389
- QEMU command line: see below
Emulated/Virtualized environment
- Operating system: N/A
- OS/kernel version: N/A
- Architecture: x86_64
Description of problem
As of QEMU 9.0 the script included below would increment the time via qtest, but it is now broken and time doesn't seem to be updated. I do note that the QEMU sources use clock_step extensively via qtest_clock_step, but nothing seems to be using the return value so maybe that's why it hasn't been noticed?
It seems to have been broken in bc02be45 which was trying to prevent some deadlock. You can prove that this breaks it by setting a breakpoint in qemu_virtual_clock_set_ns
-- it never gets called.
Steps to reproduce
Run this python script from your QEMU build directory:
#!/usr/bin/env python3
import subprocess
import socket
import typing
qemu_path = "./qemu-system-x86_64"
def main():
s1, s2 = socket.socketpair()
qemu = subprocess.Popen(
[
qemu_path,
"-S",
"-display",
"none",
"-chardev", f"socket,id=qtest,fd={s1.fileno()},nodelay=on",
"-qtest", "chardev:qtest",
"-qtest-log", "/dev/fd/2",
"-accel", "qtest",
],
pass_fds=[s1.fileno()],
)
try:
fp = s2.makefile("rw", buffering=1)
fp.write(f"clock_set 1234\n")
result = fp.readline()[:-1].split(" ")
assert result == ["OK", "1234"], f"Unexpected result: {result}"
finally:
qemu.kill()
if __name__ == "__main__":
main()