x86 vm fails to stop on Darwin aarch64 when qemu compiled with -O1/-O2
Host environment
- Operating system: MacOS Ventura 13.3.1 (a)
- OS/kernel version: Darwin mbp.local 22.4.0 Darwin Kernel Version 22.4.0
- Architecture: ARM64
- QEMU flavor: qemu-system-x86_64
- QEMU version: 8.0.0
- QEMU command line:
./qemu-system-x86_64 -serial mon:stdio -drive file=ubuntu_20_04.qcow2,if=virtio,cache=writeback,discard=ignore,format=qcow2 -drive file=cidata.iso,media=cdrom -machine type=pc,accel=tcg -vnc 127.0.0.1:16 -name ubuntu_20_04.qcow2 -nographic -netdev user,id=user.0,hostfwd=tcp::2640-:22 -m 2048M -smp 1 -device virtio-net,netdev=user.0 -boot c
Emulated/Virtualized environment
- Operating system: Ubuntu 20.04
- OS/kernel version: 5.4.0
- Architecture: x86
Description of problem
When compiled with -O2
or -O1
qemu process hangs on full VM stopping on macOS aarch64 host if shutdown -P now
initiated from guest system.
Steps to reproduce
- Compile latest qemu version with -O2 (default value) or -O1 passed
- Run qemu-system-x86_64 with ubuntu image, e.g. https://cloud-images.ubuntu.com/focal/20230215/focal-server-cloudimg-amd64.img and custom cloud-init (for user/password authentication)
- Wait until image is loaded, connect via vnc or provide login/password in stdio
- Initiate shutdown with
sudo shutdown -P now
- See that VM indefinitely shutdowns
- Kill VM from host system with kill -9 <qemu-system-x86_64-process-pid>
- Recompile qemu with -O0
- Repeat steps 2-4
- See that vm successfully stopped, and qemu process exited with code 0
Additional information
I've created thread dump from activity monitor with threads which qemu hanging on, attached below sample-qemu-system-x86_64.txt
Probably there is some compiler optimisation which prevents qemu threads from receive shutdown signal or appropriate notification from another threads.
The compiler version with which qemu is built:
% cc --version
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Edited by Dmitriy Poluyanov