> -----Original Message----- > From: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> > Sent: Tuesday, June 15, 2021 17:55 > To: bpf@xxxxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx > Cc: Martin KaFai Lau <kafai@xxxxxx>; Hangbin Liu <liuhangbin@xxxxxxxxx>; > Jesper Dangaard Brouer <brouer@xxxxxxxxxx>; Magnus Karlsson > <magnus.karlsson@xxxxxxxxx>; Paul E . McKenney <paulmck@xxxxxxxxxx>; > Jakub Kicinski <kuba@xxxxxxxxxx>; Toke Høiland-Jørgensen > <toke@xxxxxxxxxx>; Madalin Bucur <madalin.bucur@xxxxxxx>; Ioana > Ciornei <ioana.ciornei@xxxxxxx>; Ioana Ciocoi Radulescu > <ruxandra.radulescu@xxxxxxx> > Subject: [PATCH bpf-next v2 07/16] freescale: remove rcu_read_lock() > around XDP program invocation > > The dpaa and dpaa2 drivers have 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. > > Cc: Madalin Bucur <madalin.bucur@xxxxxxx> > Cc: Ioana Ciornei <ioana.ciornei@xxxxxxx> > Cc: Ioana Radulescu <ruxandra.radulescu@xxxxxxx> > Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> > --- Reviewed-by: Camelia Groza <camelia.groza@xxxxxxx> Thanks! > drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 11 ++++------- > drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 6 +++--- > 2 files changed, 7 insertions(+), 10 deletions(-) > > diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > index 177c020bf34a..98fdcbde687a 100644 > --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c > @@ -2558,13 +2558,9 @@ static u32 dpaa_run_xdp(struct dpaa_priv *priv, > struct qm_fd *fd, void *vaddr, > u32 xdp_act; > int err; > > - rcu_read_lock(); > - > xdp_prog = READ_ONCE(priv->xdp_prog); > - if (!xdp_prog) { > - rcu_read_unlock(); > + if (!xdp_prog) > return XDP_PASS; > - } > > xdp_init_buff(&xdp, DPAA_BP_RAW_SIZE - > DPAA_TX_PRIV_DATA_SIZE, > &dpaa_fq->xdp_rxq); > @@ -2585,6 +2581,9 @@ static u32 dpaa_run_xdp(struct dpaa_priv *priv, > struct qm_fd *fd, void *vaddr, > } > #endif > > + /* This code is invoked within a single NAPI poll cycle and thus under > + * local_bh_disable(), which provides the needed RCU protection. > + */ > xdp_act = bpf_prog_run_xdp(xdp_prog, &xdp); > > /* Update the length and the offset of the FD */ > @@ -2638,8 +2637,6 @@ static u32 dpaa_run_xdp(struct dpaa_priv *priv, > struct qm_fd *fd, void *vaddr, > break; > } > > - rcu_read_unlock(); > - > return xdp_act; > } > > diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > index 8433aa730c42..964d85c9e37d 100644 > --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c > @@ -352,8 +352,6 @@ static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv > *priv, > u32 xdp_act = XDP_PASS; > int err, offset; > > - rcu_read_lock(); > - > xdp_prog = READ_ONCE(ch->xdp.prog); > if (!xdp_prog) > goto out; > @@ -363,6 +361,9 @@ static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv > *priv, > xdp_prepare_buff(&xdp, vaddr + offset, XDP_PACKET_HEADROOM, > dpaa2_fd_get_len(fd), false); > > + /* This code is invoked within a single NAPI poll cycle and thus under > + * local_bh_disable(), which provides the needed RCU protection. > + */ > xdp_act = bpf_prog_run_xdp(xdp_prog, &xdp); > > /* xdp.data pointer may have changed */ > @@ -414,7 +415,6 @@ static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv > *priv, > > ch->xdp.res |= xdp_act; > out: > - rcu_read_unlock(); > return xdp_act; > } > > -- > 2.31.1