From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43035) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLasF-0002v2-GG for qemu-devel@nongnu.org; Wed, 11 Feb 2015 12:14:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YLas6-0002vY-Fl for qemu-devel@nongnu.org; Wed, 11 Feb 2015 12:14:51 -0500 Received: from mail-we0-x229.google.com ([2a00:1450:400c:c03::229]:46789) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLas6-0002uC-9J for qemu-devel@nongnu.org; Wed, 11 Feb 2015 12:14:42 -0500 Received: by mail-we0-f169.google.com with SMTP id k48so4867943wev.0 for ; Wed, 11 Feb 2015 09:14:41 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 11 Feb 2015 18:14:30 +0100 Message-Id: <1423674872-10676-2-git-send-email-pbonzini@redhat.com> In-Reply-To: <1423674872-10676-1-git-send-email-pbonzini@redhat.com> References: <1423674872-10676-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 1/3] rcu: do not let RCU callbacks pile up indefinitely List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mdroth@linux.vnet.ibm.com Always process them within half a second. Even though waiting a little is useful, it is not okay to delay e.g. qemu_opts_del forever. Signed-off-by: Paolo Bonzini --- 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); -- 1.8.3.1