keepalive: add liveness callback
Adds and documents new callbacks that allow transitions to core states other than dead to be reported to applications. Signed-off-by: Remy Horton <remy.horton@intel.com>
This commit is contained in:
parent
e70a61ad50
commit
90c622f356
@ -70,6 +70,12 @@ New Features
|
||||
* Enable RSS per network interface through the configuration file.
|
||||
* Streamline the CLI code.
|
||||
|
||||
* **Added keepalive enhancements.**
|
||||
|
||||
Adds support for reporting of core states other than dead to
|
||||
monitoring applications, enabling the support of broader liveness
|
||||
reporting to external processes.
|
||||
|
||||
|
||||
Resolved Issues
|
||||
---------------
|
||||
|
@ -1,6 +1,6 @@
|
||||
# BSD LICENSE
|
||||
#
|
||||
# Copyright(c) 2014 6WIND S.A.
|
||||
# Copyright(c) 2016 6WIND S.A.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
|
@ -156,5 +156,6 @@ DPDK_16.07 {
|
||||
global:
|
||||
|
||||
pci_get_sysfs_path;
|
||||
rte_keepalive_register_alive_callback;
|
||||
|
||||
} DPDK_16.04;
|
||||
|
@ -63,11 +63,31 @@ enum rte_keepalive_state {
|
||||
*
|
||||
* Receives a data pointer passed to rte_keepalive_create() and the id of the
|
||||
* failed core.
|
||||
* @param data Data pointer passed to rte_keepalive_create()
|
||||
* @param id_core ID of the core that has failed
|
||||
*/
|
||||
typedef void (*rte_keepalive_failure_callback_t)(
|
||||
void *data,
|
||||
const int id_core);
|
||||
|
||||
/**
|
||||
* Keepalive relay callback.
|
||||
*
|
||||
* Receives a data pointer passed to rte_keepalive_register_relay_callback(),
|
||||
* the id of the core for which state is to be forwarded, and details of the
|
||||
* current core state.
|
||||
* @param data Data pointer passed to rte_keepalive_register_relay_callback()
|
||||
* @param id_core ID of the core for which state is being reported
|
||||
* @param core_state The current state of the core
|
||||
* @param Timestamp of when core was last seen alive
|
||||
*/
|
||||
typedef void (*rte_keepalive_relay_callback_t)(
|
||||
void *data,
|
||||
const int id_core,
|
||||
enum rte_keepalive_state core_state,
|
||||
uint64_t last_seen
|
||||
);
|
||||
|
||||
/**
|
||||
* Keepalive state structure.
|
||||
* @internal
|
||||
@ -115,4 +135,35 @@ void rte_keepalive_register_core(struct rte_keepalive *keepcfg,
|
||||
void
|
||||
rte_keepalive_mark_alive(struct rte_keepalive *keepcfg);
|
||||
|
||||
/**
|
||||
* Per-core sleep-time indication.
|
||||
* @param *keepcfg
|
||||
* Keepalive structure pointer
|
||||
*
|
||||
* If CPU idling is enabled, this function needs to be called from within
|
||||
* the main process loop of the LCore going to sleep, in order to avoid
|
||||
* the LCore being mis-detected as dead.
|
||||
*/
|
||||
void
|
||||
rte_keepalive_mark_sleep(struct rte_keepalive *keepcfg);
|
||||
|
||||
/**
|
||||
* Registers a 'live core' callback.
|
||||
*
|
||||
* The complement of the 'dead core' callback. This is called when a
|
||||
* core is known to be alive, and is intended for cases when an app
|
||||
* needs to know 'liveness' beyond just knowing when a core has died.
|
||||
*
|
||||
* @param *keepcfg
|
||||
* Keepalive structure pointer
|
||||
* @param callback
|
||||
* Function called upon detection of a dead core.
|
||||
* @param data
|
||||
* Data pointer to be passed to function callback.
|
||||
*/
|
||||
void
|
||||
rte_keepalive_register_relay_callback(struct rte_keepalive *keepcfg,
|
||||
rte_keepalive_relay_callback_t callback,
|
||||
void *data);
|
||||
|
||||
#endif /* _KEEPALIVE_H_ */
|
||||
|
@ -64,6 +64,15 @@ struct rte_keepalive {
|
||||
void *callback_data;
|
||||
uint64_t tsc_initial;
|
||||
uint64_t tsc_mhz;
|
||||
|
||||
/** Core state relay handler. */
|
||||
rte_keepalive_relay_callback_t relay_callback;
|
||||
|
||||
/**
|
||||
* Core state relay handler app data.
|
||||
* Pointer is passed to live core handler.
|
||||
*/
|
||||
void *relay_callback_data;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -116,6 +125,13 @@ rte_keepalive_dispatch_pings(__rte_unused void *ptr_timer,
|
||||
case RTE_KA_STATE_SLEEP: /* Idled core */
|
||||
break;
|
||||
}
|
||||
if (keepcfg->relay_callback)
|
||||
keepcfg->relay_callback(
|
||||
keepcfg->relay_callback_data,
|
||||
idx_core,
|
||||
keepcfg->state_flags[idx_core],
|
||||
keepcfg->last_alive[idx_core]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -137,6 +153,14 @@ rte_keepalive_create(rte_keepalive_failure_callback_t callback,
|
||||
return keepcfg;
|
||||
}
|
||||
|
||||
void rte_keepalive_register_relay_callback(struct rte_keepalive *keepcfg,
|
||||
rte_keepalive_relay_callback_t callback,
|
||||
void *data)
|
||||
{
|
||||
keepcfg->relay_callback = callback;
|
||||
keepcfg->relay_callback_data = data;
|
||||
}
|
||||
|
||||
void
|
||||
rte_keepalive_register_core(struct rte_keepalive *keepcfg, const int id_core)
|
||||
{
|
||||
@ -151,3 +175,9 @@ rte_keepalive_mark_alive(struct rte_keepalive *keepcfg)
|
||||
{
|
||||
keepcfg->state_flags[rte_lcore_id()] = RTE_KA_STATE_ALIVE;
|
||||
}
|
||||
|
||||
void
|
||||
rte_keepalive_mark_sleep(struct rte_keepalive *keepcfg)
|
||||
{
|
||||
keepcfg->state_flags[rte_lcore_id()] = RTE_KA_STATE_DOZING;
|
||||
}
|
||||
|
@ -159,5 +159,7 @@ DPDK_16.07 {
|
||||
global:
|
||||
|
||||
pci_get_sysfs_path;
|
||||
rte_keepalive_register_alive_callback;
|
||||
rte_keepalive_register_relay_callback;
|
||||
|
||||
} DPDK_16.04;
|
||||
|
Loading…
Reference in New Issue
Block a user