From patchwork Tue Sep 27 12:45:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Blakey X-Patchwork-Id: 675559 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (archives.nicira.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 3sk0vF2pwKz9s4x for ; Tue, 27 Sep 2016 22:46:17 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id 8DF8A10244; Tue, 27 Sep 2016 05:46:15 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e4.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 6298E1023A for ; Tue, 27 Sep 2016 05:46:13 -0700 (PDT) Received: from bar5.cudamail.com (unknown [192.168.21.12]) by mx1e4.cudamail.com (Postfix) with ESMTPS id BDD821E0302 for ; Tue, 27 Sep 2016 06:46:12 -0600 (MDT) X-ASG-Debug-ID: 1474980371-09eadd6292116920001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar5.cudamail.com with ESMTP id MCVeZ9yDeLejQ9ZK (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 27 Sep 2016 06:46:11 -0600 (MDT) X-Barracuda-Envelope-From: paulb@mellanox.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO mellanox.co.il) (193.47.165.129) by mx1-pf2.cudamail.com with SMTP; 27 Sep 2016 12:46:11 -0000 Received-SPF: pass (mx1-pf2.cudamail.com: SPF record at _mtablock1.salesforce.com designates 193.47.165.129 as permitted sender) X-Barracuda-Apparent-Source-IP: 193.47.165.129 X-Barracuda-RBL-IP: 193.47.165.129 Received: from Internal Mail-Server by MTLPINE1 (envelope-from paulb@mellanox.com) with ESMTPS (AES256-SHA encrypted); 27 Sep 2016 15:46:06 +0300 Received: from r-vnc04.mtr.labs.mlnx (r-vnc04.mtr.labs.mlnx [10.208.0.116]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id u8RCk6Iv028432; Tue, 27 Sep 2016 15:46:06 +0300 X-CudaMail-Envelope-Sender: paulb@mellanox.com From: Paul Blakey To: dev@openvswitch.org X-CudaMail-MID: CM-E2-926012580 X-CudaMail-DTE: 092716 X-CudaMail-Originating-IP: 193.47.165.129 Date: Tue, 27 Sep 2016 15:45:59 +0300 X-ASG-Orig-Subj: [##CM-E2-926012580##][PATCH ovs RFC 4/9] dpif-hw-netlink: added new user offload policy Message-Id: <1474980364-9291-5-git-send-email-paulb@mellanox.com> X-Mailer: git-send-email 1.7.8.2 In-Reply-To: <1474980364-9291-1-git-send-email-paulb@mellanox.com> References: <1474980364-9291-1-git-send-email-paulb@mellanox.com> X-GBUdb-Analysis: 0, 193.47.165.129, Ugly c=0 p=0 Source New X-MessageSniffer-Rules: 0-0-0-11977-c X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1474980371 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using global scores of TAG_LEVEL=3.5 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=4.0 tests=BSF_SC5_MJ1963, RDNS_NONE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.33260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Cc: Shahar Klein , Andy Gospodarek , Rony Efraim , Paul Blakey , Simon Horman , Or Gerlitz Subject: [ovs-dev] [PATCH ovs RFC 4/9] dpif-hw-netlink: added new user offload policy X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" Added a new framework so use can specify which flows to try and offload. A new map was added to save each flow's policy. Signed-off-by: Paul Blakey Signed-off-by: Shahar Klein --- lib/automake.mk | 2 ++ lib/dpif-hw-netlink.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/dpif-hw-netlink.h | 6 +++++ lib/hw-offload-policy.c | 23 +++++++++++++++++++ lib/hw-offload-policy.h | 20 +++++++++++++++++ 5 files changed, 110 insertions(+) create mode 100644 lib/hw-offload-policy.c create mode 100644 lib/hw-offload-policy.h diff --git a/lib/automake.mk b/lib/automake.mk index c7c828d..f87cc8c 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -343,6 +343,8 @@ lib_libopenvswitch_la_SOURCES += \ lib/dpif-netlink.h \ lib/tc.h \ lib/tc.c \ + lib/hw-offload-policy.c \ + lib/hw-offload-policy.h \ lib/dpif-hw-netlink.c \ lib/dpif-hw-netlink.h \ lib/if-notifier.c \ diff --git a/lib/dpif-hw-netlink.c b/lib/dpif-hw-netlink.c index 7394580..e14c64c 100644 --- a/lib/dpif-hw-netlink.c +++ b/lib/dpif-hw-netlink.c @@ -42,6 +42,8 @@ #include "openvswitch/vlog.h" #include "netdev-provider.h" #include "dpif-hw-netlink.h" +#include "tc.h" +#include "hw-offload-policy.h" VLOG_DEFINE_THIS_MODULE(dpif_hw_netlink); @@ -323,6 +325,62 @@ get_ovs_port(struct dpif_hw_netlink *dpif, int ifindex) return -1; } +static void +del_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid) +{ + struct ufid_policy_hash_data *data; + + if (!ovs_ufid) { + return; + } + size_t hash = hash_ufid(ovs_ufid); + + /* WRITE LOCK */ + HMAP_FOR_EACH_WITH_HASH(data, node_ufid, hash, &dpif->ufid_to_policy) { + if (memcmp(&data->ovs_ufid, ovs_ufid, sizeof (*ovs_ufid)) == 0) + break; + } + if (data) { + hmap_remove(&dpif->ufid_to_policy, &data->node_ufid); + free(data); + } + /* WRITE UNLOACK */ +} + +static void +put_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid, + enum dpif_hw_offload_policy policy) +{ + struct ufid_policy_hash_data *data = + malloc(sizeof (struct ufid_policy_hash_data)); + + data->ovs_ufid = *ovs_ufid; + data->offloading_policy = policy; + + del_policy(dpif, ovs_ufid); + /* WRITE LOCK */ + hmap_insert(&dpif->ufid_to_policy, &data->node_ufid, hash_ufid(ovs_ufid)); + /* WRITE UNLOCK */ + return; + +} + +static enum dpif_hw_offload_policy +get_policy(struct dpif_hw_netlink *dpif, const ovs_u128 * ovs_ufid) +{ + struct ufid_policy_hash_data *data = NULL; + size_t hash = hash_ufid(ovs_ufid); + + /* READ LOCK */ + HMAP_FOR_EACH_WITH_HASH(data, node_ufid, hash, &dpif->ufid_to_policy) { + if (memcmp(&data->ovs_ufid, ovs_ufid, sizeof (*ovs_ufid)) == 0) + break; + } + /* READ UNLOCK */ + + return data->offloading_policy; +} + static struct dpif_hw_netlink * dpif_hw_netlink_cast(const struct dpif *dpif) { @@ -336,6 +394,7 @@ initmaps(struct dpif_hw_netlink *dpif) hmap_init(&dpif->port_to_netdev); hmap_init(&dpif->ufid_to_handle); hmap_init(&dpif->handle_to_ufid); + hmap_init(&dpif->ufid_to_policy); ovs_mutex_init(&dpif->hash_mutex); return 0; } diff --git a/lib/dpif-hw-netlink.h b/lib/dpif-hw-netlink.h index f44abca..e2cee90 100644 --- a/lib/dpif-hw-netlink.h +++ b/lib/dpif-hw-netlink.h @@ -14,6 +14,7 @@ struct dpif_hw_netlink { struct hmap port_to_netdev; struct hmap ufid_to_handle; struct hmap handle_to_ufid; + struct hmap ufid_to_policy; }; struct port_netdev_hash_data { @@ -32,4 +33,9 @@ struct ufid_handle_hash_data { odp_port_t port; }; +struct ufid_policy_hash_data { + struct hmap_node node_ufid; + ovs_u128 ovs_ufid; + int offloading_policy; +}; #endif diff --git a/lib/hw-offload-policy.c b/lib/hw-offload-policy.c new file mode 100644 index 0000000..366c237 --- /dev/null +++ b/lib/hw-offload-policy.c @@ -0,0 +1,23 @@ +#include +#include "dpif.h" +#include "openvswitch/types.h" +#include "hw-offload-policy.h" +#include "dpif-hw-netlink.h" + +enum dpif_hw_offload_policy +HW_offload_test_put(struct dpif_hw_netlink *dpif, struct dpif_flow_put *put) +{ + return DPIF_HW_OFFLOAD_ONLY; +} + +enum dpif_hw_offload_policy +HW_offload_test_del(struct dpif *dpif, struct dpif_flow_del *del) +{ + return DPIF_HW_OFFLOAD_ONLY; +} + +enum dpif_hw_offload_policy +HW_offload_test_get(struct dpif *dpif, struct dpif_flow_get *get) +{ + return DPIF_HW_OFFLOAD_ONLY; +} diff --git a/lib/hw-offload-policy.h b/lib/hw-offload-policy.h new file mode 100644 index 0000000..8371fc0 --- /dev/null +++ b/lib/hw-offload-policy.h @@ -0,0 +1,20 @@ + +#ifndef HW_OFFLOAD_POLICY_H +#define HW_OFFLOAD_POLICY_H 1 + +#include "dpif-hw-netlink.h" + +enum dpif_hw_offload_policy { + DPIF_HW_NO_OFFLAOAD = 1, /* no offload - SW only */ + DPIF_HW_OFFLOAD_ONLY, /* if fails fall back to SW */ + DPIF_HW_OFFLOAD_SPLIT, +}; + +enum dpif_hw_offload_policy HW_offload_test_put(struct dpif_hw_netlink *dpif, + struct dpif_flow_put *put); +enum dpif_hw_offload_policy HW_offload_test_del(struct dpif *dpif, + struct dpif_flow_del *del); +enum dpif_hw_offload_policy HW_offload_test_get(struct dpif *dpif, + struct dpif_flow_get *get); + +#endif