From patchwork Fri Feb 14 13:03:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Flavio Leitner X-Patchwork-Id: 1238028 X-Patchwork-Delegate: i.maximets@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=silver.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=sysclose.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=sysclose.org header.i=@sysclose.org header.a=rsa-sha256 header.s=201903 header.b=ljc9qK+w; dkim-atps=neutral Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48Jtqk650Wz9s29 for ; Sat, 15 Feb 2020 00:04:02 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 2CEBF220C2; Fri, 14 Feb 2020 13:04:01 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id unPtaB7iTeSD; Fri, 14 Feb 2020 13:03:59 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id EF98A21FF6; Fri, 14 Feb 2020 13:03:58 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id BF78DC1D90; Fri, 14 Feb 2020 13:03:58 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id F1274C1D8D for ; Fri, 14 Feb 2020 13:03:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id EE69188007 for ; Fri, 14 Feb 2020 13:03:56 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XdzbU5S5i2tq for ; Fri, 14 Feb 2020 13:03:56 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from sysclose.org (smtp.sysclose.org [69.164.214.230]) by hemlock.osuosl.org (Postfix) with ESMTPS id 10D4387FDE for ; Fri, 14 Feb 2020 13:03:56 +0000 (UTC) Received: from localhost (unknown [191.7.188.156]) by sysclose.org (Postfix) with ESMTPSA id 55D8F3576; Fri, 14 Feb 2020 13:03:57 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 sysclose.org 55D8F3576 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sysclose.org; s=201903; t=1581685437; bh=XDZyM4zGaAVktFnLuPOoy5Xh4ZEPndmPcp7B8snuYQA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ljc9qK+wxBuy/HyShV8P8RzP5dti2BrK2doWC8bATosgM/5pItyzo/17yc+Ffqd8k sqxWVtBTeOVaslRSCILWZMIKNiQnhDSuX7HgRp2wrEf+gjw5H7mdYGe7CyyLSmS5o9 7Ps2+4xKiHmiq+FU+mSXNgeIrsA08XQk7bD6XW7mLELI3wSy4wgxyK4i+iIpfx+waF P0UIziM6GEv6xlXzJdfO9wSQLmE5tIgSm41jY/vX/8ahKQIrfd4arL3BZ9h7zvgWa5 nShyuDKTh08YVBAnevOAHNglXhlJB2pbzQ1TZw3RDWqc/bAzKowp4hk9VRe5YrHTdZ M+zHcdTrI8+RA== From: Flavio Leitner To: dev@openvswitch.org Date: Fri, 14 Feb 2020 10:03:35 -0300 Message-Id: <20200214130336.583696-3-fbl@sysclose.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200214130336.583696-1-fbl@sysclose.org> References: <20200214130336.583696-1-fbl@sysclose.org> MIME-Version: 1.0 Cc: Flavio Leitner , Ilya Maximets Subject: [ovs-dev] [PATCH 2/3] userspace TSO: Include UDP checksum offload. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Virtio doesn't expose flags to control which protocols checksum offload needs to be enabled or disabled. This patch checks if the NIC supports UDP checksum offload and active it when TSO is enabled. Reported-by: Ilya Maximets Fixes: 29cf9c1b3b9c ("userspace: Add TCP Segmentation Offload support") Signed-off-by: Flavio Leitner --- lib/netdev-dpdk.c | 18 ++++++++++++------ lib/netdev-linux.c | 1 + lib/netdev-provider.h | 3 ++- lib/netdev.c | 24 ++++++++++++++++++++---- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 192c174f3..ec8be64aa 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -152,6 +152,14 @@ typedef uint16_t dpdk_port_t; #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ) +/* List of required flags advertised by the hardware that will be + * used if TSO is enabled. */ +#define DPDK_TX_TSO_OFFLOAD_FLAGS (DEV_TX_OFFLOAD_TCP_TSO \ + | DEV_TX_OFFLOAD_TCP_CKSUM \ + | DEV_TX_OFFLOAD_UDP_CKSUM \ + | DEV_TX_OFFLOAD_IPV4_CKSUM) + + static const struct rte_eth_conf port_conf = { .rxmode = { .mq_mode = ETH_MQ_RX_RSS, @@ -997,9 +1005,7 @@ dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq) } if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { - conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_TSO; - conf.txmode.offloads |= DEV_TX_OFFLOAD_TCP_CKSUM; - conf.txmode.offloads |= DEV_TX_OFFLOAD_IPV4_CKSUM; + conf.txmode.offloads |= DPDK_TX_TSO_OFFLOAD_FLAGS; } /* Limit configured rss hash functions to only those supported @@ -1100,12 +1106,10 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) struct rte_ether_addr eth_addr; int diag; int n_rxq, n_txq; + uint32_t tx_tso_offload_capa = DPDK_TX_TSO_OFFLOAD_FLAGS; uint32_t rx_chksm_offload_capa = DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_IPV4_CKSUM; - uint32_t tx_tso_offload_capa = DEV_TX_OFFLOAD_TCP_TSO | - DEV_TX_OFFLOAD_TCP_CKSUM | - DEV_TX_OFFLOAD_IPV4_CKSUM; rte_eth_dev_info_get(dev->port_id, &info); @@ -5110,6 +5114,7 @@ netdev_dpdk_reconfigure(struct netdev *netdev) if (dev->hw_ol_features & NETDEV_TX_TSO_OFFLOAD) { netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; } @@ -5252,6 +5257,7 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev) if (userspace_tso_enabled()) { netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; netdev->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; + netdev->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; netdev->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; vhost_unsup_flags = 1ULL << VIRTIO_NET_F_HOST_ECN | 1ULL << VIRTIO_NET_F_HOST_UFO; diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index c6f3d2740..85f3a7367 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -923,6 +923,7 @@ netdev_linux_common_construct(struct netdev *netdev_) if (userspace_tso_enabled()) { netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_TSO; netdev_->ol_flags |= NETDEV_TX_OFFLOAD_TCP_CKSUM; + netdev_->ol_flags |= NETDEV_TX_OFFLOAD_UDP_CKSUM; netdev_->ol_flags |= NETDEV_TX_OFFLOAD_IPV4_CKSUM; } diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index 22f4cde33..00677dc9d 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -40,7 +40,8 @@ struct netdev_tnl_build_header_params; enum netdev_ol_flags { NETDEV_TX_OFFLOAD_IPV4_CKSUM = 1 << 0, NETDEV_TX_OFFLOAD_TCP_CKSUM = 1 << 1, - NETDEV_TX_OFFLOAD_TCP_TSO = 1 << 2, + NETDEV_TX_OFFLOAD_UDP_CKSUM = 1 << 2, + NETDEV_TX_OFFLOAD_TCP_TSO = 1 << 3, }; /* A network device (e.g. an Ethernet device). diff --git a/lib/netdev.c b/lib/netdev.c index f95b19af4..a55f77961 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -791,6 +791,8 @@ static bool netdev_send_prepare_packet(const uint64_t netdev_flags, struct dp_packet *packet, char **errormsg) { + uint64_t l4_mask; + if (dp_packet_hwol_is_tso(packet) && !(netdev_flags & NETDEV_TX_OFFLOAD_TCP_TSO)) { /* Fall back to GSO in software. */ @@ -798,11 +800,25 @@ netdev_send_prepare_packet(const uint64_t netdev_flags, return false; } - if (dp_packet_hwol_l4_mask(packet) - && !(netdev_flags & NETDEV_TX_OFFLOAD_TCP_CKSUM)) { - /* Fall back to L4 csum in software. */ - VLOG_ERR_BUF(errormsg, "No L4 checksum support"); + l4_mask = dp_packet_hwol_l4_mask(packet); + if (l4_mask) { + if (dp_packet_hwol_l4_is_tcp(packet)) { + if (!(netdev_flags & NETDEV_TX_OFFLOAD_TCP_CKSUM)) { + /* Fall back to TCP csum in software. */ + VLOG_ERR_BUF(errormsg, "No TCP checksum support"); + return false; + } + } else if (dp_packet_hwol_l4_is_udp(packet)) { + if (!(netdev_flags & NETDEV_TX_OFFLOAD_UDP_CKSUM)) { + /* Fall back to UDP csum in software. */ + VLOG_ERR_BUF(errormsg, "No UDP checksum support"); + return false; + } + } else { + VLOG_ERR_BUF(errormsg, "No L4 checksum support: mask: %"PRIu64, + l4_mask); return false; + } } return true;