[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-18 Thread Remy Horton

On 11/11/2015 16:28, Stephen Hemminger wrote:
> Also Linux has more robust mechanism in the watchdog timers, why not use that?

Keepalive was made with tight intra-process reporting intervals of 
5-10ms in mind, whereas Linux watchdog appears to be an inter-process 
system that operates with granularity of seconds.


> Could you use RTE_PER_LCORE some how?

Possibly, although not sure what it gains..


>> +struct rte_keepalive *keepcfg = (struct rte_keepalive *)ptr_data;
> Cast of void  * is unnecessary in C.

Old habbits die hard.. :)

v+1 on way.


..Remy


[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-13 Thread Thomas Monjalon
2015-11-05 11:32, Remy Horton:
> --- /dev/null
> +++ b/lib/librte_eal/common/include/rte_keepalive.h

Please add it in doxygen configuration and index.

> --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
> @@ -133,5 +133,9 @@ DPDK_2.2 {
>   global:
>  
>   rte_intr_cap_multiple;
> + rte_keepalive_create;
> + rte_keepalive_dispatch_pings;
> + rte_keepalive_register_core;
> + rte_keepalive_mark_alive;

Please keep alphabetical order.


[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-11 Thread Remy Horton

On 10/11/2015 14:02, Thomas Monjalon wrote:

> Why ptr_timer is unused?

Use as rte_timer callback requires the parameter be present, but 
responsibility for setting this up is delegated to the application.

..Remy


[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-11 Thread Stephen Hemminger

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;
> +}




[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-10 Thread Thomas Monjalon
Hi,

2015-11-05 11:32, Remy Horton:
> +/**
> + * @param *ptr_timer Triggering timer (unused)
> + * @param *ptr_data  Data pointer (keepalive structure)
> + */
> +void rte_keepalive_dispatch_pings(void *ptr_timer, void *ptr_data);

There is no description for this function.
Why ptr_timer is unused?

> +#ifdef KEEPALIVE_DEBUG_MSGS
> +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

This function will never be tested and do not use rte_log.
Please remove it and use the logging functions.



[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-05 Thread Tahhan, Maryam
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Remy Horton
> Sent: Thursday, November 5, 2015 11:33 AM
> To: dev at dpdk.org
> Subject: [dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality
> 
> Adds functions for detecting and reporting the live-ness of LCores, the 
> primary
> requirement of which is minimal overheads for the
> core(s) being checked. Core failures are notified via an application defined
> callback.
> 
> Signed-off-by: Remy Horton 
> ---

Acked-by: Maryam Tahhan 


[dpdk-dev] [PATCH v4 1/3] rte: add keep alive functionality

2015-11-05 Thread Remy Horton
Adds functions for detecting and reporting the live-ness of LCores,
the primary requirement of which is minimal overheads for the
core(s) being checked. Core failures are notified via an application
defined callback.

Signed-off-by: Remy Horton 
---
 lib/librte_eal/bsdapp/eal/Makefile  |   1 +
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |   6 +-
 lib/librte_eal/common/Makefile  |   2 +-
 lib/librte_eal/common/include/rte_keepalive.h   | 146 
 lib/librte_eal/common/rte_keepalive.c   | 124 
 lib/librte_eal/linuxapp/eal/Makefile|   1 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |   6 +-
 7 files changed, 283 insertions(+), 3 deletions(-)
 create mode 100644 lib/librte_eal/common/include/rte_keepalive.h
 create mode 100644 lib/librte_eal/common/rte_keepalive.c

diff --git a/lib/librte_eal/bsdapp/eal/Makefile 
b/lib/librte_eal/bsdapp/eal/Makefile
index a49dcec..65b293f 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -80,6 +80,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_thread.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += rte_malloc.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += malloc_elem.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += malloc_heap.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += rte_keepalive.c

 CFLAGS_eal.o := -D_GNU_SOURCE
 #CFLAGS_eal_thread.o := -D_GNU_SOURCE
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map 
b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index 8b00761..f6c29be 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -130,5 +130,9 @@ DPDK_2.2 {
global:

rte_intr_cap_multiple;
+   rte_keepalive_create;
+   rte_keepalive_dispatch_pings;
+   rte_keepalive_register_core;
+   rte_keepalive_mark_alive;

-} DPDK_2.1;
\ No newline at end of file
+} DPDK_2.1;
diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 0c43d6a..7f1757a 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -40,7 +40,7 @@ INC += rte_string_fns.h rte_version.h
 INC += rte_eal_memconfig.h rte_malloc_heap.h
 INC += rte_hexdump.h rte_devargs.h rte_dev.h
 INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h
-INC += rte_malloc.h
+INC += rte_malloc.h rte_keepalive.h

 ifeq ($(CONFIG_RTE_INSECURE_FUNCTION_WARNING),y)
 INC += rte_warnings.h
diff --git a/lib/librte_eal/common/include/rte_keepalive.h 
b/lib/librte_eal/common/include/rte_keepalive.h
new file mode 100644
index 000..01d4205
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_keepalive.h
@@ -0,0 +1,146 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright 2015 Intel Shannon Ltd. All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @file rte_keepalive.h
+ * DPDK RTE LCore Keepalive Monitor.
+ *
+ **/
+
+#ifndef _KEEPALIVE_H_
+#define _KEEPALIVE_H_
+
+#include 
+
+#ifndef RTE_KEEPALIVE_MAXCORES
+/**
+ * Number of cores to track.
+ * @note Must be larger than the highest core id. */
+#define RTE_KEEPALIVE_MAXCORES RTE_MAX_LCORE
+#endif
+
+
+/**
+ * Keepalive failure callback.
+ *
+ *  Receives a data pointer passed to rte_keepalive_create() and the id of the
+ *  failed core.
+ */
+typedef void (*rte_keepalive_failure_callback_t)(
+   void *data,
+   const int id_core);
+
+
+/**
+ * Keepalive state