From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48189) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YFaQ0-0004KJ-Bo for qemu-devel@nongnu.org; Sun, 25 Jan 2015 22:32:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YFaPw-0008J3-8J for qemu-devel@nongnu.org; Sun, 25 Jan 2015 22:32:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54375) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YFaPv-0008I7-VK for qemu-devel@nongnu.org; Sun, 25 Jan 2015 22:32:48 -0500 Date: Mon, 26 Jan 2015 11:32:38 +0800 From: Fam Zheng Message-ID: <20150126033238.GC2354@ad.nay.redhat.com> References: <1421938053-10318-1-git-send-email-pbonzini@redhat.com> <1421938053-10318-4-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1421938053-10318-4-git-send-email-pbonzini@redhat.com> Subject: Re: [Qemu-devel] [PATCH 03/15] rcu: allow nesting of rcu_read_lock/rcu_read_unlock List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: borntraeger@de.ibm.com, qemu-devel@nongnu.org, stefanha@redhat.com On Thu, 01/22 15:47, Paolo Bonzini wrote: > Signed-off-by: Paolo Bonzini > --- > include/qemu/rcu.h | 15 ++++++++++++++- > tests/rcutorture.c | 2 ++ > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/include/qemu/rcu.h b/include/qemu/rcu.h > index cfef36e..da043f2 100644 > --- a/include/qemu/rcu.h > +++ b/include/qemu/rcu.h > @@ -68,6 +68,9 @@ struct rcu_reader_data { > unsigned long ctr; > bool waiting; > > + /* Data used by reader only */ > + unsigned depth; > + > /* Data used for registry, protected by rcu_gp_lock */ > QLIST_ENTRY(rcu_reader_data) node; > }; > @@ -77,8 +80,13 @@ extern __thread struct rcu_reader_data rcu_reader; > static inline void rcu_read_lock(void) > { > struct rcu_reader_data *p_rcu_reader = &rcu_reader; > + unsigned ctr; > + > + if (p_rcu_reader->depth++ > 0) { > + return; > + } > > - unsigned ctr = atomic_read(&rcu_gp_ctr); > + ctr = atomic_read(&rcu_gp_ctr); > atomic_xchg(&p_rcu_reader->ctr, ctr); > if (atomic_read(&p_rcu_reader->waiting)) { > atomic_set(&p_rcu_reader->waiting, false); > @@ -90,6 +98,11 @@ static inline void rcu_read_unlock(void) > { > struct rcu_reader_data *p_rcu_reader = &rcu_reader; > > + assert(p_rcu_reader->depth != 0); > + if (--p_rcu_reader->depth > 0) { > + return; > + } > + > atomic_xchg(&p_rcu_reader->ctr, 0); > if (atomic_read(&p_rcu_reader->waiting)) { > atomic_set(&p_rcu_reader->waiting, false); > diff --git a/tests/rcutorture.c b/tests/rcutorture.c > index 214985f..31461c3 100644 > --- a/tests/rcutorture.c > +++ b/tests/rcutorture.c > @@ -257,9 +257,11 @@ static void *rcu_read_stress_test(void *arg) > if (p->mbtest == 0) { > n_mberror++; > } > + rcu_read_lock(); > for (i = 0; i < 100; i++) { > garbage++; > } > + rcu_read_unlock(); > pc = p->pipe_count; > rcu_read_unlock(); > if ((pc > RCU_STRESS_PIPE_LEN) || (pc < 0)) { > -- > 1.8.3.1 > > Reviewed-by: Fam Zheng