From patchwork Mon Oct 29 12:49:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 990181 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="itPXzAlN"; 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 42kDxN3XY2z9s3C for ; Mon, 29 Oct 2018 23:51:20 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 9231B2B67; Mon, 29 Oct 2018 12:49:52 +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 489532A93 for ; Mon, 29 Oct 2018 12:49:51 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 32D3225A for ; Mon, 29 Oct 2018 12:49:50 +0000 (UTC) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20181029124948euoutp0222b6b0c74cff6ddc9e9784a5bdbac355~iFUBpACuI1682416824euoutp02U; Mon, 29 Oct 2018 12:49:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20181029124948euoutp0222b6b0c74cff6ddc9e9784a5bdbac355~iFUBpACuI1682416824euoutp02U DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1540817388; bh=SOaDZ3Zxu2aSMm6v3YVHdvKIkdZ1OsWodKN3E5iAvHE=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=itPXzAlNR9J4oGuq8yGfj6HDTZD2ZoOD0p+OWZcFD7MqIL2hsuIYtTbpNv0MLPINw uZluZeGA3tXU9qyePgEW3MWzu+4+bfFINx/zMRdQzxxDXZh+CBEcVOFkxlusGrQ0IG Jtj1S1r6Up1gC/tRMl0+ps7M0hIC2O+5HNBOpg+4= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181029124948eucas1p1c3ca0afc5b062c4d0124d8dc5339a482~iFUBBU5av2688326883eucas1p11; Mon, 29 Oct 2018 12:49:48 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 4E.FA.04806.BE107DB5; Mon, 29 Oct 2018 12:49:47 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181029124947eucas1p13b432aaec616e0e1f9abc39232178a8b~iFUAQC61a2141121411eucas1p1r; Mon, 29 Oct 2018 12:49:47 +0000 (GMT) X-AuditID: cbfec7f5-367ff700000012c6-54-5bd701eb4dbe Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id BA.5C.04284.BE107DB5; Mon, 29 Oct 2018 12:49:47 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0PHD00EQH2AI7G60@eusync3.samsung.com>; Mon, 29 Oct 2018 12:49:47 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org Date: Mon, 29 Oct 2018 15:49:20 +0300 Message-id: <20181029124926.12199-4-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-reply-to: <20181029124926.12199-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBIsWRmVeSWpSXmKPExsWy7djP87qvGa9HG3w6ZW6xZdpkVotXi84z W1xp/8lusfHhWVaLuZ+eM1rcnuNl8fTiL2aLliU7mRw4PG78u8XmsXjPSyaPZ9MPM3nc2H6a 1ePZzf+MHn1bVjF6/G++yhrAHsVlk5Kak1mWWqRvl8CVcf3UPeaChyYVfcdWszcwrtbsYuTk kBAwkVjzaD5rFyMXh5DACkaJXzM2M0M4nxklHq5dzdLFyAFW1bnGByK+jFHizo53bBBOM5PE kqn/mEFGsQnoSJxafYQRxBYRkJZ43fsGbCyzwEQmibc/L7CBJIQFLCS2brvDBDKVRUBV4ttc K5Awr4C1xNT595ggTpKXWL3hANhMTgEbief3+8GWSQgsYJN4smIGG0SRi8SyZ41QDcISr45v YYewZSQ6Ow5Cxesl7re8ZIRo7mCUmH7oH1TCXmLL63NgDcwCfBKTtk1nhniTV6KjTQiixEPi 2fKlTBBf9jNKNG87wzKBUXIBI8MqRvHU0uLc9NRi47zUcr3ixNzi0rx0veT83E2MwPg8/e/4 1x2M+/4kHWIU4GBU4uF9wH0tWog1say4MvcQowQHs5II76uzQCHelMTKqtSi/Pii0pzU4kOM 0hwsSuK8y+ZtjBYSSE8sSc1OTS1ILYLJMnFwSjUwNgk6Jtt/Dci5f1ny0wtuyclBOi5zm0WV 74UGWko3MzTvn7K/gud8w2/P8ws1jDlsNjLvTm07qP9equVca+PZn1vvhi1ijojtzhf3O+nP dO141PmQOT9bSi7Lq/n8dgxJj7tz4HDLyRnnWQ/Edq4Lq1vp05ZcsyWQOfBUvXCjyc5JkSqP La8osRRnJBpqMRcVJwIAs5d+jssCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprKLMWRmVeSWpSXmKPExsVy+t/xq7qvGa9HG1y9J26xZdpkVotXi84z W1xp/8lusfHhWVaLuZ+eM1rcnuNl8fTiL2aLliU7mRw4PG78u8XmsXjPSyaPZ9MPM3nc2H6a 1ePZzf+MHn1bVjF6/G++yhrAHsVlk5Kak1mWWqRvl8CVcf3UPeaChyYVfcdWszcwrtbsYuTg kBAwkehc49PFyMUhJLCEUWLT+yusEE4rk8SJ9gvsXYycHGwCOhKnVh9hBLFFBKQlXve+ASti FpjMJLGkpYkZJCEsYCGxddsdJpCpLAKqEt/mWoGEeQWsJabOv8cEYksIyEus3nAArJxTwEbi +f1+NhBbCKhm1ce5zBMYeRYwMqxiFEktLc5Nzy021CtOzC0uzUvXS87P3cQIDKxtx35u3sF4 aWPwIUYBDkYlHt4H3NeihVgTy4orcw8xSnAwK4nwvjoLFOJNSaysSi3Kjy8qzUktPsQozcGi JM573qAySkggPbEkNTs1tSC1CCbLxMEp1cDYZXLpftI0kbIE2YsLNJ38i+O0vv9T7NDxPL0z f8c/Hic1dWH/HyJGV7Ki5KoKX62wnrqj82XsnwWdLKe+amVZchjPsFI82uZe9k+ggtFrQpPW lYAHrB1OXmIuOxba32jSPHziHYeYs/izO1PqC/oebdq56uzpcv/3OrtYBWLuX3Vmuehu80aJ pTgj0VCLuag4EQDVw6OUKAIAAA== X-CMS-MailID: 20181029124947eucas1p13b432aaec616e0e1f9abc39232178a8b X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181029124947eucas1p13b432aaec616e0e1f9abc39232178a8b References: <20181029124926.12199-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 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. Signed-off-by: Ilya Maximets --- lib/dp-packet.c | 13 +++---------- lib/dp-packet.h | 46 +++++++--------------------------------------- lib/netdev-dpdk.c | 6 +++--- lib/netdev.c | 4 ++-- 4 files changed, 15 insertions(+), 54 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 443c22504..ab34a6cec 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -30,8 +30,7 @@ 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); - dp_packet_mbuf_init(b); + 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); @@ -178,16 +177,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 0c4c8c853..0e04b2302 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'. */ @@ -487,23 +488,12 @@ dp_packet_rss_valid(const struct dp_packet *p) return p->mbuf.ol_flags & PKT_RX_RSS_HASH; } -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. * The DPDK rte library will still otherwise manage the mbuf. * We only need to initialize the mbuf ol_flags. */ 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 = 0; } @@ -536,13 +526,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 +598,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 +637,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 9d5217218..5d0f92666 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -3577,11 +3577,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); } }