Skip to content

Monitor device_add triggers deadlock when calling drain_call_rcu on QEMU >= 6.0.0

Host environment

  • Operating system: Debian bullseye/sid
  • OS/kernel version: Linux 5.2.0-2-amd64
  • Architecture: amd64
  • QEMU flavor: qemu-system-mips64
  • QEMU version: 6.1.50 (v6.1.0-936-gba0fa56b)
  • QEMU command line:
    ./qemu-system-mips64 -nographic

Emulated/Virtualized environment

Doesn't matter

Description of problem

It hangs

Steps to reproduce

  1. Run the QEMU:
    ./qemu-system-mips64 -nographic
  2. Enter into the QEMU monitor: press ctrl-a c
  3. Execute command device_add without arguments:
(qemu) device_add
  1. It hangs so bad that only kill -9 helps

Additional information

I didn't test versions between 4.2.0 and 6.0.0, but I can confirm that 6.0.0, 6.1.0 and the latest master pull have this bug, while version 4.2.0 doesn't have it.

I've tracked the problem and found this.

  1. Command device_add calls function drain_call_rcu. drain_call_rcu waits indefinitely for drain_complete_event.
  2. Function cpu_exec in accel/tcg/cpu-exec.c calls rcu_read_lock but does not call rcu_read_unlock(). cpu_exec just spins in its inner loop.
  3. Function call_rcu_thread hanged in calling the synchronize_rcu which calls wait_for_readers.

If I execute stop command in QEMU monitor before calling device_add command, no hang happen.

Edited by Daniel P. Berrangé
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information