From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9B5F3A04B7; Tue, 13 Oct 2020 15:59:21 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2B4911C1D9; Tue, 13 Oct 2020 15:47:01 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 043D11DB64 for ; Tue, 13 Oct 2020 15:46:07 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.150]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C5942200BD for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) Received: from us4-mdac16-46.at1.mdlocal (unknown [10.110.50.129]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id C43FF800A3 for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.110.50.7]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 5C0B2100080 for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 258AF4C006B for ; Tue, 13 Oct 2020 13:46:04 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 13 Oct 2020 14:45:56 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 13 Oct 2020 14:45:56 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09DDjuKF006097; Tue, 13 Oct 2020 14:45:56 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 82F911613AB; Tue, 13 Oct 2020 14:45:56 +0100 (BST) From: Andrew Rybchenko To: CC: Ivan Malov Date: Tue, 13 Oct 2020 14:45:41 +0100 Message-ID: <1602596753-32282-25-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1602596753-32282-1-git-send-email-arybchenko@solarflare.com> References: <1602596753-32282-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25722.003 X-TM-AS-Result: No-11.584200-8.000000-10 X-TMASE-MatchedRID: 3S3od0DStj+h9oPbMj7PPJxVZzZr7+O7S1zwNuiBtITfUZT83lbkELDT rXyhQkTUtKStS12UXPGnYP5lfj7FAt3ayerUAlue1RxJl1WR23M1xTPZh+jLeiejgKDUPU+kapp KVmWPSOLcM0iVXnvlmsH9shHafl0iP3+a/o0G5FzylEfNwb6iLSKzKD+V8ahng+Xxnj/kTwhTac dDUa7rn7a/VeSj6r5aGuxIIkd/lYAy3jNIUaQrPIdlc1JaOB1TTMmrj2fv1xr2JEyu1wk5HQYxJ ykfuo4AfZ1wWAXO/vXlDlcYHgqlXrMVOeQNlCMh4jRkIImnX0PdhJoeWdkvzbjOUXWmQ3OW22IO QnCmt7o8pGz+gshLUeXlACu2VS9Ipx+f7r80OWfQeUylZ/mLl805KBm2/UMhmyiLZetSf8mfop0 ytGwvXiq2rl3dzGQ1YKjldhK/3R4jV8eTZ4FpeU6ZOZEwuDEBbu2k74mNL+8LryE8QZmQQw== X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--11.584200-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25722.003 X-MDID: 1602596764-P0pe8eDa2UHW X-PPE-DISP: 1602596764;P0pe8eDa2UHW Subject: [dpdk-dev] [PATCH 24/36] net/sfc: support tunnel TSO for EF100 native Tx datapath X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov Handle VXLAN and Geneve TSO on EF100 native Tx datapath. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko --- doc/guides/nics/sfc_efx.rst | 3 +- drivers/net/sfc/sfc.c | 3 +- drivers/net/sfc/sfc_ef100_tx.c | 59 ++++++++++++++++++++++++++++++---- drivers/net/sfc/sfc_tx.c | 3 +- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index 104ab38aa9..e108043f38 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -329,7 +329,8 @@ boolean parameters value. is even more faster then **ef10** but does not support multi-segment mbufs, disallows multiple mempools and neglects mbuf reference counters. **ef100** chooses EF100 native datapath which supports multi-segment - mbufs, inner/outer IPv4 and TCP/UDP checksum and TCP segmentation offloads. + mbufs, inner/outer IPv4 and TCP/UDP checksum and TCP segmentation offloads + including VXLAN and GENEVE IPv4/IPv6 tunnels. - ``perf_profile`` [auto|throughput|low-latency] (default **throughput**) diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index b41db65003..d4478a2846 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -805,7 +805,8 @@ sfc_attach(struct sfc_adapter *sa) (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & (DEV_TX_OFFLOAD_VXLAN_TNL_TSO | DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) { - sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled; + sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled || + encp->enc_tso_v3_enabled; if (!sa->tso_encap) sfc_info(sa, "Encapsulated TSO support isn't available on this adapter"); } diff --git a/drivers/net/sfc/sfc_ef100_tx.c b/drivers/net/sfc/sfc_ef100_tx.c index 5ad0813a9b..a740bc9d55 100644 --- a/drivers/net/sfc/sfc_ef100_tx.c +++ b/drivers/net/sfc/sfc_ef100_tx.c @@ -98,11 +98,26 @@ static int sfc_ef100_tx_prepare_pkt_tso(struct sfc_ef100_txq * const txq, struct rte_mbuf *m) { - size_t header_len = m->l2_len + m->l3_len + m->l4_len; + size_t header_len = ((m->ol_flags & PKT_TX_TUNNEL_MASK) ? + m->outer_l2_len + m->outer_l3_len : 0) + + m->l2_len + m->l3_len + m->l4_len; size_t payload_len = m->pkt_len - header_len; unsigned long mss_conformant_max_payload_len; unsigned int nb_payload_descs; +#ifdef RTE_LIBRTE_SFC_EFX_DEBUG + switch (m->ol_flags & PKT_TX_TUNNEL_MASK) { + case 0: + /* FALLTHROUGH */ + case PKT_TX_TUNNEL_VXLAN: + /* FALLTHROUGH */ + case PKT_TX_TUNNEL_GENEVE: + break; + default: + return ENOTSUP; + } +#endif + mss_conformant_max_payload_len = m->tso_segsz * txq->tso_max_nb_outgoing_frames; @@ -383,32 +398,52 @@ sfc_ef100_tx_qdesc_tso_create(const struct rte_mbuf *m, uint16_t nb_header_descs, uint16_t nb_payload_descs, size_t header_len, size_t payload_len, + size_t outer_iph_off, size_t outer_udph_off, size_t iph_off, size_t tcph_off, efx_oword_t *tx_desc) { efx_oword_t tx_desc_extra_fields; + int ed_outer_udp_len = (outer_udph_off != 0) ? 1 : 0; + int ed_outer_ip_len = (outer_iph_off != 0) ? 1 : 0; + int ed_outer_ip_id = (outer_iph_off != 0) ? + ESE_GZ_TX_DESC_IP4_ID_INC_MOD16 : 0; /* * If no tunnel encapsulation is present, then the ED_INNER * fields should be used. */ int ed_inner_ip_id = ESE_GZ_TX_DESC_IP4_ID_INC_MOD16; + uint8_t inner_l3 = sfc_ef100_tx_qdesc_cso_inner_l3( + m->ol_flags & PKT_TX_TUNNEL_MASK); - EFX_POPULATE_OWORD_7(*tx_desc, + EFX_POPULATE_OWORD_10(*tx_desc, ESF_GZ_TX_TSO_MSS, m->tso_segsz, ESF_GZ_TX_TSO_HDR_NUM_SEGS, nb_header_descs, ESF_GZ_TX_TSO_PAYLOAD_NUM_SEGS, nb_payload_descs, + ESF_GZ_TX_TSO_ED_OUTER_IP4_ID, ed_outer_ip_id, ESF_GZ_TX_TSO_ED_INNER_IP4_ID, ed_inner_ip_id, + ESF_GZ_TX_TSO_ED_OUTER_IP_LEN, ed_outer_ip_len, ESF_GZ_TX_TSO_ED_INNER_IP_LEN, 1, + ESF_GZ_TX_TSO_ED_OUTER_UDP_LEN, ed_outer_udp_len, ESF_GZ_TX_TSO_HDR_LEN_W, header_len >> 1, ESF_GZ_TX_TSO_PAYLOAD_LEN, payload_len); - EFX_POPULATE_OWORD_5(tx_desc_extra_fields, + EFX_POPULATE_OWORD_9(tx_desc_extra_fields, + /* + * Outer offsets are required for outer IPv4 ID + * and length edits in the case of tunnel TSO. + */ + ESF_GZ_TX_TSO_OUTER_L3_OFF_W, outer_iph_off >> 1, + ESF_GZ_TX_TSO_OUTER_L4_OFF_W, outer_udph_off >> 1, /* * Inner offsets are required for inner IPv4 ID - * and IP length edits. + * and IP length edits and partial checksum + * offload in the case of tunnel TSO. */ ESF_GZ_TX_TSO_INNER_L3_OFF_W, iph_off >> 1, ESF_GZ_TX_TSO_INNER_L4_OFF_W, tcph_off >> 1, + ESF_GZ_TX_TSO_CSO_INNER_L4, + inner_l3 != ESE_GZ_TX_DESC_CS_INNER_L3_OFF, + ESF_GZ_TX_TSO_CSO_INNER_L3, inner_l3, /* * Use outer full checksum offloads which do * not require any extra information. @@ -491,12 +526,21 @@ sfc_ef100_xmit_tso_pkt(struct sfc_ef100_txq * const txq, unsigned int seg_split = 0; unsigned int tso_desc_id; unsigned int id; + size_t outer_iph_off; + size_t outer_udph_off; size_t iph_off; size_t tcph_off; size_t header_len; size_t remaining_hdr_len; - iph_off = m->l2_len; + if (m->ol_flags & PKT_TX_TUNNEL_MASK) { + outer_iph_off = m->outer_l2_len; + outer_udph_off = outer_iph_off + m->outer_l3_len; + } else { + outer_iph_off = 0; + outer_udph_off = 0; + } + iph_off = outer_udph_off + m->l2_len; tcph_off = iph_off + m->l3_len; header_len = tcph_off + m->l4_len; @@ -550,6 +594,7 @@ sfc_ef100_xmit_tso_pkt(struct sfc_ef100_txq * const txq, sfc_ef100_tx_qdesc_tso_create(m, nb_hdr_descs, nb_pld_descs, header_len, rte_pktmbuf_pkt_len(m) - header_len, + outer_iph_off, outer_udph_off, iph_off, tcph_off, &txq->txq_hw_ring[tso_desc_id]); @@ -884,7 +929,9 @@ struct sfc_dp_tx sfc_ef100_tx = { DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM | DEV_TX_OFFLOAD_MULTI_SEGS | - DEV_TX_OFFLOAD_TCP_TSO, + DEV_TX_OFFLOAD_TCP_TSO | + DEV_TX_OFFLOAD_VXLAN_TNL_TSO | + DEV_TX_OFFLOAD_GENEVE_TNL_TSO, .get_dev_info = sfc_ef100_get_dev_info, .qsize_up_rings = sfc_ef100_tx_qsize_up_rings, .qcreate = sfc_ef100_tx_qcreate, diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c index 7a8495efc7..24602e3d10 100644 --- a/drivers/net/sfc/sfc_tx.c +++ b/drivers/net/sfc/sfc_tx.c @@ -611,7 +611,8 @@ sfc_tx_start(struct sfc_adapter *sa) } } - if (sa->tso_encap && !encp->enc_fw_assisted_tso_v2_encap_enabled) { + if (sa->tso_encap && !encp->enc_fw_assisted_tso_v2_encap_enabled && + !encp->enc_tso_v3_enabled) { sfc_warn(sa, "Encapsulated TSO support was unable to be restored"); sa->tso_encap = B_FALSE; } -- 2.17.1