[ovs-dev] [RFC PATCH v3 07/18] dpif-netdev: Enable heartbeats for DPDK datapath.
Bhanuprakash Bodireddy
bhanuprakash.bodireddy at intel.com
Sun Jun 18 19:24:20 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/dpdk-stub.c | 6 ++++++
lib/dpdk.c | 7 +++++++
lib/dpdk.h | 2 ++
lib/dpif-netdev.c | 9 ++++++++-
lib/keepalive.c | 9 +++++++++
lib/keepalive.h | 1 +
6 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
index d7fb19b..bf7b891 100644
--- a/lib/dpdk-stub.c
+++ b/lib/dpdk-stub.c
@@ -72,3 +72,9 @@ dpdk_mark_pmd_core_sleep(void)
{
/* Nothing */
}
+
+void
+dpdk_dispatch_pmd_hb(void)
+{
+ /* Nothing */
+}
diff --git a/lib/dpdk.c b/lib/dpdk.c
index 917ef58..231d045 100644
--- a/lib/dpdk.c
+++ b/lib/dpdk.c
@@ -537,3 +537,10 @@ dpdk_mark_pmd_core_sleep(void)
{
rte_keepalive_mark_sleep(rte_global_keepalive_info);
}
+
+/* Dispatch pings */
+void
+dpdk_dispatch_pmd_hb(void)
+{
+ rte_keepalive_dispatch_pings(NULL, rte_global_keepalive_info);
+}
diff --git a/lib/dpdk.h b/lib/dpdk.h
index 177624d..9fb438d 100644
--- a/lib/dpdk.h
+++ b/lib/dpdk.h
@@ -48,4 +48,6 @@ void dpdk_unregister_pmd_core(unsigned core_id);
void dpdk_mark_pmd_core_alive(void);
void dpdk_mark_pmd_core_sleep(void);
+void dpdk_dispatch_pmd_hb(void);
+
#endif /* dpdk.h */
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 4b7c835..cf4d68c 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -972,11 +972,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();
+ }
+
ovsrcu_quiesce_start();
usleep(get_ka_interval() * 1000);
ovsrcu_quiesce_end();
diff --git a/lib/keepalive.c b/lib/keepalive.c
index 64ab117..353f1d1 100644
--- a/lib/keepalive.c
+++ b/lib/keepalive.c
@@ -239,6 +239,15 @@ ka_destroy_portstats(void)
}
}
+/* Dispatch pings */
+void
+dispatch_heartbeats(void)
+{
+#ifdef DPDK_NETDEV
+ dpdk_dispatch_pmd_hb();
+#endif
+}
+
static struct keepalive_info *
keepalive_info_create(void)
{
diff --git a/lib/keepalive.h b/lib/keepalive.h
index f1e232d..cfe02e5 100644
--- a/lib/keepalive.h
+++ b/lib/keepalive.h
@@ -102,4 +102,5 @@ int ka_get_pmd_tid(unsigned core);
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