From patchwork Fri Mar 1 17:47:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ioana Ciornei X-Patchwork-Id: 1050316 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="QkdROJZG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449xhP3RK8z9s4V for ; Sat, 2 Mar 2019 04:47:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389456AbfCARrb (ORCPT ); Fri, 1 Mar 2019 12:47:31 -0500 Received: from mail-eopbgr130073.outbound.protection.outlook.com ([40.107.13.73]:32643 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2388730AbfCARra (ORCPT ); Fri, 1 Mar 2019 12:47:30 -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=CpjyThria8zHm6rEGm86ON3BMq+ptumtNzBUYZvNtSc=; b=QkdROJZGC/AKICADolN4BggmqymiSegV9X9ZVaqGqvtII0GoO6ekY5Qiq+ycw0h73HnGpaBhwjT5xR4NzOPsuz/vwWfz6pZyjeA794UYI2psl2KG4T8IqQ7K3G+MfScv7p9MiA1be8TE+1pjo5qmpe2N3MP5uGxX1gqIttJSuR8= Received: from VI1PR0402MB2800.eurprd04.prod.outlook.com (10.172.255.18) by VI1PR0402MB3407.eurprd04.prod.outlook.com (52.134.2.153) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.16; Fri, 1 Mar 2019 17:47:23 +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 17:47:23 +0000 From: Ioana Ciornei To: "netdev@vger.kernel.org" , "davem@davemloft.net" CC: Ioana Ciocoi Radulescu , "brouer@redhat.com" , "ilias.apalodimas@linaro.org" , "toke@redhat.com" , Ioana Ciornei Subject: [PATCH v2 1/2] dpaa2-eth: Add software annotation types Thread-Topic: [PATCH v2 1/2] dpaa2-eth: Add software annotation types Thread-Index: AQHU0FbT+gSYZxGuXEWMjWJ85/uPkQ== Date: Fri, 1 Mar 2019 17:47:23 +0000 Message-ID: <1551462396-5115-2-git-send-email-ioana.ciornei@nxp.com> References: <1551462396-5115-1-git-send-email-ioana.ciornei@nxp.com> In-Reply-To: <1551462396-5115-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: VI1PR10CA0095.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:28::24) 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: bb2a32c7-77c2-4021-d9a5-08d69e6df5d9 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:VI1PR0402MB3407; x-ms-traffictypediagnostic: VI1PR0402MB3407: x-microsoft-exchange-diagnostics: =?iso-8859-1?q?1=3BVI1PR0402MB3407=3B23?= =?iso-8859-1?q?=3AScub3rwb+r6mJhBpApwvRxnEjPENz3W2TnhCyvBGAKL26KeN?= =?iso-8859-1?q?+Q0HSRHB2KVqg1G9ZO2d+uTs5rLp8fHdbSbGzpoD6Q++Ie9NEvk?= =?iso-8859-1?q?bLLdugDkizO9E9PueeuE4icfmLLtayT0/L9gUoyY15ZAeFFhIQw?= =?iso-8859-1?q?J9K9mXnOKa+MtcvUuhlV9+JYgkuE1G67P4IdWXMOndW/xIW7NPa?= =?iso-8859-1?q?TthPS6dLEoF1o4sK60jfrWIV71YISnMx/ElvLcwHe7QkJR160//?= =?iso-8859-1?q?SF+NBYEEWLBgb4Ys1ViyPuFviIkS1mjI9QqwCQMOSGHCKO0PK8B?= =?iso-8859-1?q?8N67J520wBi8b8ni300QHr09w8sdMQNpmNwb3TpVMSKCx0tHvVN?= =?iso-8859-1?q?NC/WgelnGHuBlQSXzT7xZPfAf5J5b9iVi3xczQKD5NRUzPdg32/?= =?iso-8859-1?q?CbChFCku3zlr+G06EqHAXtb+FbZPFcQQsNo+IYvrgpoQC/nkP4E?= =?iso-8859-1?q?3jzEokxUuHN1MZF9204iI+1QP/tr7wgyKwiMadSOatOQCIhG1wY?= =?iso-8859-1?q?9HQcS+IUVWBkgfVwQD2A1EcbfJaQ3NFCdW7ykN65SAHVceKN6IE?= =?iso-8859-1?q?4C5JT05Ab9DITKP+dDK5SxTjB5/Cf9k+5AiZFdjWB9jewHyPt81?= =?iso-8859-1?q?Q4rh7xLNDZIa0ZiMmmSxXKLz7t23YGoYkblLAVDNBLAPb6c9bKo?= =?iso-8859-1?q?QDTnbnbBxNcHOkiyJLCRywoLc5v3OiJdWyp3ZeusgxG7uGGxVhm?= =?iso-8859-1?q?YX3IVceFMHDwSw6qQWKNfbA0c9zNDEwcKLbj7ePEMHWoFdDAhz9?= =?iso-8859-1?q?O5X9ia6EDFyQizmxy0MK7mycnw429DVKOBve/wYdksHnLnW7O41?= =?iso-8859-1?q?otOqusGDfFEh/eU7rzx0dlRx7BRtEJn3zvVBROILT1ZzsmIvsrf?= =?iso-8859-1?q?/rl4z1RWO+NVr0MLxgyF+nOfF98GIx3K/Res9nbe4SHRDQTFz4n?= =?iso-8859-1?q?eH41cUA0b02dFa2DyffYd+t2kx7KV5dF8zo+yCKTpUktQNW43KR?= =?iso-8859-1?q?zz13ZaRt1dWyNAghX4YdI1eAd+4G+VsF/IPI/5ZWqAarDAXvB+m?= =?iso-8859-1?q?jF04zOFkOyUhcNfoWPoaJt4GIKgJ+B+oh9ltKqIa3V+YaSukYr9?= =?iso-8859-1?q?/uKKzNBf0aBB44cQSANe+XHdflFn4lak6gI+YAkLYBS2/BYU+yp?= =?iso-8859-1?q?2DqxBOXHeS7TEqkomZC2HiNBALoFiePFOF/TAdz+OuT3PO3++si?= =?iso-8859-1?q?v7JrjKpQxRxrmfgJxLoy/MNWrXpoJWmRFHH5PdYAKHi+WtJ5+/g?= =?iso-8859-1?q?achpIz1QG5WM8TwzCCe+1lalxaLQSvrjNVLaMw=3D?= x-microsoft-antispam-prvs: x-forefront-prvs: 09634B1196 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(396003)(346002)(39860400002)(376002)(136003)(199004)(189003)(4326008)(26005)(7736002)(478600001)(71200400001)(81156014)(66066001)(8676002)(5660300002)(2616005)(68736007)(446003)(476003)(305945005)(486006)(71190400001)(81166006)(25786009)(14454004)(316002)(2906002)(11346002)(256004)(14444005)(44832011)(99286004)(2501003)(6116002)(3846002)(106356001)(36756003)(76176011)(6512007)(97736004)(386003)(6436002)(86362001)(52116002)(102836004)(54906003)(110136005)(8936002)(6506007)(105586002)(53936002)(186003)(6486002)(50226002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0402MB3407; H:VI1PR0402MB2800.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX: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: HRNSsp9K4pdXfYZtPZqrJyF7jE6cjDN04Krwvdz2GcLhHWAIShjvji4QKTqlX/MHg74IqZzQuGvLhWbZSo8H34huswXDuIrgj4kk//w4qVj7apUaouZO/2WCfuhFJf3QrCuzL6upPsw4aEs5WK+tJL24XSk+FLry5uMhWPkir8vnvthl4ljfWCcr2L5E7B7QxW6sPS6u9DD2ZbziusP9HdUwfZFc/ZztYuQtj1o0i5rFzToplTCa/+LOboIslkSwbibroWIKUuzP+LKdzsM1YIxKMHx6XSGLE1VEvv0UIRsDh3/FDsqxSgPvfhKSRpsqNpEf5D4ioAzwSdA4/09fJPld9H+/3h72FLx0Zhy06BYgfRfvcTG0oaabvuGenjG6RPKITwjf5NMZfbudHFR7Bro6A2Aa5lwjbBkgznGxEes= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: bb2a32c7-77c2-4021-d9a5-08d69e6df5d9 X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Mar 2019 17:47:23.5645 (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: VI1PR0402MB3407 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ioana Radulescu We write different metadata information in the software annotation area of Tx frames, depending on frame type. Make this more explicit by introducing a type field and separate structures for single buffer and scatter-gather frames. Signed-off-by: Ioana Radulescu Signed-off-by: Ioana Ciornei --- Changes in v2: - none drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 38 +++++++++++++----------- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 24 ++++++++++++--- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index 87777b0..3acfd8c 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -571,10 +571,11 @@ static int build_sg_fd(struct dpaa2_eth_priv *priv, * all of them on Tx Conf. */ swa = (struct dpaa2_eth_swa *)sgt_buf; - swa->skb = skb; - swa->scl = scl; - swa->num_sg = num_sg; - swa->sgt_size = sgt_buf_size; + swa->type = DPAA2_ETH_SWA_SG; + swa->sg.skb = skb; + swa->sg.scl = scl; + swa->sg.num_sg = num_sg; + swa->sg.sgt_size = sgt_buf_size; /* Separately map the SGT buffer */ addr = dma_map_single(dev, sgt_buf, sgt_buf_size, DMA_BIDIRECTIONAL); @@ -609,7 +610,7 @@ static int build_single_fd(struct dpaa2_eth_priv *priv, { struct device *dev = priv->net_dev->dev.parent; u8 *buffer_start, *aligned_start; - struct sk_buff **skbh; + struct dpaa2_eth_swa *swa; dma_addr_t addr; buffer_start = skb->data - dpaa2_eth_needed_headroom(priv, skb); @@ -626,8 +627,9 @@ static int build_single_fd(struct dpaa2_eth_priv *priv, * (in the private data area) such that we can release it * on Tx confirm */ - skbh = (struct sk_buff **)buffer_start; - *skbh = skb; + swa = (struct dpaa2_eth_swa *)buffer_start; + swa->type = DPAA2_ETH_SWA_SINGLE; + swa->single.skb = skb; addr = dma_map_single(dev, buffer_start, skb_tail_pointer(skb) - buffer_start, @@ -659,17 +661,17 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, { struct device *dev = priv->net_dev->dev.parent; dma_addr_t fd_addr; - struct sk_buff **skbh, *skb; + struct sk_buff *skb; unsigned char *buffer_start; struct dpaa2_eth_swa *swa; u8 fd_format = dpaa2_fd_get_format(fd); fd_addr = dpaa2_fd_get_addr(fd); - skbh = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr); + 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 = *skbh; - buffer_start = (unsigned char *)skbh; + skb = swa->single.skb; /* Accessing the skb buffer is safe before dma unmap, because * we didn't map the actual skb shell. */ @@ -677,15 +679,15 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, skb_tail_pointer(skb) - buffer_start, DMA_BIDIRECTIONAL); } else if (fd_format == dpaa2_fd_sg) { - swa = (struct dpaa2_eth_swa *)skbh; - skb = swa->skb; + skb = swa->sg.skb; /* Unmap the scatterlist */ - dma_unmap_sg(dev, swa->scl, swa->num_sg, DMA_BIDIRECTIONAL); - kfree(swa->scl); + dma_unmap_sg(dev, swa->sg.scl, swa->sg.num_sg, + DMA_BIDIRECTIONAL); + kfree(swa->sg.scl); /* Unmap the SGT buffer */ - dma_unmap_single(dev, fd_addr, swa->sgt_size, + dma_unmap_single(dev, fd_addr, swa->sg.sgt_size, DMA_BIDIRECTIONAL); } else { netdev_dbg(priv->net_dev, "Invalid FD format\n"); @@ -695,7 +697,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, /* Get the timestamp value */ if (priv->tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { struct skb_shared_hwtstamps shhwtstamps; - __le64 *ts = dpaa2_get_ts(skbh, true); + __le64 *ts = dpaa2_get_ts(buffer_start, true); u64 ns; memset(&shhwtstamps, 0, sizeof(shhwtstamps)); @@ -707,7 +709,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv, /* Free SGT buffer allocated on tx */ if (fd_format != dpaa2_fd_single) - skb_free_frag(skbh); + skb_free_frag(buffer_start); /* Move on with skb release */ napi_consume_skb(skb, in_napi); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h index 9510928..423976d 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h @@ -89,12 +89,28 @@ */ #define DPAA2_ETH_SWA_SIZE 64 +/* We store different information in the software annotation area of a Tx frame + * based on what type of frame it is + */ +enum dpaa2_eth_swa_type { + DPAA2_ETH_SWA_SINGLE, + DPAA2_ETH_SWA_SG, +}; + /* Must keep this struct smaller than DPAA2_ETH_SWA_SIZE */ struct dpaa2_eth_swa { - struct sk_buff *skb; - struct scatterlist *scl; - int num_sg; - int sgt_size; + enum dpaa2_eth_swa_type type; + union { + struct { + struct sk_buff *skb; + } single; + struct { + struct sk_buff *skb; + struct scatterlist *scl; + int num_sg; + int sgt_size; + } sg; + }; }; /* Annotation valid bits in FD FRC */ From patchwork Fri Mar 1 17:47:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ioana Ciornei X-Patchwork-Id: 1050317 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="L9NqzRHR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 449xhT0TDbz9s4V for ; Sat, 2 Mar 2019 04:47:37 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389525AbfCARrf (ORCPT ); Fri, 1 Mar 2019 12:47:35 -0500 Received: from mail-eopbgr130073.outbound.protection.outlook.com ([40.107.13.73]:32643 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726609AbfCARrf (ORCPT ); Fri, 1 Mar 2019 12:47:35 -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=7fz+0dqQudkwl9a8tvEEiTalqM+nALVc7ZhHWz8Kuec=; b=L9NqzRHRlzYjsMkjDX/A0Lxl9kWesbz/BlJowVZp3tUwmIacZ8VxYit+xkab21n1K1YQoLRCDW7YDVSdwcgfUjVkoEHIvX3I9fUc2eB/16TqPnYjeqNFhT8jQxcCLKQYO971NFVf8zu55fVB3i+UWoeDt86lr+MdxNBdQr0J698= Received: from VI1PR0402MB2800.eurprd04.prod.outlook.com (10.172.255.18) by VI1PR0402MB3407.eurprd04.prod.outlook.com (52.134.2.153) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.16; Fri, 1 Mar 2019 17:47:24 +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 17:47:24 +0000 From: Ioana Ciornei To: "netdev@vger.kernel.org" , "davem@davemloft.net" CC: Ioana Ciocoi Radulescu , "brouer@redhat.com" , "ilias.apalodimas@linaro.org" , "toke@redhat.com" , Ioana Ciornei Subject: [PATCH v2 2/2] dpaa2-eth: add XDP_REDIRECT support Thread-Topic: [PATCH v2 2/2] dpaa2-eth: add XDP_REDIRECT support Thread-Index: AQHU0FbTtJgh4kf+10+UcuTXlrJWjA== Date: Fri, 1 Mar 2019 17:47:24 +0000 Message-ID: <1551462396-5115-3-git-send-email-ioana.ciornei@nxp.com> References: <1551462396-5115-1-git-send-email-ioana.ciornei@nxp.com> In-Reply-To: <1551462396-5115-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: VI1PR10CA0095.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:803:28::24) 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: 3cb22938-c50f-4655-d56a-08d69e6df624 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:VI1PR0402MB3407; x-ms-traffictypediagnostic: VI1PR0402MB3407: x-microsoft-exchange-diagnostics: =?iso-8859-1?q?1=3BVI1PR0402MB3407=3B23?= =?iso-8859-1?q?=3Ay9oU4SZTyOk1raj3qobyC0+3KVeXuSf4FwdguMFJ1AsZ6d1z?= =?iso-8859-1?q?VW0J/C/zgXek9xdm+quI3XybJ7jmt4LiO4aHJ1I9bJOXcWPKrYk?= =?iso-8859-1?q?nkvM6FOde1Mh/VSj0akh6uZ/necnZllssJ7Bh0By7wZeLsxPIx1?= =?iso-8859-1?q?x4ilLaRU9cHf+5BJIsj5bEh4R0aLwOyHG27tQswv6sWyZ3yqMzY?= =?iso-8859-1?q?KY6XcUbyabnKcNWeMfSBrHpGrqWJQ23yK+mqvEMpf7E5ZFhlz8L?= =?iso-8859-1?q?Kiko0xhLm3zakvI368LMgJdlWDJvb7kcQRLK3fLcXQLd/3pBQ3f?= =?iso-8859-1?q?U7Kbmyux34qEZoZruky3y7GLrO1Hg7C7JNgd7vlyZavcSZYGPZW?= =?iso-8859-1?q?KIdqvf03M4UwF00m/IPOOTDCDACK3VCbK21/HowuAn8W0nHby0K?= =?iso-8859-1?q?VNGernf3bYLMQ6ZeHjpXFvQsGJsivNA7vv0Sd3fhN9UogtIY+lG?= =?iso-8859-1?q?tXyBYSeHrsar4mPzJ+11f5Q2gQ7atFIOzQok1gFSupKqH2e8I9/?= =?iso-8859-1?q?jiMbgAwBmUBzbB05HBOtodNNdPK2TJwYn1Xo4NfCyahTFgNMDAT?= =?iso-8859-1?q?BF+goRKaGVSdnMB3zZd6LDk1pUDeKzJKo0CpZLwn2XkRfprMsDv?= =?iso-8859-1?q?mltS7HaQ1jL7ZTjIoOxpbK/G03XGe2PeevFtHk8J+lbAZztCuBM?= =?iso-8859-1?q?gThauMUEIOVXmrk9WDgVKHVl0BZi3F7kdnYXdiSzCMB0LmsRGzb?= =?iso-8859-1?q?85YhFTF2xVhpMB6EJpkz/XR56up4mC3/ZHDHl+WCpylQlQCRSgH?= =?iso-8859-1?q?b4f6DcnC4n27+DrCFmtN7cGzK2q8GV9QQOhUphKWHxBEPXek5oY?= =?iso-8859-1?q?+7aNvAk4r4My10G0+gypTZUo4WaYWKMu8yd5DTHafGKqUa7Wge/?= =?iso-8859-1?q?S3raAi8jOZaN5O0mkiwLPIDIe12qSk9AGbs43yzsnMOVBCNF+yz?= =?iso-8859-1?q?74ammUgCH3+yQRpCwi5mK512uC12D/MoE7ZqNGql/2X1ohFgmBF?= =?iso-8859-1?q?7Ygj5JVFSy71wxkCjqgRRG0K3J22v1ZITR7ChxUJPFO5LaG8G1b?= =?iso-8859-1?q?/AD/kvYukJ+/r9Ofq8COsDi7JoBWb/lWZQ8QnHgBJ1SMSFV5pBC?= =?iso-8859-1?q?HTqcGMWXRJfj/sgraD4uLO5nErHADWQiyvVb7kw+pgz9DWfsLoA?= =?iso-8859-1?q?/+N9vRNevvGx8uyBzUIlJ8O0E+/P4NoF1wS3xV5yFSBfe4zquWk?= =?iso-8859-1?q?yfaeRWsEhe6LRC/EEV1EuQVys4rord2cTcHUiyqU080NJ5IZ0an?= =?iso-8859-1?q?eT7T/8aRpfGRRYpOVT9+7hmcU9pSyFU8DHYx0w11w9bOSH6Fmu2?= =?iso-8859-1?q?3JL4zgM3?= x-microsoft-antispam-prvs: x-forefront-prvs: 09634B1196 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(366004)(396003)(346002)(39860400002)(376002)(136003)(199004)(189003)(4326008)(26005)(7736002)(478600001)(30864003)(71200400001)(81156014)(66066001)(8676002)(5660300002)(2616005)(68736007)(446003)(476003)(305945005)(486006)(71190400001)(81166006)(25786009)(14454004)(316002)(2906002)(11346002)(256004)(14444005)(44832011)(99286004)(2501003)(6116002)(3846002)(106356001)(36756003)(76176011)(6512007)(97736004)(386003)(6436002)(86362001)(52116002)(102836004)(54906003)(110136005)(8936002)(6506007)(105586002)(53936002)(186003)(6486002)(50226002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0402MB3407; H:VI1PR0402MB2800.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX: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: nmmeDIJBvquAdU2Sx76nWQp9K9LITGK0bQFZWX35iIxNYXs9VopDmgkUWEh2o9Qf020qi7XQipRIIEoZEK/EW8S3CdOcHfGO8Il+qoPVXLoJjgMIMo0jCb9rOlbp2zhpialoVLmYnH+Ph5xo/pduTkW/Bol1a0eSITKoR7i1C9NUUHfldLwDcTo76HieJqjLNWu8k5s+zWSzYkWxHXbPETh02GIVMj0Kvz2G09bJFPm/Ug5Pz1+A54ttlwPWk1ei/3klqfvcLjTGvjHVa77cxgF+GurEIuE/GSesozXVYRUAIkTn+LpCcQlUpbccc79F7VseaK5nN1UqyzBefBFIFckSAL8S+QnYyMHFPOaCXZnoKw/9bL40GPgATgF9OkY5G+U1bqyMcw7bsCAUNDRrYvT8vI9HjIlg4k0o5seHU1Q= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3cb22938-c50f-4655-d56a-08d69e6df624 X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Mar 2019 17:47:24.0999 (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: VI1PR0402MB3407 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 --- Changes in v2: - add missing xdp_do_flush_map() call drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 175 +++++++++++++++++++-- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h | 14 ++ .../net/ethernet/freescale/dpaa2/dpaa2-ethtool.c | 1 + 3 files changed, 176 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index 3acfd8c..81085e7 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,8 +329,20 @@ 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; } + ch->xdp.res |= xdp_act; out: rcu_read_unlock(); return xdp_act; @@ -657,27 +670,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 +715,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 +824,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 +861,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; @@ -1083,6 +1111,7 @@ static int dpaa2_eth_poll(struct napi_struct *napi, int budget) int err; ch = container_of(napi, struct dpaa2_eth_channel, napi); + ch->xdp.res = 0; priv = ch->priv; do { @@ -1128,7 +1157,7 @@ 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); @@ -1136,6 +1165,9 @@ static int dpaa2_eth_poll(struct napi_struct *napi, int budget) txc_fq->dq_bytes = 0; } + if (ch->xdp.res & XDP_REDIRECT) + xdp_do_flush_map(); + return work_done; } @@ -1730,6 +1762,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 +1872,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 +2485,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..7879622 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 */ @@ -312,6 +318,7 @@ struct dpaa2_eth_ch_xdp { struct bpf_prog *prog; u64 drop_bufs[DPAA2_ETH_BUFS_PER_CMD]; int drop_cnt; + unsigned int res; }; struct dpaa2_eth_channel { @@ -326,6 +333,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 +454,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",