From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ioana Ciocoi Radulescu Subject: [PATCH v2 net-next 2/8] dpaa2-eth: Allow XDP header adjustments Date: Mon, 26 Nov 2018 16:27:30 +0000 Message-ID: <1543249591-14563-3-git-send-email-ruxandra.radulescu@nxp.com> References: <1543249591-14563-1-git-send-email-ruxandra.radulescu@nxp.com> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Cc: Ioana Ciornei , "dsahern@gmail.com" , Camelia Alexandra Groza To: "netdev@vger.kernel.org" , "davem@davemloft.net" Return-path: Received: from mail-eopbgr80084.outbound.protection.outlook.com ([40.107.8.84]:2992 "EHLO EUR04-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726771AbeK0DWN (ORCPT ); Mon, 26 Nov 2018 22:22:13 -0500 In-Reply-To: <1543249591-14563-1-git-send-email-ruxandra.radulescu@nxp.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: Reserve XDP_PACKET_HEADROOM bytes in Rx buffers to allow XDP programs to increase frame header size. Signed-off-by: Ioana Radulescu --- v2: no changes drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 43 ++++++++++++++++++++= ++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-eth.c index d3cfed4..008cdf8 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -216,11 +216,15 @@ static u32 run_xdp(struct dpaa2_eth_priv *priv, =20 xdp.data =3D vaddr + dpaa2_fd_get_offset(fd); xdp.data_end =3D xdp.data + dpaa2_fd_get_len(fd); - xdp.data_hard_start =3D xdp.data; + xdp.data_hard_start =3D xdp.data - XDP_PACKET_HEADROOM; xdp_set_data_meta_invalid(&xdp); =20 xdp_act =3D bpf_prog_run_xdp(xdp_prog, &xdp); =20 + /* xdp.data pointer may have changed */ + dpaa2_fd_set_offset(fd, xdp.data - vaddr); + dpaa2_fd_set_len(fd, xdp.data_end - xdp.data); + switch (xdp_act) { case XDP_PASS: break; @@ -1483,7 +1487,7 @@ static bool xdp_mtu_valid(struct dpaa2_eth_priv *priv= , int mtu) =20 mfl =3D DPAA2_ETH_L2_MAX_FRM(mtu); linear_mfl =3D DPAA2_ETH_RX_BUF_SIZE - DPAA2_ETH_RX_HWA_SIZE - - dpaa2_eth_rx_head_room(priv); + dpaa2_eth_rx_head_room(priv) - XDP_PACKET_HEADROOM; =20 if (mfl > linear_mfl) { netdev_warn(priv->net_dev, "Maximum MTU for XDP is %d\n", @@ -1537,6 +1541,32 @@ static int dpaa2_eth_change_mtu(struct net_device *d= ev, int new_mtu) return 0; } =20 +static int update_rx_buffer_headroom(struct dpaa2_eth_priv *priv, bool has= _xdp) +{ + struct dpni_buffer_layout buf_layout =3D {0}; + int err; + + err =3D dpni_get_buffer_layout(priv->mc_io, 0, priv->mc_token, + DPNI_QUEUE_RX, &buf_layout); + if (err) { + netdev_err(priv->net_dev, "dpni_get_buffer_layout failed\n"); + return err; + } + + /* Reserve extra headroom for XDP header size changes */ + buf_layout.data_head_room =3D dpaa2_eth_rx_head_room(priv) + + (has_xdp ? XDP_PACKET_HEADROOM : 0); + buf_layout.options =3D DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM; + err =3D dpni_set_buffer_layout(priv->mc_io, 0, priv->mc_token, + DPNI_QUEUE_RX, &buf_layout); + if (err) { + netdev_err(priv->net_dev, "dpni_set_buffer_layout failed\n"); + return err; + } + + return 0; +} + static int setup_xdp(struct net_device *dev, struct bpf_prog *prog) { struct dpaa2_eth_priv *priv =3D netdev_priv(dev); @@ -1560,11 +1590,18 @@ static int setup_xdp(struct net_device *dev, struct= bpf_prog *prog) if (up) dpaa2_eth_stop(dev); =20 - /* While in xdp mode, enforce a maximum Rx frame size based on MTU */ + /* While in xdp mode, enforce a maximum Rx frame size based on MTU. + * Also, when switching between xdp/non-xdp modes we need to reconfigure + * our Rx buffer layout. Buffer pool was drained on dpaa2_eth_stop, + * so we are sure no old format buffers will be used from now on. + */ if (need_update) { err =3D set_rx_mfl(priv, dev->mtu, !!prog); if (err) goto out_err; + err =3D update_rx_buffer_headroom(priv, !!prog); + if (err) + goto out_err; } =20 old =3D xchg(&priv->xdp_prog, prog); --=20 2.7.4