From patchwork Fri Nov 18 11:21:00 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangchuanlei X-Patchwork-Id: 1705542 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NDDrM08wSz23mH for ; Fri, 18 Nov 2022 22:21:39 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 061DA61058; Fri, 18 Nov 2022 11:21:37 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 061DA61058 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SfoJujBI4Ol4; Fri, 18 Nov 2022 11:21:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id 140E761031; Fri, 18 Nov 2022 11:21:35 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 140E761031 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E0FFCC0032; Fri, 18 Nov 2022 11:21:34 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 3DED1C002D for ; Fri, 18 Nov 2022 11:21:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 185824196E for ; Fri, 18 Nov 2022 11:21:33 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 185824196E X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id r1v1feRoKix4 for ; Fri, 18 Nov 2022 11:21:32 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 9179D41964 Received: from ssh248.corpemail.net (ssh248.corpemail.net [210.51.61.248]) by smtp4.osuosl.org (Postfix) with ESMTPS id 9179D41964 for ; Fri, 18 Nov 2022 11:21:31 +0000 (UTC) Received: from ([60.208.111.195]) by ssh248.corpemail.net ((D)) with ASMTP (SSL) id NOO00001; Fri, 18 Nov 2022 19:21:01 +0800 Received: from localhost.localdomain (10.180.206.146) by jtjnmail201609.home.langchao.com (10.100.2.9) with Microsoft SMTP Server id 15.1.2507.12; Fri, 18 Nov 2022 19:21:02 +0800 From: wangchuanlei To: , Date: Fri, 18 Nov 2022 06:21:00 -0500 Message-ID: <20221118112100.695142-1-wangchuanlei@inspur.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Originating-IP: [10.180.206.146] tUid: 202211181921016889991cad685e1b264183a23e349415 X-Abuse-Reports-To: service@corp-email.com Abuse-Reports-To: service@corp-email.com X-Complaints-To: service@corp-email.com X-Report-Abuse-To: service@corp-email.com Subject: [ovs-dev] [PATCH] [openvswitch v3 2/2] openvswitch: Add support to count upcall packets 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Add support to count upcall packets Signed-off-by: wangchuanlei --- include/linux/openvswitch.h | 19 +++++++++++++++++++ include/openvswitch/netdev.h | 3 +++ lib/dpctl.c | 4 ++++ lib/dpif-netlink.c | 12 ++++++++++++ lib/dpif-netlink.h | 1 + lib/netdev-linux.c | 8 ++++++++ 6 files changed, 47 insertions(+) diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h index 8bb5abdc8..d5e0f3fd9 100644 --- a/include/linux/openvswitch.h +++ b/include/linux/openvswitch.h @@ -141,6 +141,11 @@ struct ovs_vport_stats { __u64 tx_dropped; /* no space available in linux */ }; +struct ovs_vport_upcall_stats { + uint64_t upcall_success; /* total packets upcall succeed */ + uint64_t upcall_fail; /* total packets upcall failed */ +}; + /* Allow last Netlink attribute to be unaligned */ #define OVS_DP_F_UNALIGNED (1 << 0) @@ -301,11 +306,25 @@ enum ovs_vport_attr { OVS_VPORT_ATTR_PAD, OVS_VPORT_ATTR_IFINDEX, OVS_VPORT_ATTR_NETNSID, + OVS_VPORT_ATTR_UPCALL_STATS, __OVS_VPORT_ATTR_MAX }; #define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1) +/** +* enum OVS_VPORT_UPCALL_ATTR -- attributes for %OVS_VPORT_UPCALL* commands +* @OVS_VPORT_UPCALL_SUCCESS: 64-bit upcall success packets. +* @OVS_VPORT_UPCALL_FAIL: 64-bit upcall fail packets. +*/ +enum OVS_VPORT_UPCALL_ATTR { + OVS_VPORT_UPCALL_SUCCESS, + OVS_VPORT_UPCALL_FAIL, + __OVS_VPORT_UPCALL_MAX, +}; + +#define OVS_VPORT_UPCALL_MAX (__OVS_VPORT_UPCALL_MAX - 1) + enum { OVS_VXLAN_EXT_UNSPEC, OVS_VXLAN_EXT_GBP, diff --git a/include/openvswitch/netdev.h b/include/openvswitch/netdev.h index 0c10f7b48..ed1bf73dc 100644 --- a/include/openvswitch/netdev.h +++ b/include/openvswitch/netdev.h @@ -87,6 +87,9 @@ struct netdev_stats { uint64_t rx_oversize_errors; uint64_t rx_fragmented_errors; uint64_t rx_jabber_errors; + + uint64_t tx_upcall_success; + uint64_t tx_upcall_fail; }; /* Structure representation of custom statistics counter */ diff --git a/lib/dpctl.c b/lib/dpctl.c index 29041fa3e..c8b195c89 100644 --- a/lib/dpctl.c +++ b/lib/dpctl.c @@ -744,6 +744,10 @@ show_dpif(struct dpif *dpif, struct dpctl_params *dpctl_p) print_stat(dpctl_p, " collisions:", s.collisions); dpctl_print(dpctl_p, "\n"); + print_stat(dpctl_p, " upcall success:", s.tx_upcall_success); + print_stat(dpctl_p, " upcall fail:", s.tx_upcall_fail); + dpctl_print(dpctl_p, "\n"); + print_stat(dpctl_p, " RX bytes:", s.rx_bytes); print_human_size(dpctl_p, s.rx_bytes); print_stat(dpctl_p, " TX bytes:", s.tx_bytes); diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 026b0daa8..ecc625aac 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -4685,6 +4685,7 @@ dpif_netlink_vport_from_ofpbuf(struct dpif_netlink_vport *vport, .optional = true }, [OVS_VPORT_ATTR_OPTIONS] = { .type = NL_A_NESTED, .optional = true }, [OVS_VPORT_ATTR_NETNSID] = { .type = NL_A_U32, .optional = true }, + [OVS_VPORT_ATTR_UPCALL_STATS] = { .type = NL_A_NESTED, .optional = true }, }; dpif_netlink_vport_init(vport); @@ -4716,6 +4717,17 @@ dpif_netlink_vport_from_ofpbuf(struct dpif_netlink_vport *vport, if (a[OVS_VPORT_ATTR_STATS]) { vport->stats = nl_attr_get(a[OVS_VPORT_ATTR_STATS]); } + if (a[OVS_VPORT_ATTR_UPCALL_STATS]) { + const struct nlattr *nla; + size_t left; + NL_NESTED_FOR_EACH (nla, left, a[OVS_VPORT_ATTR_UPCALL_STATS]) { + if (nl_attr_type(nla) == OVS_VPORT_UPCALL_SUCCESS) { + vport->upcall_stats.upcall_success = nl_attr_get_u64(nla); + } else if (nl_attr_type(nla) == OVS_VPORT_UPCALL_FAIL) { + vport->upcall_stats.upcall_fail = nl_attr_get_u64(nla); + } + } + } if (a[OVS_VPORT_ATTR_OPTIONS]) { vport->options = nl_attr_get(a[OVS_VPORT_ATTR_OPTIONS]); vport->options_len = nl_attr_get_size(a[OVS_VPORT_ATTR_OPTIONS]); diff --git a/lib/dpif-netlink.h b/lib/dpif-netlink.h index 24294bc42..7826e34f5 100644 --- a/lib/dpif-netlink.h +++ b/lib/dpif-netlink.h @@ -44,6 +44,7 @@ struct dpif_netlink_vport { uint32_t n_upcall_pids; const uint32_t *upcall_pids; /* OVS_VPORT_ATTR_UPCALL_PID. */ const struct ovs_vport_stats *stats; /* OVS_VPORT_ATTR_STATS. */ + struct ovs_vport_upcall_stats upcall_stats; /* OVS_VPORT_ATTR_UPCALL_STATS. */ const struct nlattr *options; /* OVS_VPORT_ATTR_OPTIONS. */ size_t options_len; }; diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 59e8dc0ae..d5a953244 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -2181,6 +2181,13 @@ netdev_stats_from_ovs_vport_stats(struct netdev_stats *dst, dst->tx_window_errors = 0; } +static void netdev_stats_from_ovs_vport_upcall_stats(struct netdev_stats *dst, + struct dpif_netlink_vport *vport) +{ + dst->tx_upcall_success = vport->upcall_stats.upcall_success; + dst->tx_upcall_fail = vport->upcall_stats.upcall_fail; +} + static int get_stats_via_vport__(const struct netdev *netdev, struct netdev_stats *stats) { @@ -2197,6 +2204,7 @@ get_stats_via_vport__(const struct netdev *netdev, struct netdev_stats *stats) } netdev_stats_from_ovs_vport_stats(stats, reply.stats); + netdev_stats_from_ovs_vport_upcall_stats(stats, &reply); ofpbuf_delete(buf);