From patchwork Tue Nov 13 12:12:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 997053 X-Patchwork-Delegate: ian.stokes@intel.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="KWq2wG6F"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42vRQ55mdNz9s5c for ; Tue, 13 Nov 2018 23:14:37 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 91C51904; Tue, 13 Nov 2018 12:12:50 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 1B5AD89C for ; Tue, 13 Nov 2018 12:12:49 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 589BB19B for ; Tue, 13 Nov 2018 12:12:48 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20181113121246euoutp014517c65c88108212f0c97c9ac8794e47~mre_Yi8Pa2907229072euoutp01f for ; Tue, 13 Nov 2018 12:12:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20181113121246euoutp014517c65c88108212f0c97c9ac8794e47~mre_Yi8Pa2907229072euoutp01f DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1542111167; bh=2YM/P6WCKmXbOfSSdcgFi9H49MZZe4JKVVfwNJRmeTI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KWq2wG6F++8MAttO+afcVAsKz4o6cQo1qC+HesI5yMFhFz+w4QPv7nabM7io6vmRI l6Y2pwC6vtR7ioideD9Z7wCTsYg347pNXfJ52Z5BfBAPFyKvYI2yPIaSGXqo9IdhL6 VU9L2toBz78IyQii6kQ/MTlOVj1kyBcxs1KRtr4U= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181113121246eucas1p14e45be1f34f5a4901bc9839b7edc31cf~mre9ogc4d0870608706eucas1p1M; Tue, 13 Nov 2018 12:12:46 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 5F.E7.04441.DBFBAEB5; Tue, 13 Nov 2018 12:12:45 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20181113121245eucas1p2350b9dec340003c463554d4ff4d33b43~mre8qMgJ12460324603eucas1p2V; Tue, 13 Nov 2018 12:12:45 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20181113121244eusmtrp2b5f4da7d52a8c2d5a5f0523e3ba057c4~mre8bK5eK2687426874eusmtrp2r; Tue, 13 Nov 2018 12:12:44 +0000 (GMT) X-AuditID: cbfec7f2-5e3ff70000001159-5b-5beabfbdd3fc Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 49.18.04284.CBFBAEB5; Tue, 13 Nov 2018 12:12:44 +0000 (GMT) Received: from imaximets.rnd.samsung.ru (unknown [106.109.129.180]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20181113121244eusmtip169a979b4da77ab904432c97d2f8eca7e~mre7unTeK1152111521eusmtip1Z; Tue, 13 Nov 2018 12:12:44 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Ian Stokes Date: Tue, 13 Nov 2018 15:12:22 +0300 Message-Id: <20181113121228.17650-4-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181113121228.17650-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprFKsWRmVeSWpSXmKPExsWy7djP87p797+KNji5Wcdiy7TJrBavFp1n trjS/pPdYuPDs6wWt/f3sFhMmnKC0WLup+eMFrfneFk8vfiL2aJlyU4mBy6PG/9usXks3vOS yePZ9MNMHje2n2b1eHbzP6PH82s9LB59W1YxevxvvsoawBHFZZOSmpNZllqkb5fAlbHk+Sq2 gl+WFRs3XGFuYDyp28XIySEhYCIx4focxi5GLg4hgRWMEle/L2QCSQgJfGGU6LwRBpH4zCjx cfoCRpiO1Y9fQHUsZ5R4vn8PlPODUWJN61w2kCo2AR2JU6uPgHWICFhKdF3vAitiFtjGJHH/ zX1mkISwgLXE7v0T2UFsFgFViU0P/oLZvEDx+ytPsEOsk5dYveEAWD2ngI1E4/0ZbCCDJATm sUt0nF0EVeQi8eT9N1YIW1ji1fEtUHEZif875zNB2PUS91teMkI0dzBKTD/0DyphL7Hl9Tmg Bg6g8zQl1u/Shwg7Sqw9t58JJCwhwCdx460gSJgZyJy0bTozRJhXoqNNCKJaReL3weXMELaU xM13n6Eu8JCY2buZDRJA/YwS5w6vYJnAKD8LYdkCRsZVjOKppcW56anFhnmp5XrFibnFpXnp esn5uZsYgSnm9L/jn3Ywfr2UdIhRgINRiYf3xPSX0UKsiWXFlbmHGCU4mJVEeHeavIoW4k1J rKxKLcqPLyrNSS0+xCjNwaIkzlvN8CBaSCA9sSQ1OzW1ILUIJsvEwSnVwJjoYGRSsnreQr+v k6P27ZPld7zL1Xrt4+dlc8OMX3zf1ZqxjjvSUkPifbKuT4uN675ph3JXpS//zi38rtXc++oB 3uSev86Pk6We6lzjubkgJLHPKrtqIbP9NJXekkCh9Tt0913O0KqYGybgt/Vd1ds5lYbvpKfm 6iWzq0mwzrq67af4vB19R5VYijMSDbWYi4oTAZkBcf4tAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRmVeSWpSXmKPExsVy+t/xu7p79r+KNjg508Biy7TJrBavFp1n trjS/pPdYuPDs6wWt/f3sFhMmnKC0WLup+eMFrfneFk8vfiL2aJlyU4mBy6PG/9usXks3vOS yePZ9MNMHje2n2b1eHbzP6PH82s9LB59W1YxevxvvsoawBGlZ1OUX1qSqpCRX1xiqxRtaGGk Z2hpoWdkYqlnaGwea2VkqqRvZ5OSmpNZllqkb5egl7Hk+Sq2gl+WFRs3XGFuYDyp28XIySEh YCKx+vELxi5GLg4hgaWMEifefWKCSEhJ/Ph1gRXCFpb4c62LDcQWEvjGKLHguRqIzSagI3Fq 9RFGEFtEwFpi3feNLCCDmAX2MEkc2fUerFkYKLF7/0R2EJtFQFVi04O/YDYvUPz+yhPsEAvk JVZvOMAMYnMK2Eg03p8BtcxaYv++XrYJjHwLGBlWMYqklhbnpucWG+oVJ+YWl+al6yXn525i BAb8tmM/N+9gvLQx+BCjAAejEg/viekvo4VYE8uKK3MPMUpwMCuJ8O40eRUtxJuSWFmVWpQf X1Sak1p8iNEU6KiJzFKiyfnAaMwriTc0NTS3sDQ0NzY3NrNQEuc9b1AZJSSQnliSmp2aWpBa BNPHxMEp1cCY3Hqdxfm//UavOT/WNUoer+OtzXPqPGmqWnZkQ7DJKoeTTmlRU84E37s3Q21d tMFl478yuxRl9YvY3qYWCd6qitp9ZXPZwu6y6kePnrdGhe8997r1W62jGXOwubLEhN6jO9tk NRv23pKO5V0sYNV+X5X/3LK6PZ3q9VWV+7n1XrQuviEjuUWJpTgj0VCLuag4EQDowcUTjgIA AA== X-CMS-MailID: 20181113121245eucas1p2350b9dec340003c463554d4ff4d33b43 X-Msg-Generator: CA X-RootMTR: 20181113121245eucas1p2350b9dec340003c463554d4ff4d33b43 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181113121245eucas1p2350b9dec340003c463554d4ff4d33b43 References: <20181113121228.17650-1-i.maximets@samsung.com> X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Shahaf Shuler , Flavio Leitner , Ilya Maximets Subject: [ovs-dev] [PATCH v2 3/9] dp-packet: Refactor offloading API. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org 1. No reason to have mbuf related APIs in a generic code. 2. Not only RSS/checksums should be invalidated in case of tunnel decapsulation or sending to 'ring' ports. In order to fix two above issues, new function 'dp_packet_offload_invalidate' introduced. In order to clean up/unify the code and simplify addition of new offloading features to non-DPDK version of dp-packet, introduced 'ol_flags' bitmask. Additionally reduced code complexity in 'dp_packet_clone_with_headroom' by using already existent generic APIs. Unfortunately, we still need to have a special case for mbuf initialization inside 'dp_packet_init__()'. Signed-off-by: Ilya Maximets --- lib/dp-packet.c | 14 ++++------- lib/dp-packet.h | 62 ++++++++++++++--------------------------------- lib/netdev-dpdk.c | 6 ++--- lib/netdev.c | 4 +-- 4 files changed, 28 insertions(+), 58 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 93b0e9c84..b5942f815 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -30,8 +30,10 @@ dp_packet_init__(struct dp_packet *b, size_t allocated, enum dp_packet_source so b->source = source; dp_packet_reset_offsets(b); pkt_metadata_init(&b->md, 0); - dp_packet_rss_invalidate(b); +#ifdef DPDK_NETDEV dp_packet_mbuf_init(b); +#endif + dp_packet_offload_invalidate(b); dp_packet_reset_cutlen(b); /* By default assume the packet type to be Ethernet. */ b->packet_type = htonl(PT_ETH); @@ -173,16 +175,10 @@ dp_packet_clone_with_headroom(const struct dp_packet *buffer, size_t headroom) #ifdef DPDK_NETDEV new_buffer->mbuf.ol_flags = buffer->mbuf.ol_flags; -#else - new_buffer->rss_hash_valid = buffer->rss_hash_valid; #endif - if (dp_packet_rss_valid(new_buffer)) { -#ifdef DPDK_NETDEV - new_buffer->mbuf.hash.rss = buffer->mbuf.hash.rss; -#else - new_buffer->rss_hash = buffer->rss_hash; -#endif + if (dp_packet_rss_valid(buffer)) { + dp_packet_set_rss_hash(new_buffer, dp_packet_get_rss_hash(buffer)); } return new_buffer; diff --git a/lib/dp-packet.h b/lib/dp-packet.h index bfc2d308f..67914ec59 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -58,8 +58,9 @@ struct dp_packet { uint16_t allocated_; /* Number of bytes allocated. */ uint16_t data_ofs; /* First byte actually in use. */ uint32_t size_; /* Number of bytes in use. */ + uint32_t ol_flags; /* Offloading flags. */ +#define DP_PACKET_OL_RSS_HASH_MASK 0x1 /* Is the 'rss_hash' valid? */ uint32_t rss_hash; /* Packet hash. */ - bool rss_hash_valid; /* Is the 'rss_hash' valid? */ #endif enum dp_packet_source source; /* Source of memory allocated as 'base'. */ @@ -408,6 +409,16 @@ dp_packet_get_nd_payload(const struct dp_packet *b) #ifdef DPDK_NETDEV BUILD_ASSERT_DECL(offsetof(struct dp_packet, mbuf) == 0); +/* This initialization is needed for packets that do not come from DPDK + * interfaces, when vswitchd is built with --with-dpdk. */ +static inline void +dp_packet_mbuf_init(struct dp_packet *p) +{ + p->mbuf.tx_offload = p->mbuf.packet_type = 0; + p->mbuf.nb_segs = 1; + p->mbuf.next = NULL; +} + static inline void * dp_packet_base(const struct dp_packet *b) { @@ -488,24 +499,9 @@ dp_packet_rss_valid(const struct dp_packet *p) } static inline void -dp_packet_rss_invalidate(struct dp_packet *p OVS_UNUSED) -{ -} - -static inline void -dp_packet_mbuf_rss_flag_reset(struct dp_packet *p) -{ - p->mbuf.ol_flags &= ~PKT_RX_RSS_HASH; -} - -/* This initialization is needed for packets that do not come from DPDK - * interfaces, when vswitchd is built with --with-dpdk. */ -static inline void -dp_packet_mbuf_init(struct dp_packet *p) +dp_packet_offload_invalidate(struct dp_packet *p OVS_UNUSED) { - p->mbuf.ol_flags = p->mbuf.tx_offload = p->mbuf.packet_type = 0; - p->mbuf.nb_segs = 1; - p->mbuf.next = NULL; + p->mbuf.ol_flags = 0; } static inline bool @@ -536,13 +532,6 @@ dp_packet_l4_checksum_bad(const struct dp_packet *p) PKT_RX_L4_CKSUM_BAD; } -static inline void -reset_dp_packet_checksum_ol_flags(struct dp_packet *p) -{ - p->mbuf.ol_flags &= ~(PKT_RX_L4_CKSUM_GOOD | PKT_RX_L4_CKSUM_BAD | - PKT_RX_IP_CKSUM_GOOD | PKT_RX_IP_CKSUM_BAD); -} - static inline bool dp_packet_has_flow_mark(const struct dp_packet *p, uint32_t *mark) { @@ -615,29 +604,19 @@ static inline void dp_packet_set_rss_hash(struct dp_packet *p, uint32_t hash) { p->rss_hash = hash; - p->rss_hash_valid = true; + p->ol_flags |= DP_PACKET_OL_RSS_HASH_MASK; } static inline bool dp_packet_rss_valid(const struct dp_packet *p) { - return p->rss_hash_valid; + return p->ol_flags & DP_PACKET_OL_RSS_HASH_MASK; } static inline void -dp_packet_rss_invalidate(struct dp_packet *p) -{ - p->rss_hash_valid = false; -} - -static inline void -dp_packet_mbuf_rss_flag_reset(struct dp_packet *p OVS_UNUSED) -{ -} - -static inline void -dp_packet_mbuf_init(struct dp_packet *p OVS_UNUSED) +dp_packet_offload_invalidate(struct dp_packet *p) { + p->ol_flags = 0; } static inline bool @@ -664,11 +643,6 @@ dp_packet_l4_checksum_bad(const struct dp_packet *p OVS_UNUSED) return false; } -static inline void -reset_dp_packet_checksum_ol_flags(struct dp_packet *p OVS_UNUSED) -{ -} - static inline bool dp_packet_has_flow_mark(const struct dp_packet *p OVS_UNUSED, uint32_t *mark OVS_UNUSED) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index e8618a6d2..574fddd0f 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -3664,11 +3664,11 @@ netdev_dpdk_ring_send(struct netdev *netdev, int qid, struct dp_packet *packet; /* When using 'dpdkr' and sending to a DPDK ring, we want to ensure that - * the rss hash field is clear. This is because the same mbuf may be + * the offload fields are clear. This is because the same mbuf may be * modified by the consumer of the ring and return into the datapath - * without recalculating the RSS hash. */ + * without recalculating the RSS hash or revalidating the checksums. */ DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { - dp_packet_mbuf_rss_flag_reset(packet); + dp_packet_offload_invalidate(packet); } netdev_dpdk_send__(dev, qid, batch, concurrent_txq); diff --git a/lib/netdev.c b/lib/netdev.c index 84874408a..0934f0072 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -814,10 +814,10 @@ netdev_pop_header(struct netdev *netdev, struct dp_packet_batch *batch) DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, batch) { packet = netdev->netdev_class->pop_header(packet); if (packet) { - /* Reset the checksum offload flags if present, to avoid wrong + /* Reset the offload flags if present, to avoid wrong * interpretation in the further packet processing when * recirculated.*/ - reset_dp_packet_checksum_ol_flags(packet); + dp_packet_offload_invalidate(packet); dp_packet_batch_refill(batch, packet, i); } }