From: "Paul E. McKenney" An improved comment for synchronize_srcu() and fixes for code-style bugs pointed out by off-list by Joe Perches. Cc: Joe Perches Signed-off-by: Paul E. McKenney Signed-off-by: Andrew Morton --- kernel/srcu.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff -puN kernel/srcu.c~srcu-3-rcu-variant-permitting-read-side-blocking-fix kernel/srcu.c --- a/kernel/srcu.c~srcu-3-rcu-variant-permitting-read-side-blocking-fix +++ a/kernel/srcu.c @@ -62,7 +62,7 @@ static int srcu_readers_active_idx(struc sum = 0; for_each_possible_cpu(cpu) sum += per_cpu_ptr(sp->per_cpu_ref, cpu)->c[idx]; - return (sum); + return sum; } /** @@ -144,11 +144,15 @@ void srcu_read_unlock(struct srcu_struct * As with classic RCU, the updater must use some separate means of * synchronizing concurrent updates. Can block; must be called from * process context. + * + * Note that it is illegal to call synchornize_srcu() from the corresponding + * SRCU read-side critical section; doing so will result in deadlock. + * However, it is perfectly legal to call synchronize_srcu() on one + * srcu_struct from some other srcu_struct's read-side critical section. */ void synchronize_srcu(struct srcu_struct *sp) { int idx; - int sum; idx = sp->completed; mutex_lock(&sp->mutex); @@ -195,12 +199,8 @@ void synchronize_srcu(struct srcu_struct * will have finished executing. */ - for (;;) { - sum = srcu_readers_active_idx(sp, idx); - if (sum == 0) - break; + while (srcu_readers_active_idx(sp, idx)) schedule_timeout_interruptible(1); - } synchronize_sched(); /* Force memory barrier on all CPUs. */ _