RCU fixes
Linus,
Please pull the latest rcu-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git rcu-urgent-for-linus
# HEAD: 8affb06737ae565722764c2b309eb0e892538344 Merge branch 'rcu/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu into rcu/urgent
Fix an SRCU bug affecting KVM IRQ injection.
Thanks,
Ingo
------------------>
Paolo Bonzini (2):
srcu: Allow use of Tiny/Tree SRCU from both process and interrupt context
srcu: Allow use of Classic SRCU from both process and interrupt context
include/linux/srcu.h | 2 -- kernel/rcu/srcu.c | 5 ++--- kernel/rcu/srcutiny.c | 7 ++++--- kernel/rcu/srcutree.c | 5 ++--- 4 files changed, 8 insertions(+), 11 deletions(-)
include/linux/srcu.h +0 -2
@@ -172,9 +172,7 @@ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) {int retval; -preempt_disable (); retval =__srcu_read_lock (sp); -preempt_enable ();rcu_lock_acquire (&(sp)->dep_map);return retval; }
kernel/rcu/srcu.c +2 -3
@@ -263,7 +263,7 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);/* * Counts the new reader in the appropriate per-CPU element of the -* srcu_struct. Must be called from process context. +* srcu_struct. * Returns an index that must be passed to the matching srcu_read_unlock(). */ int __srcu_read_lock (struct srcu_struct *sp)
@@ -271,7 +271,7 @@ int __srcu_read_lock(struct srcu_struct *sp)int idx; idx =READ_ONCE (sp->completed) &0x1 ; -__this_cpu_inc (sp->per_cpu_ref->lock_count[idx]); +this_cpu_inc (sp->per_cpu_ref->lock_count[idx]);smp_mb ();/* B */ /* Avoid leaking the critical section. */ return idx; }
@@ -281,7 +281,6 @@ EXPORT_SYMBOL_GPL(__srcu_read_lock);* Removes the count for the old reader from the appropriate per-CPU * element of the srcu_struct. Note that this may well be a different * CPU than that which was incremented by the corresponding srcu_read_lock(). -* Must be called from process context. */ void __srcu_read_unlock (struct srcu_struct *sp,int idx) {
kernel/rcu/srcutiny.c +4 -3
@@ -97,8 +97,9 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);/* * Counts the new reader in the appropriate per-CPU element of the -* srcu_struct. Must be called from process context. -* Returns an index that must be passed to the matching srcu_read_unlock(). +* srcu_struct. Can be invoked from irq/bh handlers, but the matching +* __srcu_read_unlock() must be in the same handler instance. Returns an +* index that must be passed to the matching srcu_read_unlock(). */ int __srcu_read_lock (struct srcu_struct *sp) {
@@ -112,7 +113,7 @@ EXPORT_SYMBOL_GPL(__srcu_read_lock);/* * Removes the count for the old reader from the appropriate element of -* the srcu_struct. Must be called from process context. +* the srcu_struct. */ void __srcu_read_unlock (struct srcu_struct *sp,int idx) {
kernel/rcu/srcutree.c +2 -3
@@ -357,7 +357,7 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);/* * Counts the new reader in the appropriate per-CPU element of the -* srcu_struct. Must be called from process context. +* srcu_struct. * Returns an index that must be passed to the matching srcu_read_unlock(). */ int __srcu_read_lock (struct srcu_struct *sp)
@@ -365,7 +365,7 @@ int __srcu_read_lock(struct srcu_struct *sp)int idx; idx =READ_ONCE (sp->srcu_idx) &0x1 ; -__this_cpu_inc (sp->sda->srcu_lock_count[idx]); +this_cpu_inc (sp->sda->srcu_lock_count[idx]);smp_mb ();/* B */ /* Avoid leaking the critical section. */ return idx; }
@@ -375,7 +375,6 @@ EXPORT_SYMBOL_GPL(__srcu_read_lock);* Removes the count for the old reader from the appropriate per-CPU * element of the srcu_struct. Note that this may well be a different * CPU than that which was incremented by the corresponding srcu_read_lock(). -* Must be called from process context. */ void __srcu_read_unlock (struct srcu_struct *sp,int idx) {