Merge branch 'rcu-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU fixes from Ingo Molnar: "Fix an SRCU bug affecting KVM IRQ injection" * 'rcu-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: srcu: Allow use of Classic SRCU from both process and interrupt context srcu: Allow use of Tiny/Tree SRCU from both process and interrupt context
This commit is contained in:
commit
6b7ed4588c
|
@ -172,9 +172,7 @@ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
retval = __srcu_read_lock(sp);
|
retval = __srcu_read_lock(sp);
|
||||||
preempt_enable();
|
|
||||||
rcu_lock_acquire(&(sp)->dep_map);
|
rcu_lock_acquire(&(sp)->dep_map);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,7 +263,7 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Counts the new reader in the appropriate per-CPU element of the
|
* 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().
|
* Returns an index that must be passed to the matching srcu_read_unlock().
|
||||||
*/
|
*/
|
||||||
int __srcu_read_lock(struct srcu_struct *sp)
|
int __srcu_read_lock(struct srcu_struct *sp)
|
||||||
|
@ -271,7 +271,7 @@ int __srcu_read_lock(struct srcu_struct *sp)
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
idx = READ_ONCE(sp->completed) & 0x1;
|
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. */
|
smp_mb(); /* B */ /* Avoid leaking the critical section. */
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
@ -281,7 +281,6 @@ EXPORT_SYMBOL_GPL(__srcu_read_lock);
|
||||||
* Removes the count for the old reader from the appropriate per-CPU
|
* 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
|
* 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().
|
* 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)
|
void __srcu_read_unlock(struct srcu_struct *sp, int idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -97,8 +97,9 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Counts the new reader in the appropriate per-CPU element of the
|
* Counts the new reader in the appropriate per-CPU element of the
|
||||||
* srcu_struct. Must be called from process context.
|
* srcu_struct. Can be invoked from irq/bh handlers, but the matching
|
||||||
* Returns an index that must be passed to the matching srcu_read_unlock().
|
* __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)
|
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
|
* 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)
|
void __srcu_read_unlock(struct srcu_struct *sp, int idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -357,7 +357,7 @@ EXPORT_SYMBOL_GPL(cleanup_srcu_struct);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Counts the new reader in the appropriate per-CPU element of the
|
* 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().
|
* Returns an index that must be passed to the matching srcu_read_unlock().
|
||||||
*/
|
*/
|
||||||
int __srcu_read_lock(struct srcu_struct *sp)
|
int __srcu_read_lock(struct srcu_struct *sp)
|
||||||
|
@ -365,7 +365,7 @@ int __srcu_read_lock(struct srcu_struct *sp)
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
idx = READ_ONCE(sp->srcu_idx) & 0x1;
|
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. */
|
smp_mb(); /* B */ /* Avoid leaking the critical section. */
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
@ -375,7 +375,6 @@ EXPORT_SYMBOL_GPL(__srcu_read_lock);
|
||||||
* Removes the count for the old reader from the appropriate per-CPU
|
* 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
|
* 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().
|
* 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)
|
void __srcu_read_unlock(struct srcu_struct *sp, int idx)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue