net: give more chances to rcu in netdev_wait_allrefs_any()
This came while reviewing commitc4e86b4363
("net: add two more call_rcu_hurry()"). Paolo asked if adding one synchronize_rcu() would help. While synchronize_rcu() does not help, making sure to call rcu_barrier() before msleep(wait) is definitely helping to make sure lazy call_rcu() are completed. Instead of waiting ~100 seconds in my tests, the ref_tracker splats occurs one time only, and netdev_wait_allrefs_any() latency is reduced to the strict minimum. Ideally we should audit our call_rcu() users to make sure no refcount (or cascading call_rcu()) is held too long, because rcu_barrier() is quite expensive. Fixes:0e4be9e57e
("net: use exponential backoff in netdev_wait_allrefs") Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/all/28bbf698-befb-42f6-b561-851c67f464aa@kernel.org/T/#m76d73ed6b03cd930778ac4d20a777f22a08d6824 Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d63394abc9
commit
cd42ba1c8a
@ -10566,8 +10566,9 @@ static struct net_device *netdev_wait_allrefs_any(struct list_head *list)
|
||||
rebroadcast_time = jiffies;
|
||||
}
|
||||
|
||||
rcu_barrier();
|
||||
|
||||
if (!wait) {
|
||||
rcu_barrier();
|
||||
wait = WAIT_REFS_MIN_MSECS;
|
||||
} else {
|
||||
msleep(wait);
|
||||
|
Loading…
Reference in New Issue
Block a user