Always process them within a short time. Even though waiting a little is useful, it is not okay to delay e.g. qemu_opts_del forever.
Reviewed-by: Michael Roth <[email protected]> Tested-by: Michael Roth <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> --- util/rcu.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/util/rcu.c b/util/rcu.c index c9c3e6e..486d7b6 100644 --- a/util/rcu.c +++ b/util/rcu.c @@ -223,14 +223,16 @@ static void *call_rcu_thread(void *opaque) * Fetch rcu_call_count now, we only must process elements that were * added before synchronize_rcu() starts. */ - while (n < RCU_CALL_MIN_SIZE && ++tries <= 5) { - g_usleep(100000); - qemu_event_reset(&rcu_call_ready_event); - n = atomic_read(&rcu_call_count); - if (n < RCU_CALL_MIN_SIZE) { - qemu_event_wait(&rcu_call_ready_event); + while (n == 0 || (n < RCU_CALL_MIN_SIZE && ++tries <= 5)) { + g_usleep(10000); + if (n == 0) { + qemu_event_reset(&rcu_call_ready_event); n = atomic_read(&rcu_call_count); + if (n == 0) { + qemu_event_wait(&rcu_call_ready_event); + } } + n = atomic_read(&rcu_call_count); } atomic_sub(&rcu_call_count, n); -- 2.3.0
