From patchwork Fri Mar 1 15:47:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ioana Ciornei X-Patchwork-Id: 1050249 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="XHk+FrVo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449v2N3m93z9s47 for ; Sat, 2 Mar 2019 02:47:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388199AbfCAPrz (ORCPT ); Fri, 1 Mar 2019 10:47:55 -0500 Received: from mail-eopbgr20054.outbound.protection.outlook.com ([40.107.2.54]:42178 "EHLO EUR02-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728172AbfCAPry (ORCPT ); Fri, 1 Mar 2019 10:47:54 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZAa8KUbh6jpeFgcvKg5dtszp56BBDFgApsQ+NbU7d64=; b=XHk+FrVo9QoQhZM3otRpgkA4SuRQJWF5Zjt9eIgktECur0juyp5XqUP/0SyaLiwKseZkNx3wQO+5aiK4Gq+p4ayOBhUQenRO2Qv9H/V9ah9ez57pFe+Sd1VGMjUDV3oyPD/Wz7rhBG/3lbjmBz8jD8COMmIcKWlNGdISdFBuIyo= Received: from VI1PR0402MB2800.eurprd04.prod.outlook.com (10.172.255.18) by VI1PR0402MB2862.eurprd04.prod.outlook.com (10.175.23.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.18; Fri, 1 Mar 2019 15:47:45 +0000 Received: from VI1PR0402MB2800.eurprd04.prod.outlook.com ([fe80::74fe:7d24:1e75:3477]) by VI1PR0402MB2800.eurprd04.prod.outlook.com ([fe80::74fe:7d24:1e75:3477%5]) with mapi id 15.20.1665.015; Fri, 1 Mar 2019 15:47:45 +0000 From: Ioana Ciornei To: "netdev@vger.kernel.org" , "davem@davemloft.net" CC: Ioana Ciocoi Radulescu , "brouer@redhat.com" , "ilias.apalodimas@linaro.org" , Ioana Ciornei Subject: [PATCH 2/2] dpaa2-eth: add XDP_REDIRECT support Thread-Topic: [PATCH 2/2] dpaa2-eth: add XDP_REDIRECT support Thread-Index: AQHU0EYd1FQxfnxNeUm2HEGNqnb96Q== Date: Fri, 1 Mar 2019 15:47:45 +0000 Message-ID: <1551455248-26405-3-git-send-email-ioana.ciornei@nxp.com> References: <1551455248-26405-1-git-send-email-ioana.ciornei@nxp.com> In-Reply-To: <1551455248-26405-1-git-send-email-ioana.ciornei@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: VI1P18901CA0024.EURP189.PROD.OUTLOOK.COM (2603:10a6:801::34) To VI1PR0402MB2800.eurprd04.prod.outlook.com (2603:10a6:800:ad::18) authentication-results: spf=none (sender IP is ) smtp.mailfrom=ioana.ciornei@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 1.9.1 x-originating-ip: [86.34.165.90] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: f03d5f76-9d6f-457d-e08c-08d69e5d3f5c x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600127)(711020)(4605104)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR0402MB2862; x-ms-traffictypediagnostic: VI1PR0402MB2862: x-microsoft-exchange-diagnostics: =?iso-8859-1?q?1=3BVI1PR0402MB2862=3B23?= =?iso-8859-1?q?=3AY9TmD/LKs156iQykf6s6AWcBXCJHTnkT3u/AjRncfHEpABVS?= =?iso-8859-1?q?PcDp+x9QSGABFRewbWNGGPbRjLrH+5Usn/xoz8MtLJqESJubDow?= =?iso-8859-1?q?Ori8O/t13as3FRSe+dlydivIcEyDW6IwkkXKxdwmXDG1g7pchV3?= =?iso-8859-1?q?k034RxeIMHcB5rvsGX0MoBUB/eZ/VVU0LUb6BBx6q6jyu3aLJgU?= =?iso-8859-1?q?0wKvC26h5PdPyn7wKc20Q5VDr0GqeAlyauJ+MsQyqcpayvDE21I?= =?iso-8859-1?q?A5/tgaHCgHM28/fStIi28q9JMiVNOjc1nnzD4moYs/o8GCtMRJK?= =?iso-8859-1?q?W/b5lbk5yL/Zcq+D6lES5Vb8eV97ykqOi6Ha4ZgTNcPPiQ7zFyX?= =?iso-8859-1?q?5pbkgrcbkgDPQnUbusd90/0EkHM24d+XEBEKx6Ogxyfwhdf6CP3?= =?iso-8859-1?q?2DgVtmm4wcTQnORu75IdM2BqwuX49HT2510kYNpJSojMBTBAEcc?= =?iso-8859-1?q?JvcqcThb+YD3a3Z6eDINJ6puqmaujHnhycFPWO3c+kggujWHdy6?= =?iso-8859-1?q?C4jitsM5SrcM8/cPgcUI7pYLuZg7ytfMLLiC+1wl872VRZs3TRm?= =?iso-8859-1?q?TJhzAyPJeZYS3d2rMMS5W/srU40bj2S2NYbfAXueSa+scd6eznz?= =?iso-8859-1?q?GZoD2vVZO4Od+GjRxvB8pPyiFDBS/t7ZTqIhaqRecHCbDGJVvGd?= =?iso-8859-1?q?Q/w9jzindC9jXabwPP9MQZV54rTP0suXikgF10eBZIVGas82oqB?= =?iso-8859-1?q?sd/tOOIB7+c7h4J9zeYgmdH7psEtL0JOUzBZ86BrYU7h+KmE1tv?= =?iso-8859-1?q?BQTHfj8MvqVXYf3rUL5dxKfTTKi5juXnWnvOOuIhbeZgqP6J4RN?= =?iso-8859-1?q?FGPKQ6BYtJM8H8JBbDMy00ROyf76Srt4wLbOLUzkOAG5lks+9EC?= =?iso-8859-1?q?8n8BqVgwCVxhqljk4zQZnl1GDmg4kJgSDgDYpQzEPCUZCg3FSPH?= =?iso-8859-1?q?hRLz4+z5BOt2xbtFaQbbPyuKz0R68YJILsD2T05Lb2Pt3yu2SY3?= =?iso-8859-1?q?k5onS3FOrPAAhs/3M8Yocy4i4t5ksecn4j4njwbJEcaN4xGDQKv?= =?iso-8859-1?q?XeOzHaOgW1nvMJ08C3JzZyGNeECnt2aBUhA275+x7c4QWnU2RYW?= =?iso-8859-1?q?4pgGszAOF224WhT9STc/lQRP0jyPjSmnM4Owz3+YYKSaFQDePCr?= =?iso-8859-1?q?/vuSeWw8QYwKukcEzX+U7Iy4g/xVZxvrHDSdoc2SNZctypalJgU?= =?iso-8859-1?q?pg/Q6STViJujpikX3Ny81080nhBh35ZI+LOJ7s2wby1uaeLsQj8?= =?iso-8859-1?q?TFwkEP4izGJD5FFAmsC6yTG6SK1xDAenLPBsAg=3D?= x-microsoft-antispam-prvs: x-forefront-prvs: 09634B1196 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(346002)(366004)(376002)(136003)(396003)(189003)(199004)(6512007)(6436002)(97736004)(50226002)(25786009)(4326008)(66066001)(105586002)(2501003)(36756003)(106356001)(68736007)(446003)(11346002)(486006)(2616005)(476003)(6486002)(44832011)(478600001)(5660300002)(76176011)(71200400001)(71190400001)(102836004)(8936002)(256004)(26005)(6506007)(386003)(14454004)(110136005)(52116002)(81166006)(2906002)(86362001)(54906003)(186003)(8676002)(81156014)(6116002)(3846002)(7736002)(305945005)(99286004)(316002)(53936002)(14444005); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0402MB2862; H:VI1PR0402MB2800.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: gAPUfngwyOxVlAcZtctXjKELwWAArRibje6a4OoWsNLpC54yvZHJtQmmg9tMScOsFCW1GewSzhlDNjJJmsPluAGXUSdHN3Q+PHBPW8hKVZF6JBoZJ7bJUUyZPpunIdUJ9QmntMydQQvQHm0WtkOXIIdcIzmOyiyHKdWpQppZm7tp4EikNbrC0N6D5uLD8f46AMaRiSJiGXxU8Y+9mF+0bx+qKQaeY+JIavNM/aItyTIaqFP8zVtkLU1akFi7BHx+i9b2gmRQUNckSeTw3I9zl+0RiS5gk3KiZ9yn4zBpk91Pq6d1/g7dTltm4EMDsnA9U8+bceQNnxxVd0M4kn5dQ1RdphOHR2hJ830F+cWqC3bJvina6nHW5Ea/e7XfUNdGVceNVmAlFqgSPy2DovUEj+LonVmiRMNtE1GfanezVqk= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: f03d5f76-9d6f-457d-e08c-08d69e5d3f5c X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Mar 2019 15:47:45.4965 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0402MB2862 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ioana Radulescu Implement support for the XDP_REDIRECT action. The redirected frame is transmitted and confirmed on the regular Tx/Tx conf queues. Frame is marked with the "XDP" type in the software annotation, since it requires special treatment. We don't have good hardware support for TX batching, so the XDP_XMIT_FLUSH flag doesn't make a difference for now; ndo_xdp_xmit performs the actual Tx operation on the spot. Signed-off-by: Ioana Ciornei Signed-off-by: Ioana Radulescu --- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 171 +++++++++++++++++++-- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 13 ++ .../net/ethernet/freescale/dpaa2/dpaa2-ethtool.c | 1 + 3 files changed, 170 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index 3acfd8c..fbd2f82 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -296,6 +296,7 @@ static u32 run_xdp(struct dpaa2_eth_priv *priv, xdp.data_end = xdp.data + dpaa2_fd_get_len(fd); xdp.data_hard_start = xdp.data - XDP_PACKET_HEADROOM; xdp_set_data_meta_invalid(&xdp); + xdp.rxq = &ch->xdp_rxq; xdp_act = bpf_prog_run_xdp(xdp_prog, &xdp); @@ -328,6 +329,17 @@ static u32 run_xdp(struct dpaa2_eth_priv *priv, xdp_release_buf(priv, ch, addr); ch->stats.xdp_drop++; break; + case XDP_REDIRECT: + dma_unmap_page(priv->net_dev->dev.parent, addr, + DPAA2_ETH_RX_BUF_SIZE, DMA_BIDIRECTIONAL); + ch->buf_count--; + xdp.data_hard_start = vaddr; + err = xdp_do_redirect(priv->net_dev, &xdp, xdp_prog); + if (unlikely(err)) + ch->stats.xdp_drop++; + else + ch->stats.xdp_redirect++; + break; } out: @@ -657,27 +669,35 @@ static int build_single_fd(struct dpaa2_eth_priv *priv, * dpaa2_eth_tx(). */ static void free_tx_fd(const struct dpaa2_eth_priv *priv, + struct dpaa2_eth_fq *fq, const struct dpaa2_fd *fd, bool in_napi) { struct device *dev = priv->net_dev->dev.parent; dma_addr_t fd_addr; - struct sk_buff *skb; + struct sk_buff *skb = NULL; unsigned char *buffer_start; struct dpaa2_eth_swa *swa; u8 fd_format = dpaa2_fd_get_format(fd); + u32 fd_len = dpaa2_fd_get_len(fd); fd_addr = dpaa2_fd_get_addr(fd); buffer_start = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr); swa = (struct dpaa2_eth_swa *)buffer_start; if (fd_format == dpaa2_fd_single) { - skb = swa->single.skb; - /* Accessing the skb buffer is safe before dma unmap, because - * we didn't map the actual skb shell. - */ - dma_unmap_single(dev, fd_addr, - skb_tail_pointer(skb) - buffer_start, - DMA_BIDIRECTIONAL); + if (swa->type == DPAA2_ETH_SWA_SINGLE) { + skb = swa->single.skb; + /* Accessing the skb buffer is safe before dma unmap, + * because we didn't map the actual skb shell. + */ + dma_unmap_single(dev, fd_addr, + skb_tail_pointer(skb) - buffer_start, + DMA_BIDIRECTIONAL); + } else { + WARN_ONCE(swa->type != DPAA2_ETH_SWA_XDP, "Wrong SWA type"); + dma_unmap_single(dev, fd_addr, swa->xdp.dma_size, + DMA_BIDIRECTIONAL); + } } else if (fd_format == dpaa2_fd_sg) { skb = swa->sg.skb; @@ -694,6 +714,16 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, return; } + if (swa->type != DPAA2_ETH_SWA_XDP && in_napi) { + fq->dq_frames++; + fq->dq_bytes += fd_len; + } + + if (swa->type == DPAA2_ETH_SWA_XDP) { + xdp_return_frame(swa->xdp.xdpf); + return; + } + /* Get the timestamp value */ if (priv->tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { struct skb_shared_hwtstamps shhwtstamps; @@ -793,7 +823,7 @@ static netdev_tx_t dpaa2_eth_tx(struct sk_buff *skb, struct net_device *net_dev) if (unlikely(err < 0)) { percpu_stats->tx_errors++; /* Clean up everything, including freeing the skb */ - free_tx_fd(priv, &fd, false); + free_tx_fd(priv, fq, &fd, false); } else { fd_len = dpaa2_fd_get_len(&fd); percpu_stats->tx_packets++; @@ -830,12 +860,9 @@ static void dpaa2_eth_tx_conf(struct dpaa2_eth_priv *priv, percpu_extras->tx_conf_frames++; percpu_extras->tx_conf_bytes += fd_len; - fq->dq_frames++; - fq->dq_bytes += fd_len; - /* Check frame errors in the FD field */ fd_errors = dpaa2_fd_get_ctrl(fd) & DPAA2_FD_TX_ERR_MASK; - free_tx_fd(priv, fd, true); + free_tx_fd(priv, fq, fd, true); if (likely(!fd_errors)) return; @@ -1128,14 +1155,13 @@ static int dpaa2_eth_poll(struct napi_struct *napi, int budget) work_done = max(rx_cleaned, 1); out: - if (txc_fq) { + if (txc_fq && txc_fq->dq_frames) { nq = netdev_get_tx_queue(priv->net_dev, txc_fq->flowid); netdev_tx_completed_queue(nq, txc_fq->dq_frames, txc_fq->dq_bytes); txc_fq->dq_frames = 0; txc_fq->dq_bytes = 0; } - return work_done; } @@ -1730,6 +1756,105 @@ static int dpaa2_eth_xdp(struct net_device *dev, struct netdev_bpf *xdp) return 0; } +static int dpaa2_eth_xdp_xmit_frame(struct net_device *net_dev, + struct xdp_frame *xdpf) +{ + struct dpaa2_eth_priv *priv = netdev_priv(net_dev); + struct device *dev = net_dev->dev.parent; + struct rtnl_link_stats64 *percpu_stats; + struct dpaa2_eth_drv_stats *percpu_extras; + unsigned int needed_headroom; + struct dpaa2_eth_swa *swa; + struct dpaa2_eth_fq *fq; + struct dpaa2_fd fd; + void *buffer_start, *aligned_start; + dma_addr_t addr; + int err, i; + + /* We require a minimum headroom to be able to transmit the frame. + * Otherwise return an error and let the original net_device handle it + */ + needed_headroom = dpaa2_eth_needed_headroom(priv, NULL); + if (xdpf->headroom < needed_headroom) + return -EINVAL; + + percpu_stats = this_cpu_ptr(priv->percpu_stats); + percpu_extras = this_cpu_ptr(priv->percpu_extras); + + /* Setup the FD fields */ + memset(&fd, 0, sizeof(fd)); + + /* Align FD address, if possible */ + buffer_start = xdpf->data - needed_headroom; + aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN, + DPAA2_ETH_TX_BUF_ALIGN); + if (aligned_start >= xdpf->data - xdpf->headroom) + buffer_start = aligned_start; + + swa = (struct dpaa2_eth_swa *)buffer_start; + /* fill in necessary fields here */ + swa->type = DPAA2_ETH_SWA_XDP; + swa->xdp.dma_size = xdpf->data + xdpf->len - buffer_start; + swa->xdp.xdpf = xdpf; + + addr = dma_map_single(dev, buffer_start, + swa->xdp.dma_size, + DMA_BIDIRECTIONAL); + if (unlikely(dma_mapping_error(dev, addr))) { + percpu_stats->tx_dropped++; + return -ENOMEM; + } + + dpaa2_fd_set_addr(&fd, addr); + dpaa2_fd_set_offset(&fd, xdpf->data - buffer_start); + dpaa2_fd_set_len(&fd, xdpf->len); + dpaa2_fd_set_format(&fd, dpaa2_fd_single); + dpaa2_fd_set_ctrl(&fd, FD_CTRL_PTA); + + fq = &priv->fq[smp_processor_id()]; + for (i = 0; i < DPAA2_ETH_ENQUEUE_RETRIES; i++) { + err = priv->enqueue(priv, fq, &fd, 0); + if (err != -EBUSY) + break; + } + percpu_extras->tx_portal_busy += i; + if (unlikely(err < 0)) { + percpu_stats->tx_errors++; + /* let the Rx device handle the cleanup */ + return err; + } + + percpu_stats->tx_packets++; + percpu_stats->tx_bytes += dpaa2_fd_get_len(&fd); + + return 0; +} + +static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n, + struct xdp_frame **frames, u32 flags) +{ + int drops = 0; + int i, err; + + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) + return -EINVAL; + + if (!netif_running(net_dev)) + return -ENETDOWN; + + for (i = 0; i < n; i++) { + struct xdp_frame *xdpf = frames[i]; + + err = dpaa2_eth_xdp_xmit_frame(net_dev, xdpf); + if (err) { + xdp_return_frame_rx_napi(xdpf); + drops++; + } + } + + return n - drops; +} + static const struct net_device_ops dpaa2_eth_ops = { .ndo_open = dpaa2_eth_open, .ndo_start_xmit = dpaa2_eth_tx, @@ -1741,6 +1866,7 @@ static int dpaa2_eth_xdp(struct net_device *dev, struct netdev_bpf *xdp) .ndo_do_ioctl = dpaa2_eth_ioctl, .ndo_change_mtu = dpaa2_eth_change_mtu, .ndo_bpf = dpaa2_eth_xdp, + .ndo_xdp_xmit = dpaa2_eth_xdp_xmit, }; static void cdan_cb(struct dpaa2_io_notification_ctx *ctx) @@ -2353,6 +2479,21 @@ static int setup_rx_flow(struct dpaa2_eth_priv *priv, return err; } + /* xdp_rxq setup */ + err = xdp_rxq_info_reg(&fq->channel->xdp_rxq, priv->net_dev, + fq->flowid); + if (err) { + dev_err(dev, "xdp_rxq_info_reg failed\n"); + return err; + } + + err = xdp_rxq_info_reg_mem_model(&fq->channel->xdp_rxq, + MEM_TYPE_PAGE_ORDER0, NULL); + if (err) { + dev_err(dev, "xdp_rxq_info_reg_mem_model failed\n"); + return err; + } + return 0; } diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h index 423976d..6e9929c 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h @@ -95,6 +95,7 @@ enum dpaa2_eth_swa_type { DPAA2_ETH_SWA_SINGLE, DPAA2_ETH_SWA_SG, + DPAA2_ETH_SWA_XDP, }; /* Must keep this struct smaller than DPAA2_ETH_SWA_SIZE */ @@ -110,6 +111,10 @@ struct dpaa2_eth_swa { int num_sg; int sgt_size; } sg; + struct { + int dma_size; + struct xdp_frame *xdpf; + } xdp; }; }; @@ -273,6 +278,7 @@ struct dpaa2_eth_ch_stats { __u64 xdp_drop; __u64 xdp_tx; __u64 xdp_tx_err; + __u64 xdp_redirect; }; /* Maximum number of queues associated with a DPNI */ @@ -326,6 +332,7 @@ struct dpaa2_eth_channel { int buf_count; struct dpaa2_eth_ch_stats stats; struct dpaa2_eth_ch_xdp xdp; + struct xdp_rxq_info xdp_rxq; }; struct dpaa2_eth_dist_fields { @@ -446,6 +453,12 @@ unsigned int dpaa2_eth_needed_headroom(struct dpaa2_eth_priv *priv, { unsigned int headroom = DPAA2_ETH_SWA_SIZE; + /* If we don't have an skb (e.g. XDP buffer), we only need space for + * the software annotation area + */ + if (!skb) + return headroom; + /* For non-linear skbs we have no headroom requirement, as we build a * SG frame with a newly allocated SGT buffer */ diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c index a7389e7..591dfcf 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c @@ -48,6 +48,7 @@ "[drv] xdp drop", "[drv] xdp tx", "[drv] xdp tx errors", + "[drv] xdp redirect", /* FQ stats */ "[qbman] rx pending frames", "[qbman] rx pending bytes",