From patchwork Fri Apr 24 08:23:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sriharsha Basavapatna X-Patchwork-Id: 1276248 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=none (p=none dis=none) header.from=openvswitch.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=google header.b=JwFY5qa7; 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 497nSn1v3Jz9sSM for ; Fri, 24 Apr 2020 18:31:21 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 8205F8812C; Fri, 24 Apr 2020 08:31:19 +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 N0JV0LsTXY9t; Fri, 24 Apr 2020 08:31:14 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 1729088138; Fri, 24 Apr 2020 08:31:14 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0CC07C1D74; Fri, 24 Apr 2020 08:31:14 +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 A5D24C0175 for ; Fri, 24 Apr 2020 08:31:12 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id A2F8D86F1B for ; Fri, 24 Apr 2020 08:31:12 +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 SLt6LXd1wbW6 for ; Fri, 24 Apr 2020 08:31:12 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by fraxinus.osuosl.org (Postfix) with ESMTPS id E122786DF7 for ; Fri, 24 Apr 2020 08:31:11 +0000 (UTC) Received: by mail-wm1-f67.google.com with SMTP id x4so9496743wmj.1 for ; Fri, 24 Apr 2020 01:31:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=s9M0XzP6Jpk9Aq+RnPs3HlIGu4EPiRqZEmK/Fcci60M=; b=JwFY5qa7LdDliWu+H8X+wPUN+il6TdrIGRlUmjuoIzQBIp0BzBZeEo6RjS9s1ajuVE swtTGHyUSyaVRkVlZiZxM5puwEszm5IynS+hH/mLiHUBFMIyESsYQtMiZi97Kmg93IvA 5+jAdCrY/TB/eKovMlvvXLv0C84iEJnLYpEEg= 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:mime-version:content-transfer-encoding; bh=s9M0XzP6Jpk9Aq+RnPs3HlIGu4EPiRqZEmK/Fcci60M=; b=rCivFX/ImBKlXHBEwdk1PWhmsTOIlukR0wD53K1n018IUWUejjO3Vr9ktYxVRT/GXX FjmUsfIymOCQxx5BiTQ1me2AXIa5oZsSbHLOZeSU/s9gHycLtSPK9Grm7qeBIj9RF11P frwmC+CBuytx5wDFaEwLcvxE1NOp//aIECWdBlfA7Q9TQEAwYSENH+xJve/wnfPk9mVQ N2X2+J9woiHBM3B0yqMOnu1Pbp38WV84T/NoBj9+0T2zMfQZJSAHxkyzfHIqswOZJyQm pIMjWU1xEPZc2pjdhkfv5SyJDY17HtISj66cCSK+Ih50yrGVeZ5AEyJyoI/uPbmeIsJG R78w== X-Gm-Message-State: AGi0PuYnCvpr+qepNkZiFCtFv/IKg+f/eSdsap/kqzpV0OWxjDoK0Mmm r3kKHxhTF0nQdi+i/kH/U+mv0WX5jHAN8DPWX/M3hYF+YJ7amIa5vtxUuHRilZYYWpZwOxaiz4x nivZqo/PHQiFUtmunrY1ee8PIFMUpak6Hh+CIxF6/MsTz6Xl5eGfn0VQlTP433CgZhzbSGRWYzl Ejuzf8 X-Google-Smtp-Source: APiQypLfOryqpDbkDi7b4TRHHEV13Au+ytfUI5OcIIl+GMV0Y3yh+GSQt8jFIElp2fwemynqIPSdbA== X-Received: by 2002:a1c:9a16:: with SMTP id c22mr8423632wme.38.1587716615005; Fri, 24 Apr 2020 01:23:35 -0700 (PDT) Received: from dhcp-10-123-153-36.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id y5sm7723315wru.15.2020.04.24.01.23.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:23:34 -0700 (PDT) To: dev@openvswitch.org Date: Fri, 24 Apr 2020 04:23:10 -0400 Message-Id: <20200424082313.7666-2-sriharsha.basavapatna@broadcom.com> X-Mailer: git-send-email 2.25.0.rc2 In-Reply-To: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> References: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> MIME-Version: 1.0 Subject: [ovs-dev] [RFC PATCH 1/4] dpif-netdev: Refactor dp_netdev_flow_offload_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: , X-Patchwork-Original-From: Sriharsha Basavapatna via dev From: Sriharsha Basavapatna Reply-To: Sriharsha Basavapatna Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" This patch refactors dp_netdev_flow_offload_put() to prepare for more changes to support partial action offload, in subsequent patches. - Add a wrapper function to allocate flow-mark. - Move netdev_ports_get() to before flow-mark allocation. Signed-off-by: Sriharsha Basavapatna --- lib/dpif-netdev.c | 71 ++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index ea7b187b2..781b233f4 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2357,6 +2357,43 @@ dp_netdev_flow_offload_del(struct dp_flow_offload_item *offload) return mark_to_flow_disassociate(offload->pmd, offload->flow); } +static int +dp_netdev_alloc_flow_mark(struct dp_netdev_flow *flow, bool modification, + uint32_t *markp) +{ + uint32_t mark; + + if (modification) { + mark = flow->mark; + ovs_assert(mark != INVALID_FLOW_MARK); + *markp = mark; + return 0; + } + + /* + * If a mega flow has already been offloaded (from other PMD + * instances), do not offload it again. + */ + mark = megaflow_to_mark_find(&flow->mega_ufid); + if (mark != INVALID_FLOW_MARK) { + VLOG_DBG("Flow has already been offloaded with mark %u\n", mark); + if (flow->mark != INVALID_FLOW_MARK) { + ovs_assert(flow->mark == mark); + } else { + mark_to_flow_associate(mark, flow); + } + return 1; + } + + mark = netdev_offload_flow_mark_alloc(); + if (mark == INVALID_FLOW_MARK) { + VLOG_ERR("Failed to allocate flow mark!\n"); + } + + *markp = mark; + return 0; +} + /* * There are two flow offload operations here: addition and modification. * @@ -2385,36 +2422,18 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) return -1; } - if (modification) { - mark = flow->mark; - ovs_assert(mark != INVALID_FLOW_MARK); - } else { - /* - * If a mega flow has already been offloaded (from other PMD - * instances), do not offload it again. - */ - mark = megaflow_to_mark_find(&flow->mega_ufid); - if (mark != INVALID_FLOW_MARK) { - VLOG_DBG("Flow has already been offloaded with mark %u\n", mark); - if (flow->mark != INVALID_FLOW_MARK) { - ovs_assert(flow->mark == mark); - } else { - mark_to_flow_associate(mark, flow); - } - return 0; - } + port = netdev_ports_get(in_port, dpif_type_str); + if (!port) { + return -1; + } - mark = netdev_offload_flow_mark_alloc(); - if (mark == INVALID_FLOW_MARK) { - VLOG_ERR("Failed to allocate flow mark!\n"); - } + if (dp_netdev_alloc_flow_mark(flow, modification, &mark)) { + /* flow already offloaded */ + netdev_close(port); + return 0; } info.flow_mark = mark; - port = netdev_ports_get(in_port, dpif_type_str); - if (!port) { - goto err_free; - } /* Taking a global 'port_mutex' to fulfill thread safety restrictions for * the netdev-offload-dpdk module. */ ovs_mutex_lock(&pmd->dp->port_mutex); From patchwork Fri Apr 24 08:23:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sriharsha Basavapatna X-Patchwork-Id: 1276247 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=none (p=none dis=none) header.from=openvswitch.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=google header.b=DOIRDvtS; 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 497nSV2KP0z9sSM for ; Fri, 24 Apr 2020 18:31:06 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D0C9F88139; Fri, 24 Apr 2020 08:31:04 +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 iGUn4TUe4oCO; Fri, 24 Apr 2020 08:31:02 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 331828805C; Fri, 24 Apr 2020 08:31:02 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 14A6DC1AE2; Fri, 24 Apr 2020 08:31:02 +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 345B9C0175 for ; Fri, 24 Apr 2020 08:31:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 22FAA88794 for ; Fri, 24 Apr 2020 08:31:00 +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 zhx6N-BBS-ug for ; Fri, 24 Apr 2020 08:30:59 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) by hemlock.osuosl.org (Postfix) with ESMTPS id AC04A8872C for ; Fri, 24 Apr 2020 08:30:58 +0000 (UTC) Received: by mail-lj1-f195.google.com with SMTP id n6so9036949ljg.12 for ; Fri, 24 Apr 2020 01:30:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ULEGBaEoAACwHjzeuFVs/x1SxLQDoXzkWeqi60OMF60=; b=DOIRDvtSAxBY5ak8b3TxUAPf4HzGQOm81HYEeEbuMdjtK4YETv0wXXQWib3vdVJyAa NiLfSsiWpJ069lrHXyN9a2xqLcXTrhjsusOdif8+PkB9rFUPe64hbX8y6PAn3Sz8snF3 7zSe+nECXr1IQ9+uRMKSUfkFI6GzSUtr36tBE= 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:mime-version:content-transfer-encoding; bh=ULEGBaEoAACwHjzeuFVs/x1SxLQDoXzkWeqi60OMF60=; b=g1uRTTqLMUu3LYQ6hS15cJxE/JyL/qNCW16RnCteYAzJZFkBEL2Po3uZqMnvE7UpZ8 U1YK0ViAX7+eZYgZsO2AxbIMDCTBhr6EVFhXTg65NyN3y/cX51FMBzDyVl/H3V9faIpm QJFzExMUKJa3iIqlyRi+I8ccfcrjUZDeZnbVYWqaypVIsBTr5+aaqCBroh/URCpzipFn wt+2YdDu04FZ2Rsj2v9qmADCOVb6JBIiyEGG/NgLxB41weRiIbd19KJPam3YaOd8Mc91 bVabjmhbsBql4D/KjMSCtvXw8x9i3OiGtXOy3Gddz5LOpX+c0LB9/n+cER9wunv4WLF9 /X9g== X-Gm-Message-State: AGi0PubD/+yoMmSoD+qIARlZ2PCfqFtt821UbbcF3TxlFnK4C2fszNoM CO/j8oPlfnLEHSFQXTh0wNw6EDib9Z4Vcy9hk8pmxDUIgblz3Qi/+rMQlYdySGRKZCpMUtZrW5M 1q2brqgZAkdLfsSDufbtqrBVvn5sybNx4QyusGj/1lrfGqQJjVLOm6qcmmXkkWYFU/G9+F9Zu9H uHUNxT X-Google-Smtp-Source: APiQypJ5s4YqCqlfv6leP+xBLfaxHDJzMyjqoK5I1+iMpbw36OvEivWXT9Yceui63LUbXul4zYqvMw== X-Received: by 2002:adf:e450:: with SMTP id t16mr10329179wrm.301.1587716617478; Fri, 24 Apr 2020 01:23:37 -0700 (PDT) Received: from dhcp-10-123-153-36.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id y5sm7723315wru.15.2020.04.24.01.23.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:23:36 -0700 (PDT) To: dev@openvswitch.org Date: Fri, 24 Apr 2020 04:23:11 -0400 Message-Id: <20200424082313.7666-3-sriharsha.basavapatna@broadcom.com> X-Mailer: git-send-email 2.25.0.rc2 In-Reply-To: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> References: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> MIME-Version: 1.0 Subject: [ovs-dev] [RFC PATCH 2/4] dpif-netdev: Support partial-action-offload of VXLAN encap flow 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: , X-Patchwork-Original-From: Sriharsha Basavapatna via dev From: Sriharsha Basavapatna Reply-To: Sriharsha Basavapatna Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" In this patch, we support offloading of VXLAN_ENCAP action for a vhost-user port (aka "partial-action-offload"). At the time of offloading the flow, we determine if the flow can be offloaded to an egress device, if the input port is not offload capable such as a vhost-user port. We then offload the flow with a VXLAN_ENCAP RTE action, to the egress device. We do not add the OUTPUT RTE action, which indicates to the PMD that is is a partial action offload request. Note that since the action is being offloaded in egress direction, classification is expected to be done by OVS SW datapath and hence there's no need to offload a MARK action. If offload succeeds, we save the information in 'dp_netdev_flow' so that we skip execution of the corresponding action (subsequent patch) during SW datapath processing. Signed-off-by: Sriharsha Basavapatna --- lib/dpif-netdev.c | 172 ++++++++++++++++++++++++++++++++++++-- lib/netdev-dpdk.c | 5 ++ lib/netdev-dpdk.h | 1 + lib/netdev-offload-dpdk.c | 45 +++++++--- lib/netdev-offload.h | 2 + 5 files changed, 206 insertions(+), 19 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 781b233f4..a47230067 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -538,6 +538,14 @@ struct dp_netdev_flow { bool dead; uint32_t mark; /* Unique flow mark assigned to a flow */ + /* The next two members are used to support partial offloading of + * actions. The boolean flag tells if this flow has its actions partially + * offloaded. The egress port# tells if the action should be offloaded + * on the egress (output) port instead of the in-port for the flow. + */ + bool partial_actions_offloaded; + odp_port_t egress_offload_port; + /* Statistics. */ struct dp_netdev_flow_stats stats; @@ -2351,12 +2359,141 @@ dp_netdev_append_flow_offload(struct dp_flow_offload_item *offload) ovs_mutex_unlock(&dp_flow_offload.mutex); } +static int dp_netdev_egress_flow_del(struct dp_netdev_pmd_thread *pmd, + struct dp_netdev_flow *flow) +{ + int ret; + struct netdev *port; + odp_port_t out_port = flow->egress_offload_port; + const char *dpif_type_str = dpif_normalize_type(pmd->dp->class->type); + + port = netdev_ports_get(out_port, dpif_type_str); + if (!port) { + return -1; + } + + /* 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_del(port, &flow->mega_ufid, NULL); + ovs_mutex_unlock(&pmd->dp->port_mutex); + netdev_close(port); + + return ret; +} + static int dp_netdev_flow_offload_del(struct dp_flow_offload_item *offload) { + if (offload->flow->partial_actions_offloaded && + offload->flow->egress_offload_port != ODPP_NONE) { + return dp_netdev_egress_flow_del(offload->pmd, offload->flow); + } return mark_to_flow_disassociate(offload->pmd, offload->flow); } +/* This function determines if the given flow should be partially offloaded + * on the egress device, when the in-port is not offload-capable like a + * vhost-user port. The function currently supports offloading of only + * tunnel encap action. + */ +static bool +should_partial_offload_egress(struct netdev *in_netdev, + struct dp_flow_offload_item *offload, + struct netdev **egress_netdev) +{ + const char *dpif_type_str = + dpif_normalize_type(offload->pmd->dp->class->type); + odp_port_t out_port = ODPP_NONE; + struct nlattr *clone_actions; + struct netdev *out_netdev; + bool encap_action = false; + size_t clone_actions_len; + const struct nlattr *a; + unsigned int left; + int type; + + /* Support egress partial-offload only when in-port is vhost-user. */ + if (!is_dpdk_vhost_netdev(in_netdev)) { + return false; + } + + /* Only support clone sub-actions for now, tnl-push specifically. */ + type = nl_attr_type(offload->actions); + if (type != OVS_ACTION_ATTR_CLONE) { + return false; + } + clone_actions = nl_attr_get(offload->actions); + clone_actions_len = nl_attr_get_size(offload->actions); + + NL_ATTR_FOR_EACH (a, left, clone_actions, clone_actions_len) { + type = nl_attr_type(a); + bool last_action = (left <= NLA_ALIGN(a->nla_len)); + + if (type == OVS_ACTION_ATTR_TUNNEL_PUSH) { + encap_action = true; + } else if (type == OVS_ACTION_ATTR_OUTPUT) { + if (last_action) { + out_port = nl_attr_get_odp_port(a); + break; + } + } else { + /* Reject if there are other actions */ + return false; + } + } + + /* Support egress partial-offload only when there is an output action. */ + if (out_port == ODPP_NONE) { + return false; + } + + /* Support only encap action for now. */ + if (!encap_action) { + return false; + } + + /* Support egress partial-offload only when out-port is offload capable. */ + out_netdev = netdev_ports_get(out_port, dpif_type_str); + if (!out_netdev || !netdev_dpdk_flow_api_supported(out_netdev)) { + return false; + } + + /* Flow can be egress partial-offloaded. */ + *egress_netdev = out_netdev; + offload->flow->egress_offload_port = out_port; + return true; +} + +/* Place-holder function for partial action offload in ingress direction, + * with a vhost-user port as the output port for the flow. + */ +static bool +should_partial_offload_ingress(struct netdev *in_netdev OVS_UNUSED, + struct dp_flow_offload_item *offload OVS_UNUSED) +{ + return false; +} + +/* This function determines if the given flow actions can be partially + * offloaded. Partial action offload is attempted when either the in-port + * or the out-port for the flow is a vhost-user port. + */ +static bool +dp_netdev_partial_offload_supported(struct netdev *in_netdev, + struct dp_flow_offload_item *offload, + struct netdev **egress_netdev) +{ + if (should_partial_offload_ingress(in_netdev, offload)) { + return true; + } else if (should_partial_offload_egress(in_netdev, offload, + egress_netdev)) { + return true; + } else { + return false; + } +} + static int dp_netdev_alloc_flow_mark(struct dp_netdev_flow *flow, bool modification, uint32_t *markp) @@ -2415,7 +2552,9 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) bool modification = offload->op == DP_NETDEV_FLOW_OFFLOAD_OP_MOD; struct offload_info info; struct netdev *port; - uint32_t mark; + struct netdev *egress_port = NULL; + bool alloc_mark = true; + uint32_t mark = INVALID_FLOW_MARK; int ret; if (flow->dead) { @@ -2427,7 +2566,20 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) return -1; } - if (dp_netdev_alloc_flow_mark(flow, modification, &mark)) { + info.attr_egress = 0; + info.partial_actions = 0; + + if (dp_netdev_partial_offload_supported(port, offload, &egress_port)) { + if (egress_port) { + netdev_close(port); + port = egress_port; + info.attr_egress = 1; + alloc_mark = false; + } + info.partial_actions = 1; + } + + if (alloc_mark && dp_netdev_alloc_flow_mark(flow, modification, &mark)) { /* flow already offloaded */ netdev_close(port); return 0; @@ -2448,17 +2600,21 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) goto err_free; } - if (!modification) { + if (info.partial_actions) { + flow->partial_actions_offloaded = true; + } else if (!modification) { megaflow_to_mark_associate(&flow->mega_ufid, mark); mark_to_flow_associate(mark, flow); } return 0; err_free: - if (!modification) { - netdev_offload_flow_mark_free(mark); - } else { - mark_to_flow_disassociate(pmd, flow); + if (mark != INVALID_FLOW_MARK) { + if (!modification) { + netdev_offload_flow_mark_free(mark); + } else { + mark_to_flow_disassociate(pmd, flow); + } } return -1; } @@ -3325,6 +3481,8 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, flow->dead = false; flow->batch = NULL; flow->mark = INVALID_FLOW_MARK; + flow->partial_actions_offloaded = false; + flow->egress_offload_port = ODPP_NONE; *CONST_CAST(unsigned *, &flow->pmd_id) = pmd->core_id; *CONST_CAST(struct flow *, &flow->flow) = match->flow; *CONST_CAST(ovs_u128 *, &flow->ufid) = *ufid; diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 944e4a152..ad880f3ff 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -559,6 +559,11 @@ is_dpdk_class(const struct netdev_class *class) || class->destruct == netdev_dpdk_vhost_destruct; } +bool is_dpdk_vhost_netdev(struct netdev *netdev) +{ + return netdev->netdev_class->destruct == netdev_dpdk_vhost_destruct; +} + /* DPDK NIC drivers allocate RX buffers at a particular granularity, typically * aligned at 1k or less. If a declared mbuf size is not a multiple of this * value, insufficient buffers are allocated to accomodate the packet in its diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 94e08e516..67e70d09f 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -37,6 +37,7 @@ void netdev_dpdk_register(void); void free_dpdk_buf(struct dp_packet *); bool netdev_dpdk_flow_api_supported(struct netdev *); +bool is_dpdk_vhost_netdev(struct 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 7be504688..d87d8b1fa 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1698,7 +1698,8 @@ static int parse_clone_actions(struct netdev *netdev, struct flow_actions *actions, const struct nlattr *clone_actions, - const size_t clone_actions_len) + const size_t clone_actions_len, + struct offload_info *info) { const struct nlattr *ca; unsigned int cleft; @@ -1723,8 +1724,11 @@ parse_clone_actions(struct netdev *netdev, add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RAW_ENCAP, raw_encap); } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { - if (add_output_action(netdev, actions, ca)) { - return -1; + /* add output action only if full-offload */ + if (!info->partial_actions) { + if (add_output_action(netdev, actions, ca)) { + return -1; + } } } else { VLOG_DBG_RL(&rl, @@ -1788,7 +1792,8 @@ parse_flow_actions(struct netdev *netdev, struct flow_actions *actions, struct nlattr *nl_actions, size_t nl_actions_len, - struct act_resources *act_resources) + struct act_resources *act_resources, + struct offload_info *info) { struct nlattr *nla; size_t left; @@ -1799,8 +1804,11 @@ parse_flow_actions(struct netdev *netdev, add_count_action(actions); NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) { if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { - if (add_output_action(netdev, actions, nla)) { - return -1; + /* add output action only if full-offload */ + if (!info->partial_actions) { + if (add_output_action(netdev, actions, nla)) { + return -1; + } } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { free_flow_actions(actions); @@ -1821,7 +1829,7 @@ parse_flow_actions(struct netdev *netdev, size_t clone_actions_len = nl_attr_get_size(nla); if (parse_clone_actions(netdev, actions, clone_actions, - clone_actions_len)) { + clone_actions_len, info)) { return -1; } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_TUNNEL_POP) { @@ -1899,16 +1907,22 @@ netdev_offload_dpdk_actions(struct netdev *netdev, size_t actions_len, const ovs_u128 *ufid, struct act_resources *act_resources, - struct flows_handle *flows) + struct flows_handle *flows, + struct offload_info *info) { - const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; + struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; struct flow_item flow_item = { .devargs = NULL }; struct rte_flow_error error; int ret; + if (info->attr_egress) { + flow_attr.ingress = 0; + flow_attr.egress = 1; + } + ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, - act_resources); + act_resources, info); if (ret) { goto out; } @@ -1957,8 +1971,15 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, ret = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, actions_len, ufid, &act_resources, - &flows); - if (ret) { + &flows, info); + if (!ret) { + if (info->partial_actions && info->attr_egress) { + /* actions_offloaded should be set to false with partial actions, + * since it is still considered as partial-offload and not + * full-offload. */ + actions_offloaded = false; + } + } else { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. */ diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index d6dd98367..3c079cc9d 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -67,6 +67,8 @@ struct offload_info { bool recirc_id_shared_with_tc; /* Indicates whever tc chains will be in * sync with datapath recirc ids. */ + uint8_t attr_egress; /* Egress direction offload */ + uint8_t partial_actions; /* Partial action offload; no forward action */ /* * The flow mark id assigened to the flow. If any pkts hit the flow, From patchwork Fri Apr 24 08:23:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sriharsha Basavapatna X-Patchwork-Id: 1276246 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=none (p=none dis=none) header.from=openvswitch.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=google header.b=bv67mBDH; 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 497nRB2vn6z9sSM for ; Fri, 24 Apr 2020 18:29:57 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id DE9E386E44; Fri, 24 Apr 2020 08:29:55 +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 6s5aU4fR9-u2; Fri, 24 Apr 2020 08:29:55 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 4024686DF7; Fri, 24 Apr 2020 08:29:55 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 362E3C1AE2; Fri, 24 Apr 2020 08:29:55 +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 931F9C1AE2 for ; Fri, 24 Apr 2020 08:29:54 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 8277B8879C for ; Fri, 24 Apr 2020 08:29:54 +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 znlDy1CunoX9 for ; Fri, 24 Apr 2020 08:29:53 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-lj1-f196.google.com (mail-lj1-f196.google.com [209.85.208.196]) by hemlock.osuosl.org (Postfix) with ESMTPS id 921B888798 for ; Fri, 24 Apr 2020 08:29:53 +0000 (UTC) Received: by mail-lj1-f196.google.com with SMTP id y4so9071252ljn.7 for ; Fri, 24 Apr 2020 01:29:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6g302eaqK/beDm8gkvpf4f1oMvsT12ZH+At9K0JhKk4=; b=bv67mBDHgduimQF9t4N555jT4F2pz5QwRr5JBY/S04oCIvQ7UZNeeHlJhx394SSERC bJ1ngHOQR2686pFfpdKHrUjqBMYBzeQadOlH6i1d1uBBNY8X8BMSafFA1m1ehwGVaHzV D3piFjgon7Un/O0wH0AGUv5jY9txYoPmwTeX4= 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:mime-version:content-transfer-encoding; bh=6g302eaqK/beDm8gkvpf4f1oMvsT12ZH+At9K0JhKk4=; b=JshtYwKLAqawy23vOm10K+dYGgzubliFRLi9G0sX5FmO511xLxhKkWjvErtzCMQiKG gOCyW5M7zefY5PaHWS4Tr9LEKtBvU9KmTdGvb1OGwtEr8xynTyXe1ohrHkSHea5nLWXL GXL/QGDjmXACrVkEv2F5FTu8gsLyEh008KYyXcbZuPKglKOR2dgUG7NDJcl7ITUTZaRp CFCaZ62DfEJjCWkU43Yu8gcFPr/mV7UJzATtKhJhJFKousBcvqnNRwaiJVsXf9Ci8pFc yzT9vL4y0kzyvgQTYtqemBs8NBxvSNESfv78BT4zGzrirWCSUH2e+sp+NBQW/jlh4+mo DXfw== X-Gm-Message-State: AGi0PuZt7yQlBaXAMjXYISODgSaMrQOzDRwpjedjRtkG9nRRKCmUR+hg 3cVZWGvLeIfLtQnOgkOoJacYBcHPj7Mjx0nBtWvVDyDpanewtsoxl25eo03+eFbN1QaI5y1Z0ti eoYE2VC6qk3PHt7FpIpOc+/1IFhcmyYQabutP2r+pYjGKOoFoqwwaQqGKSagxY/G9vHl3oPa2iL PBRbSF X-Google-Smtp-Source: APiQypIxGivaxH1kiZyveEfu0cgwAozY/DN+033WmC+HivtBvLa8+iu8vKYyCIW2r316pHyN/RHpNA== X-Received: by 2002:adf:f990:: with SMTP id f16mr8945451wrr.33.1587716619842; Fri, 24 Apr 2020 01:23:39 -0700 (PDT) Received: from dhcp-10-123-153-36.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id y5sm7723315wru.15.2020.04.24.01.23.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:23:39 -0700 (PDT) To: dev@openvswitch.org Date: Fri, 24 Apr 2020 04:23:12 -0400 Message-Id: <20200424082313.7666-4-sriharsha.basavapatna@broadcom.com> X-Mailer: git-send-email 2.25.0.rc2 In-Reply-To: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> References: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> MIME-Version: 1.0 Subject: [ovs-dev] [RFC PATCH 3/4] dpif-netdev: Skip encap action during datapath execution 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: , X-Patchwork-Original-From: Sriharsha Basavapatna via dev From: Sriharsha Basavapatna Reply-To: Sriharsha Basavapatna Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" In this patch we check if action processing (apart from OUTPUT action), should be skipped for a given dp_netdev_flow. Specifically, we check if the action is TNL_PUSH and if it has been offloaded to HW, then we do not push the tunnel header in SW. The datapath only executes the OUTPUT action. The packet will be encapsulated in HW during transmit. Signed-off-by: Sriharsha Basavapatna --- lib/dpif-netdev.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a47230067..7fcc0b06d 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -799,7 +799,8 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, bool should_steal, const struct flow *flow, const struct nlattr *actions, - size_t actions_len); + size_t actions_len, + const struct dp_netdev_flow *dp_flow); static void dp_netdev_input(struct dp_netdev_pmd_thread *, struct dp_packet_batch *, odp_port_t port_no); static void dp_netdev_recirculate(struct dp_netdev_pmd_thread *, @@ -3986,7 +3987,7 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute) dp_packet_batch_init_packet(&pp, execute->packet); pp.do_not_steal = true; dp_netdev_execute_actions(pmd, &pp, false, execute->flow, - execute->actions, execute->actions_len); + execute->actions, execute->actions_len, NULL); dp_netdev_pmd_flush_output_packets(pmd, true); if (pmd->core_id == NON_PMD_CORE_ID) { @@ -6614,7 +6615,7 @@ packet_batch_per_flow_execute(struct packet_batch_per_flow *batch, actions = dp_netdev_flow_get_actions(flow); dp_netdev_execute_actions(pmd, &batch->array, true, &flow->flow, - actions->actions, actions->size); + actions->actions, actions->size, flow); } static inline void @@ -6922,7 +6923,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, * we'll send the packet up twice. */ dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, true, &match.flow, - actions->data, actions->size); + actions->data, actions->size, NULL); add_actions = put_actions->size ? put_actions : actions; if (OVS_LIKELY(error != ENOSPC)) { @@ -7157,6 +7158,7 @@ dp_netdev_recirculate(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_execute_aux { struct dp_netdev_pmd_thread *pmd; const struct flow *flow; + const void *dp_flow; /* for partial action offload */ }; static void @@ -7301,7 +7303,7 @@ dp_execute_userspace_action(struct dp_netdev_pmd_thread *pmd, if (!error || error == ENOSPC) { dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, should_steal, flow, - actions->data, actions->size); + actions->data, actions->size, NULL); } else if (should_steal) { dp_packet_delete(packet); COVERAGE_INC(datapath_drop_userspace_action_error); @@ -7320,6 +7322,7 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, int type = nl_attr_type(a); struct tx_port *p; uint32_t packet_count, packets_dropped; + struct dp_netdev_flow *dp_flow = aux->dp_flow; switch ((enum ovs_action_attr)type) { case OVS_ACTION_ATTR_OUTPUT: @@ -7377,9 +7380,13 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, } dp_packet_batch_apply_cutlen(packets_); packet_count = dp_packet_batch_size(packets_); - if (push_tnl_action(pmd, a, packets_)) { - COVERAGE_ADD(datapath_drop_tunnel_push_error, - packet_count); + /* Execute tnl_push action in SW, only if it is not offloaded + * as a partial action in HW. Otherwise, HW pushes the tunnel + * header during output processing. */ + if (!dp_flow || !dp_flow->partial_actions_offloaded) { + if (push_tnl_action(pmd, a, packets_)) { + COVERAGE_ADD(datapath_drop_tunnel_push_error, packet_count); + } } return; @@ -7667,9 +7674,10 @@ static void dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, struct dp_packet_batch *packets, bool should_steal, const struct flow *flow, - const struct nlattr *actions, size_t actions_len) + const struct nlattr *actions, size_t actions_len, + const struct dp_netdev_flow *dp_flow) { - struct dp_netdev_execute_aux aux = { pmd, flow }; + struct dp_netdev_execute_aux aux = { pmd, flow, dp_flow }; odp_execute_actions(&aux, packets, should_steal, actions, actions_len, dp_execute_cb); From patchwork Fri Apr 24 08:23:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sriharsha Basavapatna X-Patchwork-Id: 1276270 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=none (p=none dis=none) header.from=openvswitch.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=broadcom.com header.i=@broadcom.com header.a=rsa-sha256 header.s=google header.b=cH2iVKx4; 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 497nyf5f4tz9sSM for ; Fri, 24 Apr 2020 18:53:46 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 2265D88132; Fri, 24 Apr 2020 08:53:29 +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 oGYmt+Igxzyn; Fri, 24 Apr 2020 08:53:28 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 2592588116; Fri, 24 Apr 2020 08:53:28 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id EA0D9C1AE2; Fri, 24 Apr 2020 08:53:27 +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 72FDAC0175 for ; Fri, 24 Apr 2020 08:53:26 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 64A8D2041C for ; Fri, 24 Apr 2020 08:53:26 +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 eB5jxgNPcL30 for ; Fri, 24 Apr 2020 08:53:25 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-lj1-f196.google.com (mail-lj1-f196.google.com [209.85.208.196]) by silver.osuosl.org (Postfix) with ESMTPS id 6C096203E7 for ; Fri, 24 Apr 2020 08:53:25 +0000 (UTC) Received: by mail-lj1-f196.google.com with SMTP id e25so9133192ljg.5 for ; Fri, 24 Apr 2020 01:53:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=avolVHgHoFFfGDX7MDQDkNo/n1ML3OD6QwCrigSeI+g=; b=cH2iVKx4z4s0SnPGp5YkaAWC8NXc5dfuPL2xSaV4nOIpJv0dgBpXVlJxt4jN3/EhIX 1dOo9MR1e/qB2xgXuor/X7Ax0AeVS8mMhVLlAncq7wUH24jkkbRTMLvAh3LSdcCGInzF pSO3xjIcvR9b7GWQ0cn35f3ZDnetoMD9bZY4Q= 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:mime-version:content-transfer-encoding; bh=avolVHgHoFFfGDX7MDQDkNo/n1ML3OD6QwCrigSeI+g=; b=mK4f2RIs+AyAD1uB5fxm+Uu1oXwuRuufTQFc6gi5Ua/9+KweDh9SpRS8eiDQ1AJjKM Msea28f5FqpbEF/O30fkcCc9+S/2vAlxfhPi8Xemld/COnk/I4LV7nC73qz4AQvaecS0 bq3kN6jQ9hi02JIrN5GOuPc83keJegSIWBstU61+Z2nploS0nUjTF8zxE4iXHyCf+hPn ODonrf2mgxnNBRKpkMiXxI07sA8Fl61SDc34x+k/bL99+WxA4zgCJJXs0IoCj1usBiYd Ypc2fzgN3u6h20TdNMEmWMRQCH/k6jjMuQmA5iJmWYa/JYLRQnvRJt8USzM6owuftfUA VsjA== X-Gm-Message-State: AGi0Puan44BVEJM36ZJbQ47kc7BtDW9gK4cuzQ2R/SHk9shItG4Ahm+Z qYy4AjMJkaIy5LSKyoHRyuqbBrcEXqCDs+iqxlZ/8705nUAMy4xY1wx+qf2uyVHPB2KGbPsRwiG WRyIPDW7T+ZfHb6ERoPgUBJaqsP0B125fZQZ0KSdiP2RQdpzwoVaSxE42cJtEcI4j//PAO3Dtbz NrL763 X-Google-Smtp-Source: APiQypKNRlA0ohOK5v8AKZmf4a+GyrDDwEWfnYKO+QzmNMVT1OfOEXd0qck/a8jLyT6XsoYBbmgGRA== X-Received: by 2002:a5d:49cb:: with SMTP id t11mr9591456wrs.91.1587716622060; Fri, 24 Apr 2020 01:23:42 -0700 (PDT) Received: from dhcp-10-123-153-36.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id y5sm7723315wru.15.2020.04.24.01.23.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 01:23:41 -0700 (PDT) To: dev@openvswitch.org Date: Fri, 24 Apr 2020 04:23:13 -0400 Message-Id: <20200424082313.7666-5-sriharsha.basavapatna@broadcom.com> X-Mailer: git-send-email 2.25.0.rc2 In-Reply-To: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> References: <20200424082313.7666-1-sriharsha.basavapatna@broadcom.com> MIME-Version: 1.0 Subject: [ovs-dev] [RFC PATCH 4/4] dpif-netdev: Support flow_get() with partial-action-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: , X-Patchwork-Original-From: Sriharsha Basavapatna via dev From: Sriharsha Basavapatna Reply-To: Sriharsha Basavapatna Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" For flows that offload partial actions in egress direction, provide the right netdev to fetch statistics. Signed-off-by: Sriharsha Basavapatna --- lib/dpif-netdev.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 7fcc0b06d..bfe454eb0 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3199,8 +3199,14 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, return false; } - netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, - dpif_normalize_type(dp->class->type)); + if (netdev_flow->partial_actions_offloaded && + netdev_flow->egress_offload_port != ODPP_NONE) { + netdev = netdev_ports_get(netdev_flow->egress_offload_port, + dpif_normalize_type(dp->class->type)); + } else { + netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, + dpif_normalize_type(dp->class->type)); + } if (!netdev) { return false; }