From: Andrew Morton Cc: Paul E. McKenney Signed-off-by: Andrew Morton --- include/linux/srcu.h | 2 +- kernel/srcu.c | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff -puN Documentation/RCU/checklist.txt~srcu-rcu-variant-permitting-read-side-blocking-fixes Documentation/RCU/checklist.txt diff -puN Documentation/RCU/rcu.txt~srcu-rcu-variant-permitting-read-side-blocking-fixes Documentation/RCU/rcu.txt diff -puN Documentation/RCU/whatisRCU.txt~srcu-rcu-variant-permitting-read-side-blocking-fixes Documentation/RCU/whatisRCU.txt diff -puN include/linux/srcu.h~srcu-rcu-variant-permitting-read-side-blocking-fixes include/linux/srcu.h --- a/include/linux/srcu.h~srcu-rcu-variant-permitting-read-side-blocking-fixes +++ a/include/linux/srcu.h @@ -26,7 +26,7 @@ struct srcu_struct_array { int c[2]; -} ____cacheline_internode_aligned_in_smp; +}; struct srcu_struct { int completed; diff -puN kernel/Makefile~srcu-rcu-variant-permitting-read-side-blocking-fixes kernel/Makefile diff -puN kernel/srcu.c~srcu-rcu-variant-permitting-read-side-blocking-fixes kernel/srcu.c --- a/kernel/srcu.c~srcu-rcu-variant-permitting-read-side-blocking-fixes +++ a/kernel/srcu.c @@ -49,7 +49,7 @@ void init_srcu_struct(struct srcu_struct sp->per_cpu_ref = (struct srcu_struct_array *) kmalloc(NR_CPUS * sizeof(*sp->per_cpu_ref), GFP_KERNEL); - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) { sp->per_cpu_ref[cpu].c[0] = 0; sp->per_cpu_ref[cpu].c[1] = 0; } @@ -121,8 +121,6 @@ void synchronize_srcu(struct srcu_struct int idx; int sum; - might_sleep(); - mutex_lock(&sp->mutex); smp_mb(); /* Prevent operations from leaking in. */ @@ -139,9 +137,8 @@ void synchronize_srcu(struct srcu_struct for (;;) { sum = 0; - for_each_cpu(cpu) { + for_each_possible_cpu(cpu) sum += sp->per_cpu_ref[cpu].c[idx]; - } if (sum == 0) break; schedule_timeout_interruptible(1); @@ -162,7 +159,7 @@ void synchronize_srcu(struct srcu_struct long srcu_batches_completed(struct srcu_struct *sp) { - return (sp->completed); + return sp->completed; } EXPORT_SYMBOL_GPL(init_srcu_struct); _