[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 03/15] rcu: allow nesting of rcu_read_lock/rcu_r
From: |
Fam Zheng |
Subject: |
Re: [Qemu-devel] [PATCH 03/15] rcu: allow nesting of rcu_read_lock/rcu_read_unlock |
Date: |
Mon, 26 Jan 2015 11:32:38 +0800 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Thu, 01/22 15:47, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
> 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 <address@hidden>
- [Qemu-devel] [PATCH v2 00/15] RCUification of the memory API, parts 1 and 2, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 02/15] rcu: add rcutorture, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 01/15] rcu: add rcu library, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 03/15] rcu: allow nesting of rcu_read_lock/rcu_read_unlock, Paolo Bonzini, 2015/01/22
- Re: [Qemu-devel] [PATCH 03/15] rcu: allow nesting of rcu_read_lock/rcu_read_unlock,
Fam Zheng <=
- [Qemu-devel] [PATCH 05/15] memory: remove assertion on memory_region_destroy, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 06/15] memory: protect current_map by RCU, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 08/15] exec: introduce cpu_reload_memory_map, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 10/15] exec: RCUify AddressSpaceDispatch, Paolo Bonzini, 2015/01/22
- [Qemu-devel] [PATCH 04/15] rcu: add call_rcu, Paolo Bonzini, 2015/01/22