On 10/16/25 09:34, Akihiko Odaki wrote: > Borrow the concept of force quiescent state from Linux to ensure readers > remain fast during normal operation and to avoid stalls. > > Background > ========== > > The previous implementation had four steps to begin reclamation. > > 1. call_rcu_thread() would wait for the first callback. > > 2. call_rcu_thread() would periodically poll until a decent number of > callbacks piled up or it timed out. > > 3. synchronize_rcu() would statr a grace period (GP). > > 4. wait_for_readers() would wait for the GP to end. It would also > trigger the force_rcu notifier to break busy loops in a read-side > critical section if drain_call_rcu() had been called. > > Problem > ======= > > The separation of waiting logic across these steps led to suboptimal > behavior: > > The GP was delayed until call_rcu_thread() stops polling. > > force_rcu was not consistently triggered when call_rcu_thread() detected > a high number of pending callbacks or a timeout. This inconsistency > sometimes led to stalls, as reported in a virtio-gpu issue where memory > unmapping was blocked[1]. > > wait_for_readers() imposed unnecessary overhead in non-urgent cases by > unconditionally executing qatomic_set(&index->waiting, true) and > qemu_event_reset(&rcu_gp_event), which are necessary only for expedited > synchronization. > > Solution > ======== > > Move the polling in call_rcu_thread() to wait_for_readers() to prevent > the delay of the GP. Additionally, reorganize wait_for_readers() to > distinguish between two states: > > Normal State: it relies exclusively on periodic polling to detect > the end of the GP and maintains the read-side fast path. > > Force Quiescent State: Whenever expediting synchronization, it always > triggers force_rcu and executes both qatomic_set(&index->waiting, true) > and qemu_event_reset(&rcu_gp_event). This avoids stalls while confining > the read-side overhead to this state. > > This unified approach, inspired by the Linux RCU, ensures consistent and > efficient RCU grace period handling and confirms resolution of the > virtio-gpu issue. > > [1] > https://lore.kernel.org/qemu-devel/[email protected]/ > > Signed-off-by: Akihiko Odaki <[email protected]> > --- > util/rcu.c | 79 > ++++++++++++++++++++++++++++++++++++++++---------------------- > 1 file changed, 51 insertions(+), 28 deletions(-)
Tested-by: Dmitry Osipenko <[email protected]> # drm native contexts + venus -- Best regards, Dmitry
