Merge branch 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull RCU updates from Ingo Molnar:
"The biggest RCU changes in this cycle were:
- Convert RCU's BUG_ON() and similar calls to WARN_ON() and similar.
- Replace calls of RCU-bh and RCU-sched update-side functions to
their vanilla RCU counterparts. This series is a step towards
complete removal of the RCU-bh and RCU-sched update-side functions.
( Note that some of these conversions are going upstream via their
respective maintainers. )
- Documentation updates, including a number of flavor-consolidation
updates from Joel Fernandes.
- Miscellaneous fixes.
- Automate generation of the initrd filesystem used for rcutorture
testing.
- Convert spin_is_locked() assertions to instead use lockdep.
( Note that some of these conversions are going upstream via their
respective maintainers. )
- SRCU updates, especially including a fix from Dennis Krein for a
bag-on-head-class bug.
- RCU torture-test updates"
* 'core-rcu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (112 commits)
rcutorture: Don't do busted forward-progress testing
rcutorture: Use 100ms buckets for forward-progress callback histograms
rcutorture: Recover from OOM during forward-progress tests
rcutorture: Print forward-progress test age upon failure
rcutorture: Print time since GP end upon forward-progress failure
rcutorture: Print histogram of CB invocation at OOM time
rcutorture: Print GP age upon forward-progress failure
rcu: Print per-CPU callback counts for forward-progress failures
rcu: Account for nocb-CPU callback counts in RCU CPU stall warnings
rcutorture: Dump grace-period diagnostics upon forward-progress OOM
rcutorture: Prepare for asynchronous access to rcu_fwd_startat
torture: Remove unnecessary "ret" variables
rcutorture: Affinity forward-progress test to avoid housekeeping CPUs
rcutorture: Break up too-long rcu_torture_fwd_prog() function
rcutorture: Remove cbflood facility
torture: Bring any extra CPUs online during kernel startup
rcutorture: Add call_rcu() flooding forward-progress tests
rcutorture/formal: Replace synchronize_sched() with synchronize_rcu()
tools/kernel.h: Replace synchronize_sched() with synchronize_rcu()
net/decnet: Replace rcu_barrier_bh() with rcu_barrier()
...
This commit is contained in:
+1
-1
@@ -728,7 +728,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry)
|
||||
rcu_assign_pointer(*pp, p->next);
|
||||
hlist_del_init(&p->mglist);
|
||||
del_timer(&p->timer);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
call_rcu(&p->rcu, br_multicast_free_pg);
|
||||
err = 0;
|
||||
|
||||
if (!mp->ports && !mp->host_joined &&
|
||||
|
||||
@@ -260,7 +260,7 @@ static void br_multicast_group_expired(struct timer_list *t)
|
||||
hlist_del_rcu(&mp->hlist[mdb->ver]);
|
||||
mdb->size--;
|
||||
|
||||
call_rcu_bh(&mp->rcu, br_multicast_free_group);
|
||||
call_rcu(&mp->rcu, br_multicast_free_group);
|
||||
|
||||
out:
|
||||
spin_unlock(&br->multicast_lock);
|
||||
@@ -291,7 +291,7 @@ static void br_multicast_del_pg(struct net_bridge *br,
|
||||
del_timer(&p->timer);
|
||||
br_mdb_notify(br->dev, p->port, &pg->addr, RTM_DELMDB,
|
||||
p->flags);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
call_rcu(&p->rcu, br_multicast_free_pg);
|
||||
|
||||
if (!mp->ports && !mp->host_joined &&
|
||||
netif_running(br->dev))
|
||||
@@ -358,7 +358,7 @@ static int br_mdb_rehash(struct net_bridge_mdb_htable __rcu **mdbp, int max,
|
||||
}
|
||||
|
||||
br_mdb_rehash_seq++;
|
||||
call_rcu_bh(&mdb->rcu, br_mdb_free);
|
||||
call_rcu(&mdb->rcu, br_mdb_free);
|
||||
|
||||
out:
|
||||
rcu_assign_pointer(*mdbp, mdb);
|
||||
@@ -1629,7 +1629,7 @@ br_multicast_leave_group(struct net_bridge *br,
|
||||
rcu_assign_pointer(*pp, p->next);
|
||||
hlist_del_init(&p->mglist);
|
||||
del_timer(&p->timer);
|
||||
call_rcu_bh(&p->rcu, br_multicast_free_pg);
|
||||
call_rcu(&p->rcu, br_multicast_free_pg);
|
||||
br_mdb_notify(br->dev, port, group, RTM_DELMDB,
|
||||
p->flags);
|
||||
|
||||
@@ -2051,19 +2051,19 @@ void br_multicast_dev_del(struct net_bridge *br)
|
||||
hlist_for_each_entry_safe(mp, n, &mdb->mhash[i],
|
||||
hlist[ver]) {
|
||||
del_timer(&mp->timer);
|
||||
call_rcu_bh(&mp->rcu, br_multicast_free_group);
|
||||
call_rcu(&mp->rcu, br_multicast_free_group);
|
||||
}
|
||||
}
|
||||
|
||||
if (mdb->old) {
|
||||
spin_unlock_bh(&br->multicast_lock);
|
||||
rcu_barrier_bh();
|
||||
rcu_barrier();
|
||||
spin_lock_bh(&br->multicast_lock);
|
||||
WARN_ON(mdb->old);
|
||||
}
|
||||
|
||||
mdb->old = mdb;
|
||||
call_rcu_bh(&mdb->rcu, br_mdb_free);
|
||||
call_rcu(&mdb->rcu, br_mdb_free);
|
||||
|
||||
out:
|
||||
spin_unlock_bh(&br->multicast_lock);
|
||||
|
||||
+2
-2
@@ -801,7 +801,7 @@ void __netpoll_cleanup(struct netpoll *np)
|
||||
ops->ndo_netpoll_cleanup(np->dev);
|
||||
|
||||
RCU_INIT_POINTER(np->dev->npinfo, NULL);
|
||||
call_rcu_bh(&npinfo->rcu, rcu_cleanup_netpoll_info);
|
||||
call_rcu(&npinfo->rcu, rcu_cleanup_netpoll_info);
|
||||
} else
|
||||
RCU_INIT_POINTER(np->dev->npinfo, NULL);
|
||||
}
|
||||
@@ -812,7 +812,7 @@ void __netpoll_free(struct netpoll *np)
|
||||
ASSERT_RTNL();
|
||||
|
||||
/* Wait for transmitting packets to finish before freeing. */
|
||||
synchronize_rcu_bh();
|
||||
synchronize_rcu();
|
||||
__netpoll_cleanup(np);
|
||||
kfree(np);
|
||||
}
|
||||
|
||||
+1
-1
@@ -583,7 +583,7 @@ void sk_psock_drop(struct sock *sk, struct sk_psock *psock)
|
||||
write_unlock_bh(&sk->sk_callback_lock);
|
||||
sk_psock_clear_state(psock, SK_PSOCK_TX_ENABLED);
|
||||
|
||||
call_rcu_sched(&psock->rcu, sk_psock_destroy);
|
||||
call_rcu(&psock->rcu, sk_psock_destroy);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sk_psock_drop);
|
||||
|
||||
|
||||
@@ -2405,7 +2405,7 @@ static void __exit decnet_exit(void)
|
||||
|
||||
proto_unregister(&dn_proto);
|
||||
|
||||
rcu_barrier_bh(); /* Wait for completion of call_rcu_bh()'s */
|
||||
rcu_barrier(); /* Wait for completion of call_rcu()'s */
|
||||
}
|
||||
module_exit(decnet_exit);
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -540,7 +540,7 @@ void qdisc_put_stab(struct qdisc_size_table *tab)
|
||||
|
||||
if (--tab->refcnt == 0) {
|
||||
list_del(&tab->list);
|
||||
call_rcu_bh(&tab->rcu, stab_kfree_rcu);
|
||||
call_rcu(&tab->rcu, stab_kfree_rcu);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(qdisc_put_stab);
|
||||
|
||||
@@ -1372,7 +1372,7 @@ void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
|
||||
if (!tp_head) {
|
||||
RCU_INIT_POINTER(*miniqp->p_miniq, NULL);
|
||||
/* Wait for flying RCU callback before it is freed. */
|
||||
rcu_barrier_bh();
|
||||
rcu_barrier();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1380,10 +1380,10 @@ void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
|
||||
&miniqp->miniq1 : &miniqp->miniq2;
|
||||
|
||||
/* We need to make sure that readers won't see the miniq
|
||||
* we are about to modify. So wait until previous call_rcu_bh callback
|
||||
* we are about to modify. So wait until previous call_rcu callback
|
||||
* is done.
|
||||
*/
|
||||
rcu_barrier_bh();
|
||||
rcu_barrier();
|
||||
miniq->filter_list = tp_head;
|
||||
rcu_assign_pointer(*miniqp->p_miniq, miniq);
|
||||
|
||||
@@ -1392,7 +1392,7 @@ void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
|
||||
* block potential new user of miniq_old until all readers
|
||||
* are not seeing it.
|
||||
*/
|
||||
call_rcu_bh(&miniq_old->rcu, mini_qdisc_rcu_func);
|
||||
call_rcu(&miniq_old->rcu, mini_qdisc_rcu_func);
|
||||
}
|
||||
EXPORT_SYMBOL(mini_qdisc_pair_swap);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user