A hang was observed when running a small kernel that exercised VIRTIO GPU under TCG. This is an edge-case and won't happen under typical conditions.
When unmapping a blob object, its MemoryRegion's freeing is deferred to the RCU thread. The hang's cause was determined to be a busy main loop not allowing for the RCU thread to run because the kernel did not setup any timers or had any interrupts on the way. While fixing the RCU thread to run even if the guest CPU spins is a solution, it's easier to fix the reason why the MemoryRegion isn't freed from the main loop instead. While at it, also restructure the 3 stage cleanup to immediately respond to the guest if the MR happened to have had no other reference. PS: The hang can be reproduced by running this unikernel with TCG https://git.codelinaro.org/manos.pitsidianakis/virtio-tests/-/tree/8c0ebe9395827e24aa5711186d499bf5de87cf63/virtio-test-suite v1 to v2: - Add patch by Alex to prevent double-free when FlatView is destroyed from RCU thread. Alex Bennée (1): hw/display: re-arrange memory region tracking Manos Pitsidianakis (2): virtio-gpu: fix hang under TCG when unmapping blob virtio-gpu: refactor async blob unmapping include/exec/memory.h | 1 + hw/display/virtio-gpu-virgl.c | 60 ++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 26 deletions(-) base-commit: 56c6e249b6988c1b6edc2dd34ebb0f1e570a1365 -- γαῖα πυρί μιχθήτω
