rcu: do not let RCU callbacks pile up indefinitely
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 <mdroth@linux.vnet.ibm.com> Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
444c7e0d92
commit
a7d1d63679
10
util/rcu.c
10
util/rcu.c
@ -223,15 +223,17 @@ static void *call_rcu_thread(void *opaque)
|
|||||||
* Fetch rcu_call_count now, we only must process elements that were
|
* Fetch rcu_call_count now, we only must process elements that were
|
||||||
* added before synchronize_rcu() starts.
|
* added before synchronize_rcu() starts.
|
||||||
*/
|
*/
|
||||||
while (n < RCU_CALL_MIN_SIZE && ++tries <= 5) {
|
while (n == 0 || (n < RCU_CALL_MIN_SIZE && ++tries <= 5)) {
|
||||||
g_usleep(100000);
|
g_usleep(10000);
|
||||||
|
if (n == 0) {
|
||||||
qemu_event_reset(&rcu_call_ready_event);
|
qemu_event_reset(&rcu_call_ready_event);
|
||||||
n = atomic_read(&rcu_call_count);
|
n = atomic_read(&rcu_call_count);
|
||||||
if (n < RCU_CALL_MIN_SIZE) {
|
if (n == 0) {
|
||||||
qemu_event_wait(&rcu_call_ready_event);
|
qemu_event_wait(&rcu_call_ready_event);
|
||||||
n = atomic_read(&rcu_call_count);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
n = atomic_read(&rcu_call_count);
|
||||||
|
}
|
||||||
|
|
||||||
atomic_sub(&rcu_call_count, n);
|
atomic_sub(&rcu_call_count, n);
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
|
Loading…
Reference in New Issue
Block a user