From patchwork Fri Aug 4 08:08:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Bodireddy, Bhanuprakash" X-Patchwork-Id: 797688 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xP0Qn07D4z9s72 for ; Fri, 4 Aug 2017 18:27:13 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 16320BAD; Fri, 4 Aug 2017 08:17:57 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id C1BD0BBC for ; Fri, 4 Aug 2017 08:17:55 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 3FF8A14D for ; Fri, 4 Aug 2017 08:17:55 +0000 (UTC) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Aug 2017 01:17:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,320,1498546800"; d="scan'208";a="295690667" Received: from silpixa00393942.ir.intel.com (HELO silpixa00393942.ger.corp.intel.com) ([10.237.223.42]) by fmsmga004.fm.intel.com with ESMTP; 04 Aug 2017 01:17:53 -0700 From: Bhanuprakash Bodireddy To: dev@openvswitch.org Date: Fri, 4 Aug 2017 09:08:01 +0100 Message-Id: <1501834086-31829-15-git-send-email-bhanuprakash.bodireddy@intel.com> X-Mailer: git-send-email 2.4.11 In-Reply-To: <1501834086-31829-1-git-send-email-bhanuprakash.bodireddy@intel.com> References: <1501834086-31829-1-git-send-email-bhanuprakash.bodireddy@intel.com> X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH v3 14/19] keepalive: Check the link status as part of PMD health checks. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org This commit adds the initial support in to performing PMD health checks. The ports handled by the PMD threads are checked for the link status and the same is updated in to keepalive info structure. Signed-off-by: Bhanuprakash Bodireddy --- lib/dpif-netdev.c | 37 +++++++++++++++++++++++++++++++++++-- lib/keepalive.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/keepalive.h | 18 +++++++++++++++++- 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index cf955e5..a6edf4d 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -52,6 +52,7 @@ #include "keepalive.h" #include "latch.h" #include "netdev.h" +#include "netdev-provider.h" #include "netdev-vport.h" #include "netlink.h" #include "odp-execute.h" @@ -981,9 +982,41 @@ sorted_poll_thread_list(struct dp_netdev *dp, } static void -pmd_health_check(struct dp_netdev_pmd_thread *pmd OVS_UNUSED) +pmd_health_check(struct dp_netdev_pmd_thread *pmd) { - /* Nothing */ + int port_link_status = 0; + struct rxq_poll *poll; + + struct svec pmd_poll_list; + svec_init(&pmd_poll_list); + HMAP_FOR_EACH (poll, node, &pmd->poll_list) { + svec_add(&pmd_poll_list, netdev_rxq_get_name(poll->rxq->rx)); + } + + /* With MQ enabled, remove the duplicates. */ + svec_sort_unique(&pmd_poll_list); + + const char *port_name; + int i = 0; + SVEC_FOR_EACH (i, port_name, &pmd_poll_list) { + struct netdev *dev = netdev_from_name(port_name); + if (dev) { + char *link_state = netdev_get_carrier(dev) ? "up" : "down"; + ka_info_update_port_status(port_name, 0, link_state, + pmd->core_id, i); + netdev_close(dev); + } + } + svec_destroy(&pmd_poll_list); + + port_link_status = ka_get_polled_ports_status(pmd->core_id); + + int pmd_hc_state = ka_get_pmd_health_check_state(pmd->core_id); + if (PMD_HC_COMPLETE == pmd_hc_state) { + if (port_link_status == ACTIVE_RUN_STATE) { + ka_set_pmd_state_ts(pmd->core_id, KA_STATE_ALIVE, 0); + } + } } static void diff --git a/lib/keepalive.c b/lib/keepalive.c index b4d33cc..c306839 100644 --- a/lib/keepalive.c +++ b/lib/keepalive.c @@ -437,6 +437,58 @@ ka_stats_run(void) return ka_stats; } +enum pmdhealth_status ka_get_polled_ports_status(unsigned core_id) +{ + if (OVS_UNLIKELY(!ka_info)) { + return FAILURE_STATE; + } + + int failed = 0; + int n_ports = ka_info->ext_stats[core_id].num_poll_ports; + for (int i = 0; i < n_ports; i++) { + int state; + state = + ka_info->ext_stats[core_id].port_stats[i].state[PORT_LINK_CHECK]; + if (state == FAILURE_STATE) { + failed = 1; + break; + } + } + + if (!failed) { + return ACTIVE_RUN_STATE; + } else { + return FAILURE_STATE; + } +} + +void +ka_info_update_port_status(const char *port, int qid OVS_UNUSED, + char *link_state, int core_id, int idx) +{ + if (OVS_UNLIKELY(!ka_info)) { + return; + } + + ka_info->ext_stats[core_id].num_poll_ports = idx; + + if (OVS_LIKELY(core_id != NON_PMD_CORE_ID)) { + ka_info->ext_stats[core_id].port_stats[idx].port = port; + ka_info->ext_stats[core_id].port_stats[idx].link_state = + link_state; + } + + int state; + if (!strcmp(link_state, "down")) { + state = FAILURE_STATE; + } else { + state = ACTIVE_RUN_STATE; + } + + ka_info->ext_stats[core_id].port_stats[idx].state[PORT_LINK_CHECK] = + state; +} + static void ka_unixctl_pmd_health_show(struct unixctl_conn *conn, int argc OVS_UNUSED, const char *argv[] OVS_UNUSED, void *ka_info_) diff --git a/lib/keepalive.h b/lib/keepalive.h index 61697b2..ff4aa3c 100644 --- a/lib/keepalive.h +++ b/lib/keepalive.h @@ -47,6 +47,12 @@ enum pmdhealth_check { PMD_HC_COMPLETE }; +enum port_health_check { + PORT_LINK_CHECK = 0, + PORT_STATS_CHECK, + PORT_NUM_CHECKS +}; + struct ka_process_info { char name[16]; int tid; @@ -60,10 +66,12 @@ struct ka_process_info { struct poll_port_stats { const char *port; - int qid; + char *link_state; + int state[PORT_NUM_CHECKS]; }; struct pmd_extended_stats { + char *health_status; struct poll_port_stats *port_stats; int num_poll_ports; }; @@ -92,6 +100,11 @@ enum keepalive_status { ka_init_success }; +enum pmdhealth_status { + FAILURE_STATE = 0, + ACTIVE_RUN_STATE +}; + void ka_init(const struct smap *); void ka_destroy(void); void ka_set_pmd_state_ts(unsigned, enum keepalive_state, uint64_t); @@ -120,4 +133,7 @@ struct smap *ka_stats_run(void); void ka_load_process_list(struct hmap **); void dispatch_heartbeats(void); +void ka_info_update_port_status(const char *,int,char *,int,int); +enum pmdhealth_status ka_get_polled_ports_status(unsigned); + #endif /* keepalive.h */