From patchwork Sat Dec 28 07:11:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215819 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=silver.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ObrHnB2M"; dkim-atps=neutral Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHD6JZ6z9sPn for ; Sat, 28 Dec 2019 18:11:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id CA4B520433; Sat, 28 Dec 2019 07:11:34 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hu-rUrPWqk3Q; Sat, 28 Dec 2019 07:11:33 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id BFAEC2041C; Sat, 28 Dec 2019 07:11:33 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9D633C1796; Sat, 28 Dec 2019 07:11:33 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id D1DA9C0881 for ; Sat, 28 Dec 2019 07:11:31 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id BC34F2041C for ; Sat, 28 Dec 2019 07:11:31 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id VaC0X61awVE4 for ; Sat, 28 Dec 2019 07:11:30 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by silver.osuosl.org (Postfix) with ESMTPS id 4DACA20416 for ; Sat, 28 Dec 2019 07:11:30 +0000 (UTC) Received: by mail-pf1-f195.google.com with SMTP id x6so14682242pfo.10 for ; Fri, 27 Dec 2019 23:11:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=he1xZnp9U7D83cL46hUkJY6Tz5NGglpf1oKZXj3lJ88=; b=ObrHnB2MnE888JN665icwF8Co1tjRK6KMHI3HB3baCOo/PErnYyD9bPtNxc7it5gic 0Dpmv78JrfDytD2vTxMKqAISbqTMi8upHOZIHKz9FO0yvSoZh4RDw37k/vzsgKlYrvS/ pt3axxJCfzzUtS3m25hhbsaq3vPNNWER/i/4Ei5DB1iwB7wT0MtZsUVydHybMKpeouQ8 x+ZwuuvBSCIYpxt0c3cyMKd4Mkc/Cw68ewZZUbim1kT2xbF9LyHxc/Y/YSdsKjedZ8R5 PegQV1GNgLAZvNYyfnpVfhKUowSnoptqcL6BgAY0lqGDLDOaNhoSQvSc0bPGGAwtKU8E ErVQ== 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=he1xZnp9U7D83cL46hUkJY6Tz5NGglpf1oKZXj3lJ88=; b=qa0OA1dWAv4i1k9dO0lK+uGJTQUUmduJe1TL19FzUqRhYgkdppVrsmixDlPKav/9wy X/GN3QCB2FcHbBbN0hGAf7cAENIjIVaADH+j9+WiL9oBHVMwBLYGf3m/MoV5XHXyv1z9 q47AOc8bHwqAQxfwGM57iiAksiTNY1TUOwfrO+cXUExGIU1JIzEEFQv/a1lemriigb4T Ram8EXnSxR3TrIO/jLMTK4xWoRW7ksB9hLIKHbo76Qf3GIapycSJjVkL7qqH8dDTv1V5 dShPxr/FYrsOlfaFpibxXgFlSxojr/BxN2TLhQrFQAEuACTLH6/++s2ECgbQHQm7vZ9A AQkA== X-Gm-Message-State: APjAAAXW0aWJUnxNJRofrQ9DRwtbpq33aK/236ul84KwcQST68bgarup h6V9E/eZQg8AJMcSbsAbv7A= X-Google-Smtp-Source: APXvYqzv9P347+8cpxMO/4zhuYvkNje5Xpli1Sbj0lKm6f/8e0hJux7ZkZcpQmZI4S2sNcU693c2tQ== X-Received: by 2002:a63:e911:: with SMTP id i17mr59096709pgh.42.1577517089916; Fri, 27 Dec 2019 23:11:29 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:29 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:10 +0800 Message-Id: <1577517076-105041-2-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 1/7] dpif-netdev: Remove dp_meter_* struct to header file X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang This patch will be used in later patch. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.c | 17 ----------------- lib/dpif-netdev.h | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 8485b54..7fcd8cb 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -261,23 +261,6 @@ static bool dpcls_lookup(struct dpcls *cls, #define DP_SUPPORTED_METER_BAND_TYPES \ ( 1 << OFPMBT13_DROP ) -struct dp_meter_band { - struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */ - uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */ - uint64_t packet_count; - uint64_t byte_count; -}; - -struct dp_meter { - uint16_t flags; - uint16_t n_bands; - uint32_t max_delta_t; - uint64_t used; - uint64_t packet_count; - uint64_t byte_count; - struct dp_meter_band bands[]; -}; - struct pmd_auto_lb { bool auto_lb_requested; /* Auto load balancing requested by user. */ bool is_enabled; /* Current status of Auto load balancing. */ diff --git a/lib/dpif-netdev.h b/lib/dpif-netdev.h index 6db6ed2..b5f5c12 100644 --- a/lib/dpif-netdev.h +++ b/lib/dpif-netdev.h @@ -33,6 +33,23 @@ extern "C" { * headers to be aligned on a 4-byte boundary. */ enum { DP_NETDEV_HEADROOM = 2 + VLAN_HEADER_LEN }; +struct dp_meter_band { + struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */ + uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */ + uint64_t packet_count; + uint64_t byte_count; +}; + +struct dp_meter { + uint16_t flags; + uint16_t n_bands; + uint32_t max_delta_t; + uint64_t used; + uint64_t packet_count; + uint64_t byte_count; + struct dp_meter_band bands[]; +}; + bool dpif_is_netdev(const struct dpif *); #define NR_QUEUE 1 From patchwork Sat Dec 28 07:11:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215820 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nRGopSRs"; dkim-atps=neutral Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHJ5RHKz9sPW for ; Sat, 28 Dec 2019 18:11:40 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id A5EA387762; Sat, 28 Dec 2019 07:11:37 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7Cc4hO91+KOK; Sat, 28 Dec 2019 07:11:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 9530C84BF0; Sat, 28 Dec 2019 07:11:36 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 74D8EC1796; Sat, 28 Dec 2019 07:11:36 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 28351C0881 for ; Sat, 28 Dec 2019 07:11:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1779B86130 for ; Sat, 28 Dec 2019 07:11:35 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1iA5B-pLb+4B for ; Sat, 28 Dec 2019 07:11:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pj1-f65.google.com (mail-pj1-f65.google.com [209.85.216.65]) by whitealder.osuosl.org (Postfix) with ESMTPS id 025098602E for ; Sat, 28 Dec 2019 07:11:33 +0000 (UTC) Received: by mail-pj1-f65.google.com with SMTP id n96so5651210pjc.3 for ; Fri, 27 Dec 2019 23:11:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jFUAevopFK0up62wcYZa6Pxw38MsOsSRtEA8AmsTzUo=; b=nRGopSRs1+7JjfYfcqV4iiqK0lomv5cF/TTh0NYTCtPlbD4yzYbYV3MIkvcI95TiW2 O5D6QmIkGyBEJIRlKYZWNO2RAfCNgIw/CFuKdH+E4ATW2wxoyrcIGe/VSS4LaP158saD P2wIKSpsyZTE1qt+6anls+DSNBFG5Rv434A7HXzAqktj8BILLzMdOgj5OnpJjEfVxZeE cnezF0WOCYE+71aCMnUNO4CCl8RmRSG0fhbkqfxqp/SSbiaqmsIw24BmDTgM3JsqF6le 0pZmjp+NuBVM7m7kN0cs76wvkNWi09GCdwFjvN5eCcytY1BWp+7PLEQq3tFcRVYxxFMj uSpQ== 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=jFUAevopFK0up62wcYZa6Pxw38MsOsSRtEA8AmsTzUo=; b=Dmbtlh2hmaB+hvpecqmWmXxqSBwQTRDVPGYg392NsnqnBk5mcTcAO61x8hF1PnzF6O CBWqgeMe1xZMo2mR5Wp8xqvlqKjYPpuLWeUz/iTEJ9EbAmFmcrJVAR/qmIIC+3mpxKmb ZId9+Ydbw328UOXeL9cVPaKNzi6laHRVIwz8tCEi6wg+5pe96TMSgfDtqLgNMsmUhfW2 P+s4+suYhBTc2+yn/XUZmT+RYtjqgWk1Xbu7Ci+DbVl+sQJFzK9/WQKFR6glwQ2WqJ4G IMjFumaiFUKluNRqRzNjA2kp1dka/JHzdxVxCNsrZFj24GHEBoQPV97V5od6vpNatelo eqxw== X-Gm-Message-State: APjAAAWOts7s+x6vQrFculfMf5yu6IoUeSAlLNqWAFJY7cvdr2NikMM/ t98H5ykpUCTdQ8O1nzPYQzk= X-Google-Smtp-Source: APXvYqxIWaYJKueWn8fT1Y/O8J+R5LKrCa+VkKRmlUJ9BZ+NqUm7VH63aaL8BhN7ZO7Oyn6JKWy8qA== X-Received: by 2002:a17:902:ac97:: with SMTP id h23mr57321142plr.237.1577517092566; Fri, 27 Dec 2019 23:11:32 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:31 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:11 +0800 Message-Id: <1577517076-105041-3-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 2/7] netdev-offload: Pass dpif as an argument to flow_put X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang When offloading the meter action, we may access the "datapath" resource, such as the meter[] of struct dp_netdev. We will store meter offload info to it. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.c | 2 +- lib/dpif-netlink.c | 2 +- lib/netdev-dummy.c | 8 ++++---- lib/netdev-offload-dpdk.c | 7 ++++--- lib/netdev-offload-provider.h | 7 ++++--- lib/netdev-offload-tc.c | 7 ++++--- lib/netdev-offload.c | 11 ++++++----- lib/netdev-offload.h | 4 +++- 8 files changed, 27 insertions(+), 21 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 7fcd8cb..c92d9aa 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2416,7 +2416,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) /* Taking a global 'port_mutex' to fulfill thread safety restrictions for * the netdev-offload-dpdk module. */ ovs_mutex_lock(&pmd->dp->port_mutex); - ret = netdev_flow_put(port, &offload->match, + ret = netdev_flow_put(NULL, port, &offload->match, CONST_CAST(struct nlattr *, offload->actions), offload->actions_len, &flow->mega_ufid, &info, NULL); diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index e9a6887..a31da55 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2044,7 +2044,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) info.dpif_class = dpif_class; info.tp_dst_port = dst_port; info.tunnel_csum_on = csum_on; - err = netdev_flow_put(dev, &match, + err = netdev_flow_put(NULL, dev, &match, CONST_CAST(struct nlattr *, put->actions), put->actions_len, CONST_CAST(ovs_u128 *, put->ufid), diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 71df291..1d203c7 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1430,10 +1430,10 @@ find_offloaded_flow(const struct hmap *offloaded_flows, const ovs_u128 *ufid) } static int -netdev_dummy_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions OVS_UNUSED, - size_t actions_len OVS_UNUSED, - const ovs_u128 *ufid, struct offload_info *info, +netdev_dummy_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, + struct match *match, struct nlattr *actions OVS_UNUSED, + size_t actions_len OVS_UNUSED, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { struct netdev_dummy *dev = netdev_dummy_cast(netdev); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 96794dc..1aa40a1 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -707,9 +707,10 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, } static int -netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t actions_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_offload_dpdk_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t actions_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { struct rte_flow *rte_flow; diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 4e1c425..d0d3fb2 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -63,9 +63,10 @@ struct netdev_flow_api { * 'stats' is populated according to the rules set out in the description * above 'struct dpif_flow_put'. * Return 0 if successful, otherwise returns a positive errno value. */ - int (*flow_put)(struct netdev *, struct match *, struct nlattr *actions, - size_t actions_len, const ovs_u128 *ufid, - struct offload_info *info, struct dpif_flow_stats *); + int (*flow_put)(struct dpif *, struct netdev *, struct match *, + struct nlattr *actions, size_t actions_len, + const ovs_u128 *ufid, struct offload_info *info, + struct dpif_flow_stats *); /* Queries a flow specified by ufid on netdev. * Fills output buffer as 'wbuffer' in flow_dump_next, which diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 1adbb32..815105f 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1141,9 +1141,10 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, } static int -netdev_tc_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t actions_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_tc_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t actions_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index ae01acd..71b20f3 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -226,17 +226,18 @@ netdev_flow_dump_next(struct netdev_flow_dump *dump, struct match *match, } int -netdev_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t act_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_flow_put(struct dpif *dpif, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t act_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { const struct netdev_flow_api *flow_api = ovsrcu_get(const struct netdev_flow_api *, &netdev->flow_api); return (flow_api && flow_api->flow_put) - ? flow_api->flow_put(netdev, match, actions, act_len, ufid, - info, stats) + ? flow_api->flow_put(dpif, netdev, match, actions, + act_len, ufid, info, stats) : EOPNOTSUPP; } diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 97a5006..d9a08b2 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -20,6 +20,7 @@ #include "openvswitch/netdev.h" #include "openvswitch/types.h" +#include "dpif-provider.h" #include "packets.h" #include "flow.h" @@ -80,7 +81,8 @@ bool netdev_flow_dump_next(struct netdev_flow_dump *, struct match *, struct nlattr **actions, struct dpif_flow_stats *, struct dpif_flow_attrs *, ovs_u128 *ufid, struct ofpbuf *rbuffer, struct ofpbuf *wbuffer); -int netdev_flow_put(struct netdev *, struct match *, struct nlattr *actions, +int netdev_flow_put(struct dpif *, struct netdev *, + struct match *, struct nlattr *actions, size_t actions_len, const ovs_u128 *, struct offload_info *, struct dpif_flow_stats *); int netdev_flow_get(struct netdev *, struct match *, struct nlattr **actions, From patchwork Sat Dec 28 07:11:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215822 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AXZbv9AR"; dkim-atps=neutral Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHR1JTGz9sPW for ; Sat, 28 Dec 2019 18:11:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B628F86130; Sat, 28 Dec 2019 07:11:44 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dS-bQ0li90eO; Sat, 28 Dec 2019 07:11:38 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 57FCF860A3; Sat, 28 Dec 2019 07:11:38 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 3ED89C0881; Sat, 28 Dec 2019 07:11:38 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 99340C0881 for ; Sat, 28 Dec 2019 07:11:36 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 88CAE857D8 for ; Sat, 28 Dec 2019 07:11:36 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hnhPPIqlHhHG for ; Sat, 28 Dec 2019 07:11:35 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pj1-f68.google.com (mail-pj1-f68.google.com [209.85.216.68]) by fraxinus.osuosl.org (Postfix) with ESMTPS id B2AC385A5A for ; Sat, 28 Dec 2019 07:11:35 +0000 (UTC) Received: by mail-pj1-f68.google.com with SMTP id kx11so5653835pjb.4 for ; Fri, 27 Dec 2019 23:11:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=L0eTpVNnxy1nG7HsYRRufy6bYcrwsTqUg41iIMSIgWk=; b=AXZbv9ARB+dfMrOZ8dNozUyPke3mk2tLR5RlN/vpx29D7SAfCZKp6WoDSxq2/+FIzz fIeYkF2+q2vZXf30L72Sv8HEvjN4l/Rrdz2CIHtnOlaxnXN6a33a155wTotAJKVwvO8e p/UHTs+40JWM1GVNrXfPVb7BSTel6L5yaXdLgLtD//BHMFJgp9+x9iGVgernn0yMygOI 8PIe+NtvezMv4jYL0+GQa3BXN/U+sEkXZsnyUg29sjhAMfTBvzHbey/ReHYuJIiutPW4 A6HrZvgDVPdtBUCrkkYIV/PGTgFlprHTO1ZhAZTqEwNg9zsqjnReDQqs/QN5+7AysLRU gzwQ== 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=L0eTpVNnxy1nG7HsYRRufy6bYcrwsTqUg41iIMSIgWk=; b=XAmSFo1sAxIz6p7LDkEeQw8uEX5wbRP+XWudxRxuRfm6mN+ZqO/He7h1nvH5pXc3cV eTeJ4z5Hza30dRx8wHXaV20uxed+yTChvvxogyP6TZarhvhoJxWjIGPWlRMDEjmkazwL IDc1xxj/MZ+6nxSAnZV1tJ71bQiSFdhYcJ9s+Q4Io9j6dBPBVtVetw025tUhkVA2Ehkj 72j5VK49zjELRDDwOwmSQLlHVdXVkUjBa+eszlH/7p6AUmjYoy5E+VQ0uK3cfy17G/iu JgFKgwp6qWMfOmyYU9JKmG/FPvCd5+8rRD2A2ltO7B/LuIX43pY/xCUlYyicWai1AG0S KBjQ== X-Gm-Message-State: APjAAAW6AQcwkfk/tSPDNVcQuoQnVU700W7xrhvz6ebytDhdTyN1nQAF 8yyqDE3M94uopaqZO7in6Gc= X-Google-Smtp-Source: APXvYqx1xlx9GszVN8Ss1lp8Vj5Q6sZrOExZ/u+QGblpJXkO5zukRyvVAkNk2iiF5BjH3zguP47abw== X-Received: by 2002:a17:902:74cb:: with SMTP id f11mr54337753plt.139.1577517095330; Fri, 27 Dec 2019 23:11:35 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:34 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:12 +0800 Message-Id: <1577517076-105041-4-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 3/7] dpif-provider: Add dpif provider meter api X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang Add the callback which will be called when we operate the meter offload. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.c | 3 +++ lib/dpif-netlink.c | 3 +++ lib/dpif-provider.h | 5 ++++ lib/dpif.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/dpif.h | 6 +++++ 5 files changed, 83 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index c92d9aa..051d090 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -7681,6 +7681,9 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_meter_set, dpif_netdev_meter_get, dpif_netdev_meter_del, + NULL, + NULL, + NULL, }; static void diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index a31da55..09489ec 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -3945,6 +3945,9 @@ const struct dpif_class dpif_netlink_class = { dpif_netlink_meter_set, dpif_netlink_meter_get, dpif_netlink_meter_del, + NULL, + NULL, + NULL, }; static int diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index f8ca310..e7b09f5 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -614,6 +614,11 @@ struct dpif_class { * zero. */ int (*meter_del)(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); + int (*meter_get_config)(struct dpif *, ofproto_meter_id meter_id, + struct ofputil_meter_config *); + int (*meter_set_offload)(struct dpif *, ofproto_meter_id meter_id, void *); + int (*meter_get_offload)(struct dpif *, ofproto_meter_id meter_id, void **, + uint16_t size); }; extern const struct dpif_class dpif_netlink_class; diff --git a/lib/dpif.c b/lib/dpif.c index c88b210..8ef4534 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -66,6 +66,9 @@ COVERAGE_DEFINE(dpif_execute_with_help); COVERAGE_DEFINE(dpif_meter_set); COVERAGE_DEFINE(dpif_meter_get); COVERAGE_DEFINE(dpif_meter_del); +COVERAGE_DEFINE(dpif_meter_get_config); +COVERAGE_DEFINE(dpif_meter_set_offload); +COVERAGE_DEFINE(dpif_meter_get_offload); static const struct dpif_class *base_dpif_classes[] = { #if defined(__linux__) || defined(_WIN32) @@ -1976,3 +1979,66 @@ dpif_meter_del(struct dpif *dpif, ofproto_meter_id meter_id, } return error; } + +int +dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + COVERAGE_INC(dpif_meter_get_config); + + int error = (dpif->dpif_class->meter_get_config + ? dpif->dpif_class->meter_get_config(dpif, meter_id, + config) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" get config", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to get DPIF meter config %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data) +{ + COVERAGE_INC(dpif_meter_set_offload); + + int error = (dpif->dpif_class->meter_set_offload + ? dpif->dpif_class->meter_set_offload(dpif, meter_id, + data) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload set", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload set DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size) +{ + COVERAGE_INC(dpif_meter_get_offload); + + int error = (dpif->dpif_class->meter_get_offload + ? dpif->dpif_class->meter_get_offload(dpif, meter_id, + data, size) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload get", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload get DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} diff --git a/lib/dpif.h b/lib/dpif.h index d96f854..cab7f39 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -890,6 +890,12 @@ int dpif_meter_get(const struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); int dpif_meter_del(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); +int dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config); +int dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data); +int dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size); /* Miscellaneous. */ From patchwork Sat Dec 28 07:11:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215821 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gh9+RiBk"; dkim-atps=neutral Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHN3ZLbz9sPW for ; Sat, 28 Dec 2019 18:11:44 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id AC2A5878B3; Sat, 28 Dec 2019 07:11:42 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rUs4Xxvldp2l; Sat, 28 Dec 2019 07:11:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id A4D5A875DA; Sat, 28 Dec 2019 07:11:41 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 834C4C1D85; Sat, 28 Dec 2019 07:11:41 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 48967C1796 for ; Sat, 28 Dec 2019 07:11:40 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 41CE287874 for ; Sat, 28 Dec 2019 07:11:40 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7mS6VFfAPVKF for ; Sat, 28 Dec 2019 07:11:38 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by hemlock.osuosl.org (Postfix) with ESMTPS id 5206F87702 for ; Sat, 28 Dec 2019 07:11:38 +0000 (UTC) Received: by mail-pf1-f193.google.com with SMTP id i6so8925436pfc.1 for ; Fri, 27 Dec 2019 23:11:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EpwgJo48rQcfcD9YmN31eB6K2+FqUmgCOoDWshSLtXI=; b=gh9+RiBkSrlabyQXBAwkEtUiNeQZ2dKN9k1Ew9FE3kfKaQNAre/qkSzMD7wws4kv3b HlOTYLOFqsjgHugbjxbzhyx3ttWuv6HKj8/YejsFHjiqbChJvth5pa8NhmCZQHOh/CV6 pdU/mYjdi8ltXt/VgzvZPsoGApmxXc+8i2d5AI9/qurgWsljZiskSijL5qtEV/iQSl43 a7Q1B8VxQg325dre/1UFxlkTbGwxzFZzLbqlVYRLW1iFPjlDB2Ja2PxFSjc07KAl/LPX O93f5yd2FhxUKRz15iv7MlsVSsdvL+HIVG39zmK5MLIIlHeMH7F+Q/oCaj4iXg/kftKh T3Nw== 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=EpwgJo48rQcfcD9YmN31eB6K2+FqUmgCOoDWshSLtXI=; b=Rn4XFS37tqWeBE7uTQ1wiNu4jZ//3woTAhJyD9469A4wnwy3VfhHIvmnuESSBSueXk goPlBk4msqv43G6bHnqM/7DKGXuWNSQkqMU+TD2hW73GmDpLucGO9Ia6vId2IWT0bxhK 0ejnqmkIJVB9fdboTUMDQxBTYKkq34yzEcqurNxDPR2DWwbuzNdvLH3gpnTeHN3wLWuw XngiowoKfkD9tdhSwuqjAYtyfAwdicnQQPxY5tLm5FphRSeX1WbSMf91qNY8WiWNqVpa 3QjJrA+d6pKXwHLP5Qu3sCc9krmxGma9mJAQ6x99ci9ImQSE1MTz9U6apbTO+D3XOfib sYSw== X-Gm-Message-State: APjAAAU4Ops1yigPvSu4Jraajfqn9Ab7G5jpMhxGsEUOCIxC32ICXhs5 GS2wzBRoNRZcro3AILU/+VY= X-Google-Smtp-Source: APXvYqymy/jZ1hk1WSs20/8GfFUfbaZgXaIdH+aRn3+ULWqlkQ3QnFfYWmww/a6zG2OOcPPg/TmeIw== X-Received: by 2002:a63:1c1d:: with SMTP id c29mr59380235pgc.14.1577517097993; Fri, 27 Dec 2019 23:11:37 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:37 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:13 +0800 Message-Id: <1577517076-105041-5-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 4/7] netdev-offload-provider: Add meter offload struct X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang Introduce the meter offload struct and dp_meter use it. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.h | 2 ++ lib/netdev-offload-provider.h | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/dpif-netdev.h b/lib/dpif-netdev.h index b5f5c12..123cf99 100644 --- a/lib/dpif-netdev.h +++ b/lib/dpif-netdev.h @@ -21,6 +21,7 @@ #include #include #include "dpif.h" +#include "netdev-offload-provider.h" #include "openvswitch/types.h" #include "dp-packet.h" #include "packets.h" @@ -47,6 +48,7 @@ struct dp_meter { uint64_t used; uint64_t packet_count; uint64_t byte_count; + struct netdev_offload_meter *offload; struct dp_meter_band bands[]; }; diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index d0d3fb2..fb33309 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -88,6 +88,16 @@ struct netdev_flow_api { int (*init_flow_api)(struct netdev *); }; +struct netdev_offload_meter_api { + void (*meter_destroy)(void *); + void (*meter_update)(void *, void *); +}; + +struct netdev_offload_meter { + void *priv_data; + struct netdev_offload_meter_api *meter_ops; +}; + int netdev_register_flow_api_provider(const struct netdev_flow_api *); int netdev_unregister_flow_api_provider(const char *type); From patchwork Sat Dec 28 07:11:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215824 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="b9aLSLok"; dkim-atps=neutral Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHn0yXNz9sPW for ; Sat, 28 Dec 2019 18:12:05 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 843E886092; Sat, 28 Dec 2019 07:12:03 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NNSCw8Maou-b; Sat, 28 Dec 2019 07:11:58 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 96DB0862D2; Sat, 28 Dec 2019 07:11:49 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 75B4FC1D8A; Sat, 28 Dec 2019 07:11:49 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4B98CC1D8D for ; Sat, 28 Dec 2019 07:11:48 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 3301485BD3 for ; Sat, 28 Dec 2019 07:11:48 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Kt8cDUeWJY7S for ; Sat, 28 Dec 2019 07:11:45 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pg1-f195.google.com (mail-pg1-f195.google.com [209.85.215.195]) by whitealder.osuosl.org (Postfix) with ESMTPS id 183AE86252 for ; Sat, 28 Dec 2019 07:11:41 +0000 (UTC) Received: by mail-pg1-f195.google.com with SMTP id k197so15488838pga.10 for ; Fri, 27 Dec 2019 23:11:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZghtE++VUQBK5wq0SDJbnNbECHgPztcTvScNY52h4w8=; b=b9aLSLokspvREXDCtBfmlB+/El2ygVcd3xtJOABFzNfULFHnqm5PeTpb+QVUhZzDXU Jr8Ih08Q6YbOtu2aCoyxQbe/bT7qwtnoV3ZDii3BS7lqaZotksWKNOTnMze9SVIZXqBo qhxRcA3x4Xy56V/Elb0mpNVOiHtpA56IyZh8MEWBSaF5zndlEzYpWxxnZKOhpDKRD2/9 LtSiII3eTlNvVcVnegoO1Yr4XLLkMryYC4EfEc2eslfXFWVhpq4hMVEFB7U7PatoU+Ud fwgKj5fdL1PHbu4cnFp1agW90zCcq9cjJC7Hna1rTUuzCWaacb6/56IXeaCKGA2Rg2Sm gl0g== 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=ZghtE++VUQBK5wq0SDJbnNbECHgPztcTvScNY52h4w8=; b=Mc1M4GgFwWUsAKjiJ8SP6bUua8OQO/aDq6pvIn04PTQp1E7h0OjjFB8AkDRAZPD6AK 0r6wy7FOmqVmv+xDGQuANblqOhL3YzvD2Bcou9AKtZEkOsFLAxqKHG37uOCCQzoVF5QH nlD3EgslulMZspyEXW4DQlvtCWSh9ZifwYtCufk0loU9KI6avACdIM+54PXycKkEsAcS PI81o6HD5GZfn8abU/VpNvPYKNtACj3Jct+xacAD6u1lwdcRqxbuGYdCOpVoXPZFpSb6 JnC4Y4KmSwpHLiA2z52AzV9zr3PRwhmSkE0uW9lY+st+B2UVIJgcLES9EdeQYLQtHFWs Vz1Q== X-Gm-Message-State: APjAAAWktaA6/PH7/3LUHv5p0xVqkAG9wJUFqrOyvWDUC1J9Mygv5g4E l64Fc60uoliEukt7wsERnJg= X-Google-Smtp-Source: APXvYqzO+drGCv84jKKGdxLaPqK1clSd3ibphzTpHGqMzgkrvrw1hMoUgpwrSBKN6q3OjeIdtG2Avw== X-Received: by 2002:a63:e954:: with SMTP id q20mr61236997pgj.204.1577517100668; Fri, 27 Dec 2019 23:11:40 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:39 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:14 +0800 Message-Id: <1577517076-105041-6-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 5/7] netdev-dpif: Implement netdev meter offload X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang Implement the meter offload api in the netdev. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 051d090..e33215d 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -5893,6 +5893,96 @@ dpif_netdev_meter_del(struct dpif *dpif, return error; } +static int +dpif_netdev_meter_get_config(struct dpif *dpif, + ofproto_meter_id meter_id, + struct ofputil_meter_config *conf) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0, i; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + conf->n_bands = meter->n_bands; + conf->bands = xzalloc(conf->n_bands * sizeof(struct dp_meter_band)); + for (i = 0; i < meter->n_bands; ++i) { + conf->bands[i] = meter->bands[i].up; + } + +done: + meter_unlock(dp, mid); + return ret; +} + +static int +dpif_netdev_meter_set_offload(struct dpif *dpif, + ofproto_meter_id meter_id, + void *data) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + meter->offload = (struct netdev_offload_meter *)data; +done: + meter_unlock(dp, mid); + return ret; +} + +static int +dpif_netdev_meter_get_offload(struct dpif *dpif, + ofproto_meter_id meter_id, + void **data, uint16_t size) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + *data = NULL; + if (meter->offload) { + *data = xmemdup(meter->offload, size); + } + +done: + meter_unlock(dp, mid); + return ret; +} + static void dpif_netdev_disable_upcall(struct dpif *dpif) @@ -7681,9 +7771,9 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_meter_set, dpif_netdev_meter_get, dpif_netdev_meter_del, - NULL, - NULL, - NULL, + dpif_netdev_meter_get_config, + dpif_netdev_meter_set_offload, + dpif_netdev_meter_get_offload, }; static void From patchwork Sat Dec 28 07:11:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215823 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=fraxinus.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Vmq3HOHh"; dkim-atps=neutral Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHd48lMz9sPW for ; Sat, 28 Dec 2019 18:11:57 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 11E5785B0D; Sat, 28 Dec 2019 07:11:56 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QCB8vvbj-cuT; Sat, 28 Dec 2019 07:11:55 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 830E78598A; Sat, 28 Dec 2019 07:11:55 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 63EF3C1D90; Sat, 28 Dec 2019 07:11:55 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9F888C1D8A for ; Sat, 28 Dec 2019 07:11:54 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 949F186523 for ; Sat, 28 Dec 2019 07:11:54 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3bL+-ZkcyHO4 for ; Sat, 28 Dec 2019 07:11:52 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by whitealder.osuosl.org (Postfix) with ESMTPS id AA37B86354 for ; Sat, 28 Dec 2019 07:11:43 +0000 (UTC) Received: by mail-pl1-f196.google.com with SMTP id s21so9844722plr.7 for ; Fri, 27 Dec 2019 23:11:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=n4D1JyuvOtBCRvY1rZ+JjKCqV/caJINfFBNdPhYVhKI=; b=Vmq3HOHhU8J/nq28uM09StW7u+/1an7bkHMr36vDX/bCDBtMBrSjZZU4AuPE+B2+hf xQXBRcHwkUGujiq87AF8QRgRNPkxPojG/pcCL1inv5BAjv8wOFv42HucEv9t8Ulc9G5V 1Ua2vUxn3Knol/kJpCzxLrO2LIEq+Xkr6TcHRYX5P60xAGQcmIdVMrVvRUxQvTVAbCuJ C/hEE2eDf4pKq0g2jLylY9UxgtQqwnG58hV7SVdDQIq9bB5aS7KyHhlEHFr1MsTIMT2M eeA974lux3YcrUi8KAyTHmwNcCcqvHmaY8TGLDa9mvMWAeBfdbU0xpWWJIUQM/lsbeSR kLRw== 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=n4D1JyuvOtBCRvY1rZ+JjKCqV/caJINfFBNdPhYVhKI=; b=WvsrvxszEjnyIDFlHT9EPeQI2OBRD+wsynyaIeynOE3UOY5jb8h+AkxYWkyUg3MAmd xBcRtqYqITGgkcK+EhrZzPMEaAA/pIMj1AkZ79KxcPttxuAyTpZvCoYhoNkWQKfRKVPR cq4nyAW2QP0rag81mQCCW/S3bdAPCKOfTl56nZT474GUySM6MtEMPwxX0Ww0ZwNC2fZ+ F5X+Mp6AM2WTb5wOoTkCL4e15dpABLRVL5mVyOk4a6mPjFhJGezdS5ZWzFqVu2YpqYeb WnmqOQfRCzf4I9Mi+Y9GTe5jUPQ9gOsgk4F//AeUsIwy4aOCXTHN7dsq/zwsrc5Br/q2 fSzw== X-Gm-Message-State: APjAAAWZ/Ta7KJ/0EO5CkBsiPlB5LsMb6ydVqju2M1PO8TshltZ1A6qT ABiZn9vBgy6WwDYbdU7qfws= X-Google-Smtp-Source: APXvYqxa/vKhKNo9opAimsnAgvi/3uCh/D3vJcMHRvGxxg9YEPxt7Qm5usYsdM1VPRZLEQzNKSSLiw== X-Received: by 2002:a17:902:bc4b:: with SMTP id t11mr19706678plz.190.1577517103355; Fri, 27 Dec 2019 23:11:43 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:42 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:15 +0800 Message-Id: <1577517076-105041-7-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 6/7] ofp-meter: Add get max-rate function X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang This patch will be used later. Signed-off-by: Tonghao Zhang --- include/openvswitch/ofp-meter.h | 1 + lib/ofp-meter.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/openvswitch/ofp-meter.h b/include/openvswitch/ofp-meter.h index 6776eae..c6678f5 100644 --- a/include/openvswitch/ofp-meter.h +++ b/include/openvswitch/ofp-meter.h @@ -62,6 +62,7 @@ int ofputil_decode_meter_config(struct ofpbuf *, struct ofpbuf *bands); void ofputil_format_meter_config(struct ds *, const struct ofputil_meter_config *); +uint32_t ofputil_meter_config_max_rate(struct ofputil_meter_config *conf); struct ofputil_meter_mod { uint16_t command; diff --git a/lib/ofp-meter.c b/lib/ofp-meter.c index 9ea40a0..c1a7087 100644 --- a/lib/ofp-meter.c +++ b/lib/ofp-meter.c @@ -807,3 +807,16 @@ ofputil_format_meter_mod(struct ds *s, const struct ofputil_meter_mod *mm) ofputil_format_meter_config(s, &mm->meter); } + +uint32_t +ofputil_meter_config_max_rate(struct ofputil_meter_config *conf) +{ + uint32_t i, max_rate = 0; + for (i = 0; i < conf->n_bands; i++) { + if (max_rate < conf->bands[i].rate) { + max_rate = conf->bands[i].rate; + } + } + + return max_rate; +} From patchwork Sat Dec 28 07:11:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1215825 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="JE8bBxpK"; dkim-atps=neutral Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47lFHz0CGdz9sPW for ; Sat, 28 Dec 2019 18:12:15 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 7196A8776C; Sat, 28 Dec 2019 07:12:13 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LD5orzRvxeJc; Sat, 28 Dec 2019 07:12:09 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id D3E6F84B57; Sat, 28 Dec 2019 07:12:09 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B8E36C1D8E; Sat, 28 Dec 2019 07:12:09 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id A3867C1796 for ; Sat, 28 Dec 2019 07:12:08 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 8E28D21FA8 for ; Sat, 28 Dec 2019 07:12:08 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kgYGg8lw3yz5 for ; Sat, 28 Dec 2019 07:11:55 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pg1-f195.google.com (mail-pg1-f195.google.com [209.85.215.195]) by silver.osuosl.org (Postfix) with ESMTPS id 79564204B2 for ; Sat, 28 Dec 2019 07:11:46 +0000 (UTC) Received: by mail-pg1-f195.google.com with SMTP id a33so15493408pgm.5 for ; Fri, 27 Dec 2019 23:11:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IsWRS70EpO/FZs+NI4mwGhjftsgKl4Md7yMtI4pRZWo=; b=JE8bBxpKqe8L/b/VuFbwGvCDij17z/GztqD/3VMk16GHag6XSHFj9EyKp9VPoZ5GCP fQs5r4hrSJ1KUnZwXrClVz4g4UQbphsVsuNhH+fEKzpRlT+9C3pI+1X2EylCBqfr5nLZ 7FY6GK5WR9krKIqp4dYODsrNdW0812tfS1UvkFAD3KXxWJEmecwAqdjFSoNkyFxVBh3R FaJ8Jf14+AtEd74+hLMahhiaXvd8h4s6jIlKxaaMfyW+kSoY+UXScZE0XdNfkNWdj7oT sgtlBazAnXKJH2N50FDImkB4t/wlADy3K+NR60LfNLWlxJkDXKiv/TF0n5PpvHpDcQLj 6Tqw== 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=IsWRS70EpO/FZs+NI4mwGhjftsgKl4Md7yMtI4pRZWo=; b=Ns58Bk58EsLr5Ybn2HIomznn4YQWHxN/rpF8gpDnU+Ffjphaxoz2aYV7XZUdf+6xmM i8MSlq77IYnrzESwjQrn7csBLHgawLbSxs01ZWIrWd5XMCi40vg7VOE0nODB5zTdOAvE h1yTmNJbKHpeAAaqf/bTcfSVEDKh+Z43i2fzrQYZ4mzI0FrqVG8kO1Kz/6NmfzPfDyTH 9jJbMNpQdboUuhy9cvgidZejRqIKcA5SPpWsIHDRSSXh1282lThFEPMDUeMSVLUNqShb Q5CD7UCSgtg4kSxEAKvlwF/Az+barsybiwEIpV2jAquMijVpDOqMG2LSPTGZiMfHp0v7 vTsg== X-Gm-Message-State: APjAAAVbrZazQv2PZTJuPIn0v5HBI7huq3JLuZodZtzGZzEkRfyFSvkP 4MUYXzZzVUPLLKU4vk7zObU= X-Google-Smtp-Source: APXvYqy1aLbUNvBzC+f2Rz35iy90zyR34DW8II/taoBuGX8rFZrS49SjHTOIjHghEAuCo0Nw955Tug== X-Received: by 2002:a62:6805:: with SMTP id d5mr21559150pfc.125.1577517105994; Fri, 27 Dec 2019 23:11:45 -0800 (PST) Received: from local.opencloud.tech.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id o2sm17380429pjo.26.2019.12.27.23.11.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Dec 2019 23:11:45 -0800 (PST) From: xiangxia.m.yue@gmail.com To: blp@ovn.org, i.maximets@ovn.org, elibr@mellanox.com Date: Sat, 28 Dec 2019 15:11:16 +0800 Message-Id: <1577517076-105041-8-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1577517076-105041-1-git-send-email-xiangxia.m.yue@gmail.com> Cc: dev@openvswitch.org, martinbj2008@gmail.com Subject: [ovs-dev] [ovs-dev 7/7] netdev-offload-dpdk: Add dpdk offload meter action X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Tonghao Zhang This patch introduce the dpdk_meter_offload_api struct and implement the meter offload api for dpdk. * ovs-ofctl can create the meter resource but the meter offload action is not created yet. The meter action will be created actually when installing the flow, and the offload private data be attached datapath meters, such as dp_meter struct. * the action resource can be reused if created for the same flow if they is deleted, and multi-flows can share it. * when ovs-ofctl modify the meter info, the offload meter resource is updated too. * when ovs-ofctl delete the meter, the offload destroy callback is called. Signed-off-by: Tonghao Zhang --- lib/dpif-netdev.c | 49 +++++++- lib/netdev-dpdk.c | 6 + lib/netdev-dpdk.h | 1 + lib/netdev-offload-dpdk.c | 293 +++++++++++++++++++++++++++++++++++++++------- 4 files changed, 307 insertions(+), 42 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e33215d..eec9f21 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -392,6 +392,7 @@ struct dp_flow_offload_item { size_t actions_len; struct ovs_list node; + struct dpif *dpif; }; struct dp_flow_offload { @@ -1608,6 +1609,31 @@ dpif_netdev_open(const struct dpif_class *class, const char *name, return error; } +static struct dpif * +dpif_netdev_dump_create(struct dp_netdev *dp) +{ + struct dpif *dpif = NULL; + + ovs_mutex_lock(&dp_netdev_mutex); + dpif = create_dpif_netdev(dp); + ovs_mutex_unlock(&dp_netdev_mutex); + + return dpif; +} + +static void +dpif_netdev_dump_destroy(struct dp_netdev *dp, struct dpif *dpif) +{ + ovs_mutex_lock(&dp_netdev_mutex); + + free(dpif->base_name); + free(dpif->full_name); + free(dpif); + ovs_refcount_unref(&dp->ref_cnt); + + ovs_mutex_unlock(&dp_netdev_mutex); +} + static void dp_netdev_destroy_upcall_lock(struct dp_netdev *dp) OVS_NO_THREAD_SAFETY_ANALYSIS @@ -1625,6 +1651,15 @@ dp_delete_meter(struct dp_netdev *dp, uint32_t meter_id) OVS_REQUIRES(dp->meter_locks[meter_id % N_METER_LOCKS]) { if (dp->meters[meter_id]) { + if (dp->meters[meter_id]->offload) { + struct netdev_offload_meter *nom; + + nom = dp->meters[meter_id]->offload; + nom->meter_ops->meter_destroy(nom->priv_data); + free(nom); + dp->meters[meter_id]->offload = NULL; + } + free(dp->meters[meter_id]); dp->meters[meter_id] = NULL; } @@ -2323,6 +2358,7 @@ dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd, offload->pmd = pmd; offload->flow = flow; offload->op = op; + offload->dpif = dpif_netdev_dump_create(pmd->dp); dp_netdev_flow_ref(flow); dp_netdev_pmd_try_ref(pmd); @@ -2333,6 +2369,7 @@ dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd, static void dp_netdev_free_flow_offload(struct dp_flow_offload_item *offload) { + dpif_netdev_dump_destroy(offload->pmd->dp, offload->dpif); dp_netdev_pmd_unref(offload->pmd); dp_netdev_flow_unref(offload->flow); @@ -2407,6 +2444,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } } info.flow_mark = mark; + info.dpif_class = pmd->dp->class; port = netdev_ports_get(in_port, pmd->dp->class); if (!port || netdev_vport_is_vport_class(port->netdev_class)) { @@ -2416,7 +2454,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) /* Taking a global 'port_mutex' to fulfill thread safety restrictions for * the netdev-offload-dpdk module. */ ovs_mutex_lock(&pmd->dp->port_mutex); - ret = netdev_flow_put(NULL, port, &offload->match, + ret = netdev_flow_put(offload->dpif, port, &offload->match, CONST_CAST(struct nlattr *, offload->actions), offload->actions_len, &flow->mega_ufid, &info, NULL); @@ -5829,6 +5867,15 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id meter_id, } meter_lock(dp, mid); + if (dp->meters[mid] && dp->meters[mid]->offload) { + struct netdev_offload_meter *nom; + + nom = dp->meters[mid]->offload; + nom->meter_ops->meter_update(nom->priv_data, config); + meter->offload = nom; + dp->meters[mid]->offload = NULL; + } + dp_delete_meter(dp, mid); /* Free existing meter, if any */ dp->meters[mid] = meter; meter_unlock(dp, mid); diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 8198a0b..6005071 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1112,6 +1112,12 @@ netdev_dpdk_cast(const struct netdev *netdev) return CONTAINER_OF(netdev, struct netdev_dpdk, up); } +int +netdev_dpdk_get_portid(const struct netdev *netdev) +{ + return netdev_dpdk_cast(netdev)->port_id; +} + static struct netdev * netdev_dpdk_alloc(void) { diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 60631c4..79009c6 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -36,6 +36,7 @@ void netdev_dpdk_register(void); void free_dpdk_buf(struct dp_packet *); bool netdev_dpdk_flow_api_supported(struct netdev *); +int netdev_dpdk_get_portid(const struct netdev *netdev); int netdev_dpdk_rte_flow_destroy(struct netdev *netdev, diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 1aa40a1..bcc0ee8 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -17,10 +17,12 @@ #include #include +#include #include "cmap.h" #include "dpif-netdev.h" #include "netdev-offload-provider.h" +#include "openvswitch/ofp-meter.h" #include "netdev-provider.h" #include "openvswitch/match.h" #include "openvswitch/vlog.h" @@ -374,55 +376,218 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type, actions->cnt++; } -struct action_rss_data { - struct rte_flow_action_rss conf; - uint16_t queue[0]; +struct dpdk_meter_offload { + uint32_t port_id; + uint32_t max_rate; + uint32_t mp_id; + struct rte_flow_action_meter mc; }; -static struct action_rss_data * -add_flow_rss_action(struct flow_actions *actions, - struct netdev *netdev) +static void dpdk_meter_destroy(void *priv_data) { - int i; - struct action_rss_data *rss_data; - - rss_data = xmalloc(sizeof *rss_data + - netdev_n_rxq(netdev) * sizeof rss_data->queue[0]); - *rss_data = (struct action_rss_data) { - .conf = (struct rte_flow_action_rss) { - .func = RTE_ETH_HASH_FUNCTION_DEFAULT, - .level = 0, - .types = 0, - .queue_num = netdev_n_rxq(netdev), - .queue = rss_data->queue, - .key_len = 0, - .key = NULL - }, - }; + struct dpdk_meter_offload *dmo = priv_data; + struct rte_mtr_error mtr_error; + + if (dmo) { + rte_mtr_meter_profile_delete(dmo->port_id, + dmo->mc.mtr_id, + &mtr_error); + rte_mtr_destroy(dmo->port_id, dmo->mc.mtr_id, + &mtr_error); + free(dmo); + } +} + +#define DPDK_METER_UPATE_UP 65536 + +static void dpdk_meter_update(void *priv_data, void *config) +{ + struct dpdk_meter_offload *dmo = priv_data; + struct rte_mtr_meter_profile mp; + struct rte_mtr_error mtr_error; + uint32_t mp_id, new_mp_id; + uint32_t max_rate; + uint32_t ret; + + if (!priv_data || !config) { + return; + } + + max_rate = ofputil_meter_config_max_rate(config); + if (dmo->max_rate == max_rate) { + return; + } + + memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); + mp.alg = RTE_MTR_SRTCM_RFC2697; + mp.srtcm_rfc2697.cir = max_rate *1024 /8; + mp.srtcm_rfc2697.cbs = max_rate *1024 /8; + mp.srtcm_rfc2697.ebs = 0; + + if (dmo->mp_id < DPDK_METER_UPATE_UP) { + new_mp_id = dmo->mp_id + DPDK_METER_UPATE_UP; + } else { + new_mp_id = dmo->mp_id - DPDK_METER_UPATE_UP; + } + + ret = rte_mtr_meter_profile_add(dmo->port_id, new_mp_id, + &mp, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + return; + } + + ret = rte_mtr_meter_profile_update(dmo->port_id, dmo->mc.mtr_id, + new_mp_id, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + mp_id = new_mp_id; + goto out; + } + + mp_id = dmo->mp_id; + dmo->mp_id = new_mp_id; +out: + ret = rte_mtr_meter_profile_delete(dmo->port_id, mp_id, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + } +} + +static struct netdev_offload_meter_api dpdk_meter_offload_api = { + .meter_destroy = dpdk_meter_destroy, + .meter_update = dpdk_meter_update, +}; + +static struct rte_flow_action_meter* +dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) +{ + uint32_t port_id = netdev_dpdk_get_portid(netdev); + struct netdev_offload_meter *nom; + struct dpdk_meter_offload *dmo; + struct ofputil_meter_config config; + ofproto_meter_id meter_id; + struct rte_mtr_meter_profile mp; + struct rte_mtr_params params; + struct rte_mtr_error mtr_error; + uint32_t max_rate; + int ret; + + meter_id.uint32 = mid; + + if (dpif_meter_get_config(dpif, meter_id, &config)) { + return NULL; + } + + nom = xmalloc(sizeof *nom); + dmo = xmalloc(sizeof *dmo); + + nom->meter_ops = &dpdk_meter_offload_api; + nom->priv_data = dmo; + + memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); + max_rate = ofputil_meter_config_max_rate(&config); + + dmo->mc.mtr_id = mid; + dmo->port_id = port_id; + dmo->max_rate = max_rate; + dmo->mp_id = mid; + + mp.alg = RTE_MTR_SRTCM_RFC2697; + mp.srtcm_rfc2697.cir = max_rate *1024 /8; /* rate_max Kbps*/ + mp.srtcm_rfc2697.cbs = max_rate *1024 /8; + mp.srtcm_rfc2697.ebs = 0; + + ret = rte_mtr_meter_profile_add(dmo->port_id, dmo->mc.mtr_id, + &mp, &mtr_error); + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); + goto profile_err; + } + + enum rte_color dscp_table[2]; + dscp_table[0] = RTE_COLOR_YELLOW; + dscp_table[1] = RTE_COLOR_RED; + + params.meter_profile_id = dmo->mc.mtr_id; + params.dscp_table = dscp_table; + params.meter_enable = 1; + params.use_prev_mtr_color = 0; + params.action[RTE_COLOR_GREEN] = MTR_POLICER_ACTION_COLOR_GREEN; + params.action[RTE_COLOR_YELLOW] = MTR_POLICER_ACTION_DROP; + params.action[RTE_COLOR_RED] = MTR_POLICER_ACTION_DROP; + + ret = rte_mtr_create(dmo->port_id, dmo->mc.mtr_id, ¶ms, 0, &mtr_error); + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_create fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); + goto mtr_err; + } + + dpif_meter_set_offload(dpif, meter_id, nom); + + free(config.bands); + return &dmo->mc; + +mtr_err: + rte_mtr_meter_profile_delete(dmo->port_id, dmo->mc.mtr_id, &mtr_error); + +profile_err: + free(nom); + free(dmo); + free(config.bands); + return NULL; +} + +static struct rte_flow_action_meter * +netdev_offload_dpdk_meter_conf(struct dpif *dpif, struct netdev *netdev, uint32_t mid) +{ + uint32_t port_id = netdev_dpdk_get_portid(netdev); + struct netdev_offload_meter *nom = NULL; + struct dpdk_meter_offload *dmo; + ofproto_meter_id meter_id; + uint32_t ret; + meter_id.uint32 = mid; - /* Override queue array with default. */ - for (i = 0; i < netdev_n_rxq(netdev); i++) { - rss_data->queue[i] = i; + ret = dpif_meter_get_offload(dpif, meter_id, (void **)&nom, + sizeof *nom + sizeof *dmo); + if (ret) { + VLOG_INFO("netdev offload dpdk meter, can't get the meter"); + return NULL; } - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RSS, &rss_data->conf); + if (!nom) { + return dpdk_meter_create(dpif, netdev, mid); + } + + dmo = (struct dpdk_meter_offload *)nom->priv_data; + if (port_id != dmo->port_id) { + VLOG_INFO("dpdk meter %d is used on %d, can't be used for : %d", + mid, dmo->port_id, port_id); + return NULL; + } - return rss_data; + return &dmo->mc; } static int -netdev_offload_dpdk_add_flow(struct netdev *netdev, +netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev, const struct match *match, - struct nlattr *nl_actions OVS_UNUSED, - size_t actions_len OVS_UNUSED, + struct nlattr *nl_actions, + size_t actions_len, const ovs_u128 *ufid, - struct offload_info *info) + struct offload_info *info OVS_UNUSED) { const struct rte_flow_attr flow_attr = { .group = 0, .priority = 0, .ingress = 1, - .egress = 0 + .egress = 0, + .transfer = 1, }; struct flow_patterns patterns = { .items = NULL, .cnt = 0 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; @@ -583,20 +748,66 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, add_flow_pattern(&patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); - struct rte_flow_action_mark mark; - struct action_rss_data *rss; + const struct nlattr *a; + unsigned int left; - mark.id = info->flow_mark; - add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_MARK, &mark); + if (!actions_len || !nl_actions) { + VLOG_INFO("%s: skip flow offload without actions\n", netdev_get_name(netdev)); + ret = -1; + goto out; + } + + NL_ATTR_FOR_EACH_UNSAFE (a, left, nl_actions, actions_len) { + int type = nl_attr_type(a); + switch ((enum ovs_action_attr) type) { + case OVS_ACTION_ATTR_METER: { + struct rte_flow_action_meter *mc; + mc = netdev_offload_dpdk_meter_conf(dpif, + netdev, + nl_attr_get_u32(a)); + if (mc) { + add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_METER, mc); + } + break; + } + case OVS_ACTION_ATTR_OUTPUT: + case OVS_ACTION_ATTR_CHECK_PKT_LEN: + case OVS_ACTION_ATTR_PUSH_VLAN: + case OVS_ACTION_ATTR_POP_VLAN: + case OVS_ACTION_ATTR_UNSPEC: + case OVS_ACTION_ATTR_USERSPACE: + case OVS_ACTION_ATTR_SET: + case OVS_ACTION_ATTR_SAMPLE: + case OVS_ACTION_ATTR_RECIRC: + case OVS_ACTION_ATTR_HASH: + case OVS_ACTION_ATTR_PUSH_MPLS: + case OVS_ACTION_ATTR_POP_MPLS: + case OVS_ACTION_ATTR_SET_MASKED: + case OVS_ACTION_ATTR_CT: + case OVS_ACTION_ATTR_TRUNC: + case OVS_ACTION_ATTR_PUSH_ETH: + case OVS_ACTION_ATTR_POP_ETH: + case OVS_ACTION_ATTR_CT_CLEAR: + case OVS_ACTION_ATTR_PUSH_NSH: + case OVS_ACTION_ATTR_POP_NSH: + case OVS_ACTION_ATTR_TUNNEL_PUSH: + case OVS_ACTION_ATTR_TUNNEL_POP: + case OVS_ACTION_ATTR_CLONE: + case __OVS_ACTION_ATTR_MAX: + default: + VLOG_INFO("%s: the offload action %d is not supported yet.\n", + netdev_get_name(netdev), + type); + ret = -1; + goto out; + } + } - rss = add_flow_rss_action(&actions, netdev); add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_END, NULL); flow = netdev_dpdk_rte_flow_create(netdev, &flow_attr, patterns.items, actions.actions, &error); - - free(rss); if (!flow) { VLOG_ERR("%s: rte flow creat error: %u : message : %s\n", netdev_get_name(netdev), error.type, error.message); @@ -707,7 +918,7 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, } static int -netdev_offload_dpdk_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, +netdev_offload_dpdk_flow_put(struct dpif *dpif, struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, const ovs_u128 *ufid, struct offload_info *info, @@ -736,7 +947,7 @@ netdev_offload_dpdk_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev if (stats) { memset(stats, 0, sizeof *stats); } - return netdev_offload_dpdk_add_flow(netdev, match, actions, + return netdev_offload_dpdk_add_flow(dpif, netdev, match, actions, actions_len, ufid, info); }