In general, try not to introduce new thinks and avoid extra code. Also Linux has more robust mechanism in the watchdog timers, why not use that?
Could you use RTE_PER_LCORE some how? > +#ifdef KEEPALIVE_DEBUG_MSGS Any #ifdef must have a config option to enable it. > +static void > +print_trace(const char *msg, struct rte_keepalive *keepcfg, int idx_core) > +{ > + printf("%sLast seen %" PRId64 "ms ago.\n", > + msg, > + ((rte_rdtsc() - keepcfg->last_alive[idx_core])*1000) > + / rte_get_tsc_hz() > + ); > +} > +#else > +static void > +print_trace(__attribute__((unused)) const char *msg, > + __attribute__((unused)) struct rte_keepalive *keepcfg, > + __attribute__((unused)) int idx_core) > +{ > +} > +#endif Agree with others don't introduce not logging macros. > +void > +rte_keepalive_dispatch_pings(__attribute__((unused)) void *ptr_timer, Use __rte_unused > + void *ptr_data) > +{ > + struct rte_keepalive *keepcfg = (struct rte_keepalive *)ptr_data; Cast of void * is unnecessary in C. > + int idx_core; > + > + for (idx_core = 0; idx_core < RTE_KEEPALIVE_MAXCORES; idx_core++) { > + if (keepcfg->active_cores[idx_core] == 0) > + continue; > + switch (keepcfg->state_flags[idx_core]) { My personal preference, prefer blank line after continue. > + case ALIVE: /* Alive */ > + keepcfg->state_flags[idx_core] = 0; > + keepcfg->last_alive[idx_core] = rte_rdtsc(); > + break; > + case MISSING: /* MIA */ > + print_trace("Core MIA. ", keepcfg, idx_core); > + keepcfg->state_flags[idx_core] = 2; > + break; > + case DEAD: /* Dead */ > + keepcfg->state_flags[idx_core] = 3; > + print_trace("Core died. ", keepcfg, idx_core); > + if (keepcfg->callback) > + keepcfg->callback( > + keepcfg->callback_data, > + idx_core > + ); > + break; > + case GONE: /* Buried */ > + break; > + } > + } > +} > + > + > +struct rte_keepalive * > +rte_keepalive_create(rte_keepalive_failure_callback_t callback, > + void *data) > +{ > + int idx_core; > + struct rte_keepalive *keepcfg; > + > + keepcfg = malloc(sizeof(struct rte_keepalive)); Why not use rte_zmalloc()? > + if (keepcfg != NULL) { > + for (idx_core = 0; > + idx_core < RTE_KEEPALIVE_MAXCORES; > + idx_core++) { > + keepcfg->state_flags[idx_core] = 0; > + keepcfg->active_cores[idx_core] = 0; > + } > + keepcfg->callback = callback; > + keepcfg->callback_data = data; > + keepcfg->tsc_initial = rte_rdtsc(); > + keepcfg->tsc_mhz = rte_get_tsc_hz() / 1000; > + } > + return keepcfg; > +} > + > + > +void > +rte_keepalive_register_core(struct rte_keepalive *keepcfg, const int id_core) > +{ > + if (id_core < RTE_KEEPALIVE_MAXCORES) > + keepcfg->active_cores[id_core] = 1; > +}