DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/2] Support EAL debug functions on Windows
@ 2020-06-07  9:35 talshn
  2020-06-07  9:35 ` [dpdk-dev] [PATCH 1/2] eal: move OS common debug functions to single file talshn
  2020-06-07  9:35 ` [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls talshn
  0 siblings, 2 replies; 4+ messages in thread
From: talshn @ 2020-06-07  9:35 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
	ranjit.menon, navasile, harini.ramakrishnan, ocardona,
	bruce.richardson, Tal Shnaiderman

From: Tal Shnaiderman <talshn@mellanox.com>

This patchset adds support for the EAL debug function on Windows
by implementing backtracing in rte_dump_stack and
cleanup calls in rte_eal_cleanup.

Additionally, the functions rte_exit, __rte_panic
and rte_dump_registers were moved to a common file
to avoid code duplication.

Tal Shnaiderman (2):
  eal: move OS common debug functions to single file
  eal/windows: support debug calls

 config/meson.build                       |  1 +
 lib/librte_eal/common/eal_common_debug.c | 56 +++++++++++++++++++++++
 lib/librte_eal/common/meson.build        |  2 +
 lib/librte_eal/freebsd/Makefile          |  1 +
 lib/librte_eal/freebsd/eal_debug.c       | 49 --------------------
 lib/librte_eal/linux/Makefile            |  1 +
 lib/librte_eal/linux/eal_debug.c         | 49 --------------------
 lib/librte_eal/windows/eal.c             |  7 +++
 lib/librte_eal/windows/eal_debug.c       | 77 ++++++++++++++++++++++++++++----
 9 files changed, 136 insertions(+), 107 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_debug.c

-- 
2.16.1.windows.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [PATCH 1/2] eal: move OS common debug functions to single file
  2020-06-07  9:35 [dpdk-dev] [PATCH 0/2] Support EAL debug functions on Windows talshn
@ 2020-06-07  9:35 ` talshn
  2020-06-07  9:35 ` [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls talshn
  1 sibling, 0 replies; 4+ messages in thread
From: talshn @ 2020-06-07  9:35 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
	ranjit.menon, navasile, harini.ramakrishnan, ocardona,
	bruce.richardson, Tal Shnaiderman

From: Tal Shnaiderman <talshn@mellanox.com>

Move common functions between Unix and Windows to eal_common_debug.c.

Those functions are rte_exit, __rte_panic and rte_dump_registers
which has the same implementation on Unix and Windows.

Signed-off-by: Tal Shnaiderman <talshn@mellanox.com>
---
 lib/librte_eal/common/eal_common_debug.c | 56 ++++++++++++++++++++++++++++++++
 lib/librte_eal/common/meson.build        |  1 +
 lib/librte_eal/freebsd/Makefile          |  1 +
 lib/librte_eal/freebsd/eal_debug.c       | 49 ----------------------------
 lib/librte_eal/linux/Makefile            |  1 +
 lib/librte_eal/linux/eal_debug.c         | 49 ----------------------------
 6 files changed, 59 insertions(+), 98 deletions(-)
 create mode 100644 lib/librte_eal/common/eal_common_debug.c

diff --git a/lib/librte_eal/common/eal_common_debug.c b/lib/librte_eal/common/eal_common_debug.c
new file mode 100644
index 0000000000..622d512819
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_debug.c
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Mellanox Technologies, Ltd
+ */
+#include <stdarg.h>
+#include <rte_eal.h>
+#include <rte_log.h>
+#include <rte_debug.h>
+
+/* not implemented */
+void rte_dump_registers(void)
+{
+	return;
+}
+
+/* call abort(), it will generate a coredump if enabled */
+void __rte_panic(const char *funcname, const char *format, ...)
+{
+	va_list ap;
+
+	rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
+	va_start(ap, format);
+	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+	va_end(ap);
+	rte_dump_stack();
+	rte_dump_registers();
+	abort();
+}
+
+/*
+ * Like rte_panic this terminates the application. However, no traceback is
+ * provided and no core-dump is generated.
+ */
+void
+rte_exit(int exit_code, const char *format, ...)
+{
+	va_list ap;
+
+	if (exit_code != 0)
+		RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
+				"  Cause: ", exit_code);
+
+	va_start(ap, format);
+	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+	va_end(ap);
+
+#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
+	if (rte_eal_cleanup() != 0)
+		RTE_LOG(CRIT, EAL,
+			"EAL could not release all resources\n");
+	exit(exit_code);
+#else
+	rte_dump_stack();
+	rte_dump_registers();
+	abort();
+#endif
+}
diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build
index 55aaeb18e1..2bde920597 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -22,6 +22,7 @@ sources += files(
 	'eal_common_bus.c',
 	'eal_common_cpuflags.c',
 	'eal_common_class.c',
+	'eal_common_debug.c',
 	'eal_common_devargs.c',
 	'eal_common_dev.c',
 	'eal_common_errno.c',
diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile
index af95386d48..81fa1f29c6 100644
--- a/lib/librte_eal/freebsd/Makefile
+++ b/lib/librte_eal/freebsd/Makefile
@@ -51,6 +51,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hypervisor.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_string_fns.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_debug.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_class.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_bus.c
diff --git a/lib/librte_eal/freebsd/eal_debug.c b/lib/librte_eal/freebsd/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/freebsd/eal_debug.c
+++ b/lib/librte_eal/freebsd/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
 	free(symb);
 #endif /* RTE_BACKTRACE */
 }
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
-	return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
-	va_list ap;
-
-	rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
-	va_start(ap, format);
-	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
-	va_end(ap);
-	rte_dump_stack();
-	rte_dump_registers();
-	abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
-	va_list ap;
-
-	if (exit_code != 0)
-		RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
-				"  Cause: ", exit_code);
-
-	va_start(ap, format);
-	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
-	va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
-	if (rte_eal_cleanup() != 0)
-		RTE_LOG(CRIT, EAL,
-			"EAL could not release all resources\n");
-	exit(exit_code);
-#else
-	rte_dump_stack();
-	rte_dump_registers();
-	abort();
-#endif
-}
diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile
index 48cc34844a..77da140bee 100644
--- a/lib/librte_eal/linux/Makefile
+++ b/lib/librte_eal/linux/Makefile
@@ -58,6 +58,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_cpuflags.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hypervisor.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_string_fns.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_debug.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_class.c
 SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_bus.c
