Skip to content

Commit 0cc84b9

Browse files
tohojoborkmann
authored andcommitted
ti: Remove rcu_read_lock() around XDP program invocation
The cpsw driver has rcu_read_lock()/rcu_read_unlock() pairs around XDP program invocations. However, the actual lifetime of the objects referred by the XDP program invocation is longer, all the way through to the call to xdp_do_flush(), making the scope of the rcu_read_lock() too small. This turns out to be harmless because it all happens in a single NAPI poll cycle (and thus under local_bh_disable()), but it makes the rcu_read_lock() misleading. Rather than extend the scope of the rcu_read_lock(), just get rid of it entirely. With the addition of RCU annotations to the XDP_REDIRECT map types that take bh execution into account, lockdep even understands this to be safe, so there's really no reason to keep it around. Signed-off-by: Toke Høiland-Jørgensen <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Tested-by: Grygorii Strashko <[email protected]> Reviewed-by: Grygorii Strashko <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/bpf/[email protected]
1 parent 2f1e432 commit 0cc84b9

File tree

1 file changed

+2
-8
lines changed

1 file changed

+2
-8
lines changed

drivers/net/ethernet/ti/cpsw_priv.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,13 +1328,9 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
13281328
struct bpf_prog *prog;
13291329
u32 act;
13301330

1331-
rcu_read_lock();
1332-
13331331
prog = READ_ONCE(priv->xdp_prog);
1334-
if (!prog) {
1335-
ret = CPSW_XDP_PASS;
1336-
goto out;
1337-
}
1332+
if (!prog)
1333+
return CPSW_XDP_PASS;
13381334

13391335
act = bpf_prog_run_xdp(prog, xdp);
13401336
/* XDP prog might have changed packet data and boundaries */
@@ -1378,10 +1374,8 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
13781374
ndev->stats.rx_bytes += *len;
13791375
ndev->stats.rx_packets++;
13801376
out:
1381-
rcu_read_unlock();
13821377
return ret;
13831378
drop:
1384-
rcu_read_unlock();
13851379
page_pool_recycle_direct(cpsw->page_pool[ch], page);
13861380
return ret;
13871381
}

0 commit comments

Comments
 (0)