@@ -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);
}
@@ -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.
@@ -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 */
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@intel.com> --- lib/dpif-netdev.c | 9 ++++++++- lib/keepalive.c | 41 +++++++++++++++++++++++++++++++++++++++++ lib/keepalive.h | 1 + 3 files changed, 50 insertions(+), 1 deletion(-)