diff --git a/lib/librte_eal/linux/eal_debug.c b/lib/librte_eal/linux/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/linux/eal_debug.c
+++ b/lib/librte_eal/linux/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
 	free(symb);
 #endif /* RTE_BACKTRACE */
 }
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
-	return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
-	va_list ap;
-
-	rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
-	va_start(ap, format);
-	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
-	va_end(ap);
-	rte_dump_stack();
-	rte_dump_registers();
-	abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
-	va_list ap;
-
-	if (exit_code != 0)
-		RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
-				"  Cause: ", exit_code);
-
-	va_start(ap, format);
-	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
-	va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
-	if (rte_eal_cleanup() != 0)
-		RTE_LOG(CRIT, EAL,
-			"EAL could not release all resources\n");
-	exit(exit_code);
-#else
-	rte_dump_stack();
-	rte_dump_registers();
-	abort();
-#endif
-}
-- 
2.16.1.windows.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls
  2020-06-07  9:35 [dpdk-dev] [PATCH 0/2] Support EAL debug functions on Windows talshn
  2020-06-07  9:35 ` [dpdk-dev] [PATCH 1/2] eal: move OS common debug functions to single file talshn
@ 2020-06-07  9:35 ` talshn
  2020-06-08  0:31   ` Dmitry Kozlyuk
  1 sibling, 1 reply; 4+ messages in thread
From: talshn @ 2020-06-07  9:35 UTC (permalink / raw)
  To: dev
  Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
	ranjit.menon, navasile, harini.ramakrishnan, ocardona,
	bruce.richardson, Tal Shnaiderman

From: Tal Shnaiderman <talshn@mellanox.com>

Support the debug functions in eal_common_debug.c for Windows.

Implementation of rte_dump_stack to get a backtrace similarly to Unix
and of rte_eal_cleanup in eal.c.

Signed-off-by: Tal Shnaiderman <talshn@mellanox.com>
---
 config/meson.build                 |  1 +
 lib/librte_eal/common/meson.build  |  1 +
 lib/librte_eal/windows/eal.c       |  7 ++++
 lib/librte_eal/windows/eal_debug.c | 77 +++++++++++++++++++++++++++++++++-----
 4 files changed, 77 insertions(+), 9 deletions(-)

diff --git a/config/meson.build b/config/meson.build
index 43ab113106..51a953c7d3 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -268,6 +268,7 @@ if is_windows
 	if cc.get_id() == 'gcc'
 		add_project_arguments('-D__USE_MINGW_ANSI_STDIO', language: 'c')
 	endif
+	add_project_link_arguments('-lDbgHelp', language: 'c')
 endif
 
 if get_option('b_lto')
diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build
index 2bde920597..a1c362895b 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -8,6 +8,7 @@ if is_windows
 		'eal_common_bus.c',
 		'eal_common_class.c',
 		'eal_common_devargs.c',
+		'eal_common_debug.c',
 		'eal_common_errno.c',
 		'eal_common_launch.c',
 		'eal_common_lcore.c',
diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c
index d084606a66..7278f2f07c 100644
--- a/lib/librte_eal/windows/eal.c
+++ b/lib/librte_eal/windows/eal.c
@@ -221,6 +221,13 @@ rte_eal_init_alert(const char *msg)
 	RTE_LOG(ERR, EAL, "%s\n", msg);
 }
 
+int
+rte_eal_cleanup(void)
+{
+	eal_cleanup_config(&internal_config);
+	return 0;
+}
+
  /* Launch threads, called at application init(). */
 int
 rte_eal_init(int argc, char **argv)
diff --git a/lib/librte_eal/windows/eal_debug.c b/lib/librte_eal/windows/eal_debug.c
index 669be6ff97..fda217bee4 100644
--- a/lib/librte_eal/windows/eal_debug.c
+++ b/lib/librte_eal/windows/eal_debug.c
@@ -5,16 +5,75 @@
 #include <stdarg.h>
 #include <rte_log.h>
 #include <rte_debug.h>
+#include <rte_windows.h>
 
- /* call abort(), it will generate a coredump if enabled */
-void
-__rte_panic(const char *funcname, const char *format, ...)
+#include <DbgHelp.h>
+
+#define BACKTRACE_SIZE 256
+
+/* dump the stack of the calling core */
+void rte_dump_stack(void)
 {
-	va_list ap;
+	PVOID stack_trace[BACKTRACE_SIZE] = {0};
+	USHORT frame_num;
+	BOOL ret;
+	HANDLE process = GetCurrentProcess();
+
+	ret = SymInitialize(process, NULL, TRUE);
+	if (!ret) {
+		RTE_LOG_WIN32_ERR("SymInitialize()");
+		return;
+	}
+
+	SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);
+
+	frame_num = RtlCaptureStackBackTrace(0, BACKTRACE_SIZE,
+			stack_trace, NULL);
+
+	while (frame_num > 0) {
+		DWORD64 address = (DWORD64)(stack_trace[frame_num - 1]);
+		DWORD64 sym_disp = 0;
+		DWORD error_code = 0, lin_disp;
+		char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
+		PSYMBOL_INFO symbol_info = (PSYMBOL_INFO)buffer;
+		IMAGEHLP_LINE64 line;
+
+		symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO);
+		symbol_info->MaxNameLen = MAX_SYM_NAME;
+		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+
+		ret = SymFromAddr(process, address, &sym_disp, symbol_info);
+		if (!ret) {
+			error_code = GetLastError();
+			if (error_code == ERROR_INVALID_ADDRESS) {
+				/* Missing symbols, print message */
+				rte_log(RTE_LOG_ERR, RTE_LOGTYPE_EAL,
+				    "%d: [<missing_symbols>]\n", frame_num--);
+				continue;
+			} else {
+				RTE_LOG_WIN32_ERR("SymFromAddr()");
+				goto end;
+			}
+		}
+
+		ret = SymGetLineFromAddr64(process, address, &lin_disp, &line);
+		if (!ret) {
+			error_code = GetLastError();
+			/* If ERROR_INVALID_ADDRESS tag unknown and proceed */
+			if (error_code != ERROR_INVALID_ADDRESS) {
+				RTE_LOG_WIN32_ERR("SymGetLineFromAddr64()");
+				goto end;
+			}
+		}
 
-	rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname);
-	va_start(ap, format);
-	rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
-	va_end(ap);
-	abort();
+		rte_log(RTE_LOG_ERR, RTE_LOGTYPE_EAL,
+			"%d: [%s (%s+0x%0llx)[0x%0llX]]\n", frame_num,
+			error_code ? "<unknown>" : line.FileName,
+			symbol_info->Name, sym_disp, symbol_info->Address);
+		frame_num--;
+	}
+end:
+	ret = SymCleanup(process);
+	if (!ret)
+		RTE_LOG_WIN32_ERR("SymCleanup()");
 }
-- 
2.16.1.windows.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls
  2020-06-07  9:35 ` [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls talshn
@ 2020-06-08  0:31   ` Dmitry Kozlyuk
  0 siblings, 0 replies; 4+ messages in thread
From: Dmitry Kozlyuk @ 2020-06-08  0:31 UTC (permalink / raw)
  To: talshn
  Cc: dev, thomas, pallavi.kadam, david.marchand, ranjit.menon,
	navasile, harini.ramakrishnan, ocardona, bruce.richardson

On Sun,  7 Jun 2020 12:35:29 +0300
talshn@mellanox.com wrote:

> From: Tal Shnaiderman <talshn@mellanox.com>
> 
> Support the debug functions in eal_common_debug.c for Windows.
> 
> Implementation of rte_dump_stack to get a backtrace similarly to Unix
> and of rte_eal_cleanup in eal.c.
> 
> Signed-off-by: Tal Shnaiderman <talshn@mellanox.com>
> ---
>  config/meson.build                 |  1 +
>  lib/librte_eal/common/meson.build  |  1 +
>  lib/librte_eal/windows/eal.c       |  7 ++++
>  lib/librte_eal/windows/eal_debug.c | 77 +++++++++++++++++++++++++++++++++-----
>  4 files changed, 77 insertions(+), 9 deletions(-)
> 
> diff --git a/config/meson.build b/config/meson.build
> index 43ab113106..51a953c7d3 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -268,6 +268,7 @@ if is_windows
>  	if cc.get_id() == 'gcc'
>  		add_project_arguments('-D__USE_MINGW_ANSI_STDIO', language: 'c')
>  	endif
> +	add_project_link_arguments('-lDbgHelp', language: 'c')

When cross-compiling with MinGW-w64 from Linux, the library is "dbghelp"
(lowercase), and filesystem is case-sensitive, so this doesn't work. Suggest
using lowercase everywhere.

[snip]
>   /* Launch threads, called at application init(). */
>  int
>  rte_eal_init(int argc, char **argv)
> diff --git a/lib/librte_eal/windows/eal_debug.c b/lib/librte_eal/windows/eal_debug.c
> index 669be6ff97..fda217bee4 100644
> --- a/lib/librte_eal/windows/eal_debug.c
> +++ b/lib/librte_eal/windows/eal_debug.c
> @@ -5,16 +5,75 @@
>  #include <stdarg.h>
>  #include <rte_log.h>
>  #include <rte_debug.h>
> +#include <rte_windows.h>
>  
> - /* call abort(), it will generate a coredump if enabled */
> -void
> -__rte_panic(const char *funcname, const char *format, ...)
> +#include <DbgHelp.h>

Same problem with filename, same solution.

> +
> +#define BACKTRACE_SIZE 256
> +
> +/* dump the stack of the calling core */
> +void rte_dump_stack(void)

Result type should be on its own line. Please re-check the series for this
particular violation, there are a few more instances.

[rest snipped]

-- 
Dmitry Kozlyuk

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-06-08  0:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-07  9:35 [dpdk-dev] [PATCH 0/2] Support EAL debug functions on Windows talshn
2020-06-07  9:35 ` [dpdk-dev] [PATCH 1/2] eal: move OS common debug functions to single file talshn
2020-06-07  9:35 ` [dpdk-dev] [PATCH 2/2] eal/windows: support debug calls talshn
2020-06-08  0:31   ` Dmitry Kozlyuk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).