Introduce helper functions in 'dpdk' module that are needed for keepalive functionality. Also add dummy functions in 'dpdk-stub' module that are needed when DPDK is not available.
Signed-off-by: Bhanuprakash Bodireddy <bhanuprakash.bodire...@intel.com> --- lib/dpdk-stub.c | 30 ++++++++++++++++++ lib/dpdk.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/dpdk.h | 11 ++++++- lib/netdev-dpdk.h | 4 +++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c index daef729..2392273 100644 --- a/lib/dpdk-stub.c +++ b/lib/dpdk-stub.c @@ -48,3 +48,33 @@ dpdk_get_vhost_sock_dir(void) { return NULL; } + +void +dpdk_ka_register_core(unsigned core_id OVS_UNUSED) +{ + /* Nothing */ +} + +void +dpdk_ka_get_tid(unsigned core_idx OVS_UNUSED) +{ + /* Nothing */ +} + +bool +dpdk_is_ka_enabled(void) +{ + return false; +} + +void +ka_mark_core_alive(void) +{ + /* Nothing */ +} + +void +ka_mark_core_sleep(void) +{ + /* Nothing */ +} diff --git a/lib/dpdk.c b/lib/dpdk.c index 8da6c32..d673e48 100644 --- a/lib/dpdk.c +++ b/lib/dpdk.c @@ -15,6 +15,7 @@ */ #include <config.h> +#include <stdbool.h> #include "dpdk.h" #include <stdio.h> @@ -22,6 +23,7 @@ #include <sys/stat.h> #include <getopt.h> +#include <rte_keepalive.h> #include <rte_log.h> #include <rte_memzone.h> #ifdef DPDK_PDUMP @@ -42,6 +44,10 @@ static FILE *log_stream = NULL; /* Stream for DPDK log redirection */ static char *vhost_sock_dir = NULL; /* Location of vhost-user sockets */ +bool keepalive_enable = false; /* KeepAlive disabled by default */ +static uint32_t keepalive_timer_interval; /* keepalive timer interval */ +static const char *keepalive_shm_blk = NULL; + static int process_vhost_flags(char *flag, const char *default_val, int size, const struct smap *ovs_other_config, @@ -67,6 +73,36 @@ process_vhost_flags(char *flag, const char *default_val, int size, return changed; } +/* Retrieve and return the keepalive timer interval from OVSDB. */ +static uint32_t +get_ka_timer_interval(const struct smap *ovs_other_config) +{ +#define OVS_KEEPALIVE_TIMEOUT 100 /* Default timeout set to 100ms */ + uint32_t ka_interval; + + /* Timer granularity in milliseconds + * Defaults to OVS_KEEPALIVE_TIMEOUT(ms) if not set */ + ka_interval = smap_get_int(ovs_other_config, "keepalive-interval", + OVS_KEEPALIVE_TIMEOUT); + + VLOG_INFO("KeepAlive timer interval set to %"PRIu32" (ms)\n", ka_interval); + return ka_interval; +} + +static const char * +get_ka_shm_block(const struct smap *ovs_other_config) +{ +/* Shared mem block. */ +#define OVS_KEEPALIVE_SHM_NAME /dpdk_keepalive_shm_name + keepalive_shm_blk = smap_get(ovs_other_config, "keepalive-shm-name"); + if (!keepalive_shm_blk) { + keepalive_shm_blk = OVS_STRINGIZE(OVS_KEEPALIVE_SHM_NAME); + } + + VLOG_INFO("KeepAlive shared memory block: %s\n", keepalive_shm_blk); + return keepalive_shm_blk; +} + static char ** grow_argv(char ***argv, size_t cur_siz, size_t grow_by) { @@ -432,6 +468,14 @@ dpdk_init__(const struct smap *ovs_other_config) /* We are called from the main thread here */ RTE_PER_LCORE(_lcore_id) = NON_PMD_CORE_ID; + if (smap_get_bool(ovs_other_config, "keepalive", false)) { + keepalive_enable = true; + VLOG_INFO("OvS-DPDK KeepAlive enabled\n"); + + keepalive_timer_interval = get_ka_timer_interval(ovs_other_config); + keepalive_shm_blk = get_ka_shm_block(ovs_other_config); + } + #ifdef DPDK_PDUMP VLOG_INFO("DPDK pdump packet capture enabled"); err = rte_pdump_init(ovs_rundir()); @@ -489,3 +533,51 @@ dpdk_set_lcore_id(unsigned cpu) ovs_assert(cpu != NON_PMD_CORE_ID); RTE_PER_LCORE(_lcore_id) = cpu; } + +/* Return 'true' if KA enabled, otherwise 'false'. */ +inline bool +dpdk_is_ka_enabled(void) +{ + return keepalive_enable; +} + +/* Return the Keepalive timer interval. */ +uint32_t +dpdk_get_ka_interval(void) +{ + return keepalive_timer_interval; +} + +/* Return the Keepalive shared memory block name. */ +const char * +dpdk_get_ka_shm(void) +{ + return keepalive_shm_blk; +} + +/* Register Packet processing core 'core_id' for liveness checks. */ +void +dpdk_ka_register_core(unsigned core_id) +{ + if (dpdk_is_ka_enabled()) { + rte_keepalive_register_core(rte_global_keepalive_info, core_id); + } +} + +/* Mark Packet processing core alive. */ +void +ka_mark_core_alive(void) +{ + if (dpdk_is_ka_enabled()) { + rte_keepalive_mark_alive(rte_global_keepalive_info); + } +} + +/* Mark packet processing core as idle. */ +void +ka_mark_core_sleep(void) +{ + if (dpdk_is_ka_enabled()) { + rte_keepalive_mark_sleep(rte_global_keepalive_info); + } +} diff --git a/lib/dpdk.h b/lib/dpdk.h index 673a1f1..913c9f9 100644 --- a/lib/dpdk.h +++ b/lib/dpdk.h @@ -26,6 +26,9 @@ #else +#include <stdint.h> +#include <stdbool.h> + #define NON_PMD_CORE_ID UINT32_MAX #endif /* DPDK_NETDEV */ @@ -35,5 +38,11 @@ struct smap; void dpdk_init(const struct smap *ovs_other_config); void dpdk_set_lcore_id(unsigned cpu); const char *dpdk_get_vhost_sock_dir(void); - +uint32_t dpdk_get_ka_interval(void); +bool dpdk_is_ka_enabled(void); +void dpdk_ka_register_core(unsigned core_id); +void ka_mark_core_alive(void); +void ka_mark_core_sleep(void); +const char *dpdk_get_ka_shm(void); +void dpdk_ka_get_tid(unsigned core_id); #endif /* dpdk.h */ diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index b7d02a7..fc5bf2a 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -28,6 +28,10 @@ struct dp_packet; void netdev_dpdk_register(void); void free_dpdk_buf(struct dp_packet *); +int keepalive_init(void); +void keepalive_create_thread(void); +void dpdk_ka_get_tid(unsigned); +struct rte_keepalive *rte_global_keepalive_info; #else static inline void -- 2.4.11 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev