Skip to content

Commit 9a95eed

Browse files
Eric Dumazetkuba-moo
Eric Dumazet
authored andcommitted
netpoll: remove netpoll_srcu
netpoll_srcu is currently used from netpoll_poll_disable() and __netpoll_cleanup() Both functions run under RTNL, using netpoll_srcu adds confusion and no additional protection. Moreover the synchronize_srcu() call in __netpoll_cleanup() is performed before clearing np->dev->npinfo, which violates RCU rules. After this patch, netpoll_poll_disable() and netpoll_poll_enable() simply use rtnl_dereference(). This saves a big chunk of memory (more than 192KB on platforms with 512 cpus) Signed-off-by: Eric Dumazet <[email protected]> Reviewed-by: Breno Leitao <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent c6a1739 commit 9a95eed

File tree

1 file changed

+4
-11
lines changed

1 file changed

+4
-11
lines changed

net/core/netpoll.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@
4848

4949
static struct sk_buff_head skb_pool;
5050

51-
DEFINE_STATIC_SRCU(netpoll_srcu);
52-
5351
#define USEC_PER_POLL 50
5452

5553
#define MAX_SKB_SIZE \
@@ -220,23 +218,20 @@ EXPORT_SYMBOL(netpoll_poll_dev);
220218
void netpoll_poll_disable(struct net_device *dev)
221219
{
222220
struct netpoll_info *ni;
223-
int idx;
221+
224222
might_sleep();
225-
idx = srcu_read_lock(&netpoll_srcu);
226-
ni = srcu_dereference(dev->npinfo, &netpoll_srcu);
223+
ni = rtnl_dereference(dev->npinfo);
227224
if (ni)
228225
down(&ni->dev_lock);
229-
srcu_read_unlock(&netpoll_srcu, idx);
230226
}
231227

232228
void netpoll_poll_enable(struct net_device *dev)
233229
{
234230
struct netpoll_info *ni;
235-
rcu_read_lock();
236-
ni = rcu_dereference(dev->npinfo);
231+
232+
ni = rtnl_dereference(dev->npinfo);
237233
if (ni)
238234
up(&ni->dev_lock);
239-
rcu_read_unlock();
240235
}
241236

242237
static void refill_skbs(void)
@@ -829,8 +824,6 @@ void __netpoll_cleanup(struct netpoll *np)
829824
if (!npinfo)
830825
return;
831826

832-
synchronize_srcu(&netpoll_srcu);
833-
834827
if (refcount_dec_and_test(&npinfo->refcnt)) {
835828
const struct net_device_ops *ops;
836829

0 commit comments

Comments
 (0)