From patchwork Tue Sep 5 09:22:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuanhan Liu X-Patchwork-Id: 810037 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="jw1V5Bx8"; 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 3xmhCg21ZGz9sNr for ; Tue, 5 Sep 2017 19:25:51 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2D46AAD6; Tue, 5 Sep 2017 09:23:48 +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 D2796AC9 for ; Tue, 5 Sep 2017 09:23:46 +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 6A3CCE5 for ; Tue, 5 Sep 2017 09:23:46 +0000 (UTC) Received: by mail-pf0-f170.google.com with SMTP id e199so6619909pfh.3 for ; Tue, 05 Sep 2017 02:23:46 -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=O15ElIDGRdMP3J8fgSurvRNqIKAoMegPs4RnC05hYnc=; b=jw1V5Bx8vzrAED7nFNomDv2IhH2Tsa+3IaWFkz3W/zM5qcHa+jhMcWtysvuvAeY1Fi pmWzk5AFbMxpL+/kw7p2Jm+Pi+5fUMmiBgmoXMDpiZUsGweP1gjM47rF1QMThAUKtkIm MOf/BOsUVJLHIP9Nr3EUhcHvt66faFsnjX/oKRuXvNMraocSwp429EJuUlcL1INWHsEU om+nMr6G+Aia6IB5W/qPvSGXrXrV6UEW4i5i9RyIn9TH1WeoZSj6jkzFaIdlnChlipBx sMiyCNGtT4LfXz4FTdwZT/uBIGgpM9YKmpxhzuqommjzs3ZpFDLWS36uxi+maj3qbP5B 8Qhw== 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=O15ElIDGRdMP3J8fgSurvRNqIKAoMegPs4RnC05hYnc=; b=EBi0IbilMwenI3txcDks5UwE6OHehljMd2TJz8TtB1t/c/bF82eDNzGZhDlhbip7dV GaIl6uJkIq9E7Z6XMLLZ+CpF7GEdbmJpKtGYWzN4ITrvUQ+WetYkU4dWqkvsg8RD/5jM HFReLiKon4Nvd02JXFBOsucIhPb7QYSjAXtCf1syxbnYVODVlKh2TEmqgvuUeyJ0UdYW TlFtzkfi46ZhqwERZhgFUke2E/nCfvYrBv9RXdePsl4uJUzKCN/z1xMFzpRghGquRRNc HNTJGriJuraoOF6s6X+AN/E2Ofda4JMZUcEUDfsuxEr+5sD2v+1mhsktJI4sBW/lkwMp H8xg== X-Gm-Message-State: AHPjjUiDuGMg8DWQ9aT9IerSjJFsELVLD4NZJ1Vl3MCyhs9KCcARG1WN pE6Otb9unwE5BK7vVQZ0XQ== X-Google-Smtp-Source: ADKCNb7Tiey8sLjv1vAAfKV/105dTBPqLSyJLr5pA22xjBXZk3wJICsZJQkcK+sxtHp30+Tbp+tZSw== X-Received: by 10.98.141.77 with SMTP id z74mr3068746pfd.179.1504603425647; Tue, 05 Sep 2017 02:23:45 -0700 (PDT) Received: from localhost.localdomain ([101.228.204.163]) by smtp.gmail.com with ESMTPSA id i187sm295921pfe.71.2017.09.05.02.23.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 05 Sep 2017 02:23:44 -0700 (PDT) From: Yuanhan Liu To: dev@openvswitch.org Date: Tue, 5 Sep 2017 17:22:56 +0800 Message-Id: <1504603381-30071-4-git-send-email-yliu@fridaylinux.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1504603381-30071-1-git-send-email-yliu@fridaylinux.org> References: <1504603381-30071-1-git-send-email-yliu@fridaylinux.org> X-Spam-Status: No, score=0.0 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, RCVD_IN_DNSWL_NONE autolearn=disabled version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v2 3/8] 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. Co-authored-by: Finn Christensen 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 f58e9be..46f9885 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" @@ -3312,6 +3313,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, \