[ovs-dev] [PATCH v4 4/7] dpif-netdev: Enable heartbeats for DPDK datapath.
Bhanuprakash Bodireddy
bhanuprakash.bodireddy at intel.com
Tue Aug 22 09:41:06 UTC 2017
This commit adds heartbeat mechanism support for DPDK datapath. Heartbeats
are sent to registered PMD threads at predefined intervals (as set in ovsdb
with 'keepalive-interval').
The heartbeats are only enabled when there is atleast one port added to
the bridge and with active PMD thread polling the port.
Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodireddy at intel.com>
---
lib/dpif-netdev.c | 9 ++++++++-
lib/keepalive.c | 41 +++++++++++++++++++++++++++++++++++++++++
lib/keepalive.h | 1 +
3 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 84c7ffd..67ee424 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -980,11 +980,18 @@ sorted_poll_thread_list(struct dp_netdev *dp,
}
static void *
-ovs_keepalive(void *f_ OVS_UNUSED)
+ovs_keepalive(void *f_)
{
+ struct dp_netdev *dp = f_;
+
pthread_detach(pthread_self());
for (;;) {
+ int n_pmds = cmap_count(&dp->poll_threads) - 1;
+ if (n_pmds > 0) {
+ dispatch_heartbeats();
+ }
+
xusleep(get_ka_interval() * 1000);
}
diff --git a/lib/keepalive.c b/lib/keepalive.c
index dfafaeb..4ee89c0 100644
--- a/lib/keepalive.c
+++ b/lib/keepalive.c
@@ -211,6 +211,47 @@ ka_get_timer_interval(const struct smap *ovs_other_config OVS_UNUSED)
return ka_interval;
}
+/* Dispatch heartbeats. */
+void
+dispatch_heartbeats(void)
+{
+ for (int core_id = 0; core_id < KA_DP_MAXCORES; core_id++) {
+ if (ka_info->active_cores[core_id] == 0) {
+ continue;
+ }
+
+ switch (ka_info->state_flags[core_id]) {
+ case KA_STATE_UNUSED:
+ break;
+ case KA_STATE_ALIVE: /* Alive */
+ ka_info->state_flags[core_id] = KA_STATE_MISSING;
+ ka_info->last_alive[core_id] = time_wall_msec();
+ break;
+ case KA_STATE_MISSING: /* MIA */
+ ka_info->state_flags[core_id] = KA_STATE_DEAD;
+ break;
+ case KA_STATE_DEAD: /* Dead */
+ ka_info->state_flags[core_id] = KA_STATE_GONE;
+ VLOG_DBG("Core %d died. ", core_id);
+ break;
+ case KA_STATE_GONE: /* Buried */
+ break;
+ case KA_STATE_DOZING: /* Core going idle */
+ ka_info->state_flags[core_id] = KA_STATE_SLEEP;
+ ka_info->last_alive[core_id] = time_wall_msec();
+ break;
+ case KA_STATE_SLEEP: /* Idled core */
+ break;
+ }
+
+ if (ka_info->relay_cb) {
+ ka_info->relay_cb(core_id, ka_info->state_flags[core_id],
+ ka_info->last_alive[core_id],
+ ka_info->relay_cb_data);
+ }
+ }
+}
+
/*
* This function shall be invoked periodically to write the core status and
* last seen timestamp of the cores in to keepalive info structure.
diff --git a/lib/keepalive.h b/lib/keepalive.h
index 607ee3b..a344006 100644
--- a/lib/keepalive.h
+++ b/lib/keepalive.h
@@ -101,4 +101,5 @@ int get_ka_init_status(void);
int ka_alloc_portstats(unsigned, int);
void ka_destroy_portstats(void);
+void dispatch_heartbeats(void);
#endif /* keepalive.h */
--
2.4.11
More information about the dev
mailing list