From patchwork Wed Aug 23 06:24:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanhan Liu X-Patchwork-Id: 804805 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; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=fridaylinux-org.20150623.gappssmtp.com header.i=@fridaylinux-org.20150623.gappssmtp.com header.b="VdqsB/C3"; 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 3xccvd5vCWz9sCZ for ; Wed, 23 Aug 2017 16:29:01 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 09D46A80; Wed, 23 Aug 2017 06:27:08 +0000 (UTC) X-Original-To: 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 6ABAAA7A for ; Wed, 23 Aug 2017 06:27:06 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf0-f170.google.com (mail-pf0-f170.google.com [209.85.192.170]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 5DA1F143 for ; Wed, 23 Aug 2017 06:27:06 +0000 (UTC) Received: by mail-pf0-f170.google.com with SMTP id k3so3602758pfc.0 for ; Tue, 22 Aug 2017 23:27:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fridaylinux-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3+3op518zyETIlssHnKiyNQzRt7z0vjvykgbgc5Z5+Q=; b=VdqsB/C3qAlJZF+BZUzwARL3DMsFrXlhfqdsq/R1C4uR7mJ6Me3OVfUoj01688leYw NQWv3PtzLf7oDhTW6Byu3aRGOah8hBwJWuZv/hyIKgf/8kSatNMp8riVTMfmqMYycbaC EM84LNILXpiTB8Wy7M4HoSO8ZQc56sEZKw+IMq4Jd4m3TT7wfimnXVh2sSdVYiMmNQnN XOxMWlN+UimM5SE6QIRetPAqv0uOcJ8qLN+fJbYZ+IU2ZTnWvJNaetAwCb7LWb7W8v0I wUNH7RzYtWuseSsbMIt93e/GDCHWChxmyvr1r9DS1JcKahZcqHpksUEGEV1OexhTmwB4 M33Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3+3op518zyETIlssHnKiyNQzRt7z0vjvykgbgc5Z5+Q=; b=FzNwe8ycX7InZWPhh2kgndt0afzjnS80jqxl/KFq1n9ra+OUwUxZuw8wS8jtG5cL3n OcvMgqay88Xz9Rt8VOYZ6CWc8K90ABEdwefQQl7slXlpvnTawPhvkst6YUyQ4H2DYORE 1Ci1BusyaHl3CALh1Qv94ijbO0wNWLOCptsFBjoNcmNI0Qcnb3ncDyzE5emp910YJwVs GOcqkWpGkjC+P09fFYIRc/ywX2yUCmOP2tT7KvuVNidKTpt/IUFdU/yHOSRsg41OfI9B jEejFwyVCXUHlIGFe6jZnjA6pPJqo8Z+MC9QGQTClJZQ4weDUMqPOhpG2/40sAj4i+gM THYQ== X-Gm-Message-State: AHYfb5gblt0Et0XS8UIkyt5kUH6R9c37kUEtx3ZkyshiqWV1zHHnu74a OP1JnnRrEowk4tT7SPvnhA== X-Received: by 10.99.38.193 with SMTP id m184mr1608215pgm.322.1503469625565; Tue, 22 Aug 2017 23:27:05 -0700 (PDT) Received: from localhost.localdomain ([180.171.58.192]) by smtp.gmail.com with ESMTPSA id o21sm1339592pfi.25.2017.08.22.23.27.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 Aug 2017 23:27:04 -0700 (PDT) From: Yuanhan Liu To: dev@openvswitch.org Date: Wed, 23 Aug 2017 14:24:18 +0800 Message-Id: <1503469462-22391-4-git-send-email-yliu@fridaylinux.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1503469462-22391-1-git-send-email-yliu@fridaylinux.org> References: <1503469462-22391-1-git-send-email-yliu@fridaylinux.org> Subject: [ovs-dev] [PATCH 3/7] netdev-dpdk: convert ufid to dpdk flow 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 Flows offloaded to DPDK are identified by rte_flow pointer while OVS flows are identified by ufid. This patches adds a hmap to convert ufid to dpdk flow (rte_flow). Most of the code are stolen from netdev-tc-offloads.c, with some modificatons. Some functions are marked as "inline", which is a trick to workaround the temp "functiond defined but not used" warnings. Signed-off-by: Yuanhan Liu Signed-off-by: Finn Christensen --- lib/netdev-dpdk.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 1aaf6f7..15fef1e 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "dirs.h" #include "dp-packet.h" @@ -3310,6 +3311,93 @@ unlock: return err; } +/* + * A mapping from ufid to dpdk rte_flow pointer + */ + +static struct hmap ufid_dpdk_flow = HMAP_INITIALIZER(&ufid_dpdk_flow); +static struct ovs_mutex ufid_lock = OVS_MUTEX_INITIALIZER; + +struct ufid_dpdk_flow_data { + struct hmap_node node; + ovs_u128 ufid; + struct rte_flow *rte_flow; +}; + +/* + * Find ufid_dpdk_flow_data node associated with @ufid + */ +static struct ufid_dpdk_flow_data * +find_ufid_dpdk_flow_mapping(const ovs_u128 *ufid) +{ + size_t hash = hash_bytes(ufid, sizeof(*ufid), 0); + struct ufid_dpdk_flow_data *data = NULL; + + ovs_mutex_lock(&ufid_lock); + HMAP_FOR_EACH_WITH_HASH(data, node, hash, &ufid_dpdk_flow) { + if (ovs_u128_equals(*ufid, data->ufid)) { + break; + } + } + ovs_mutex_unlock(&ufid_lock); + + return data; +} + +/* + * Remove ufid_dpdk_flow_data node associated with @ufid + */ +static inline void +del_ufid_dpdk_flow_mapping(const ovs_u128 *ufid) +{ + struct ufid_dpdk_flow_data *data; + + data = find_ufid_dpdk_flow_mapping(ufid); + if (data) { + ovs_mutex_lock(&ufid_lock); + hmap_remove(&ufid_dpdk_flow, &data->node); + free(data); + ovs_mutex_unlock(&ufid_lock); + } +} + +/* Add ufid to dpdk_flow mapping */ +static inline void +add_ufid_dpdk_flow_mapping(const ovs_u128 *ufid, struct rte_flow *rte_flow) +{ + size_t hash = hash_bytes(ufid, sizeof(*ufid), 0); + struct ufid_dpdk_flow_data *data = xzalloc(sizeof(*data)); + + /* + * We should not simply overwrite an existing rte flow. + * We should have deleted it first before re-adding it. + * Thus, if following assert triggers, something is wrong: + * the rte_flow is not destroyed. + */ + ovs_assert(find_ufid_dpdk_flow_mapping(ufid) == NULL); + + data->ufid = *ufid; + data->rte_flow = rte_flow; + + ovs_mutex_lock(&ufid_lock); + hmap_insert(&ufid_dpdk_flow, &data->node, hash); + ovs_mutex_unlock(&ufid_lock); +} + +/* Get rte_flow by ufid. + * + * Returns rte rte_flow if successful. Otherwise returns 0. + */ +static inline struct rte_flow * +get_rte_flow_by_ufid(const ovs_u128 *ufid) +{ + struct ufid_dpdk_flow_data *data; + + data = find_ufid_dpdk_flow_mapping(ufid); + return data ? data->rte_flow : NULL; +} + + #define NETDEV_DPDK_CLASS(NAME, INIT, CONSTRUCT, DESTRUCT, \ SET_CONFIG, SET_TX_MULTIQ, SEND, \ GET_CARRIER, GET_STATS, \