From: Jerin Jacob <jerinj@marvell.com>
Introducing oops handling API with following specification
and enable stub implementation for Linux and FreeBSD.
On rte_eal_init() invocation, the EAL library installs the
oops handler for the essential signals.
The rte_oops_signals_enabled() API provides the list
of signals the library installed by the EAL.
The default EAL oops handler decodes the oops message using
rte_oops_decode() and then calls the signal handler
installed by the application before invoking the rte_eal_init().
This scheme will also enable the use of the default coredump
handler(for gdb etc.) provided by OS if the application does
not install any specific signal handler.
The second case where the application installs the signal
handler after the rte_eal_init() invocation, rte_oops_decode()
provides the means of decoding the oops message in
the application's fault handler.
Signed-off-by: Jerin Jacob <jerinj@marvell.com>
---
doc/api/doxy-api-index.md | 3 +-
lib/eal/common/eal_private.h | 3 ++
lib/eal/freebsd/eal.c | 6 +++
lib/eal/include/meson.build | 1 +
lib/eal/include/rte_oops.h | 100 +++++++++++++++++++++++++++++++++++
lib/eal/linux/eal.c | 6 +++
lib/eal/unix/eal_oops.c | 36 +++++++++++++
lib/eal/unix/meson.build | 1 +
lib/eal/version.map | 4 ++
9 files changed, 159 insertions(+), 1 deletion(-)
create mode 100644 lib/eal/include/rte_oops.h
create mode 100644 lib/eal/unix/eal_oops.c
@@ -215,7 +215,8 @@ The public API headers are grouped by topics:
[log] (@ref rte_log.h),
[errno] (@ref rte_errno.h),
[trace] (@ref rte_trace.h),
- [trace_point] (@ref rte_trace_point.h)
+ [trace_point] (@ref rte_trace_point.h),
+ [oops] (@ref rte_oops.h)
- **misc**:
[EAL config] (@ref rte_eal.h),
@@ -716,6 +716,9 @@ void __rte_thread_init(unsigned int lcore_id, rte_cpuset_t *cpuset);
*/
void __rte_thread_uninit(void);
+int eal_oops_init(void);
+void eal_oops_fini(void);
+
/**
* asprintf(3) replacement for Windows.
*/
@@ -692,6 +692,11 @@ rte_eal_init(int argc, char **argv)
return -1;
}
+ if (eal_oops_init()) {
+ rte_eal_init_alert("oops init failed.");
+ rte_errno = ENOENT;
+ }
+
thread_id = pthread_self();
eal_reset_internal_config(internal_conf);
@@ -974,6 +979,7 @@ rte_eal_cleanup(void)
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
+ eal_oops_fini();
return 0;
}
@@ -30,6 +30,7 @@ headers += files(
'rte_malloc.h',
'rte_memory.h',
'rte_memzone.h',
+ 'rte_oops.h',
'rte_pci_dev_feature_defs.h',
'rte_pci_dev_features.h',
'rte_per_lcore.h',
new file mode 100644
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2020 Marvell.
+ */
+
+#ifndef _RTE_OOPS_H_
+#define _RTE_OOPS_H_
+
+#include <rte_common.h>
+#include <rte_compat.h>
+#include <rte_config.h>
+
+/**
+ * @file
+ *
+ * RTE oops API
+ *
+ * This file provides the oops handling APIs to RTE applications.
+ *
+ * On rte_eal_init() invocation, the EAL library installs the oops handler for
+ * the essential signals. The rte_oops_signals_enabled() API provides the list
+ * of signals the library installed by the EAL.
+ *
+ * The default EAL oops handler decodes the oops message using rte_oops_decode()
+ * and then calls the signal handler installed by the application before
+ * invoking the rte_eal_init(). This scheme will also enable the use of
+ * the default coredump handler(for gdb etc.) provided by OS if the application
+ * does not install any specific signal handler.
+ *
+ * The second case where the application installs the signal handler after
+ * the rte_eal_init() invocation, rte_oops_decode() provides the means of
+ * decoding the oops message in the application's fault handler.
+ *
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Maximum number of oops signals enabled in EAL.
+ * @see rte_oops_signals_enabled()
+ */
+#define RTE_OOPS_SIGNALS_MAX 32
+
+/**
+ * Get the list of enabled oops signals installed by EAL.
+ *
+ * @param [out] signals
+ * A pointer to store the enabled signals.
+ * Value NULL is allowed. if not NULL, then the size of this array must be
+ * at least RTE_OOPS_SIGNALS_MAX.
+ *
+ * @return
+ * Number of enabled oops signals.
+ */
+__rte_experimental
+int rte_oops_signals_enabled(int *signals);
+
+#if defined(RTE_EXEC_ENV_LINUX) || defined(RTE_EXEC_ENV_FREEBSD)
+#include <signal.h>
+#include <ucontext.h>
+
+/**
+ * Decode an oops
+ *
+ * This prototype is same as sa_sigaction defined in signal.h.
+ * Application must register signal handler using sigaction() with
+ * sa_flag as SA_SIGINFO flag to get this information from unix OS.
+ *
+ * @param sig
+ * Signal number
+ * @param info
+ * Signal info provided by sa_sigaction. Value NULL is allowed.
+ * @param uc
+ * ucontext_t provided when signal installed with SA_SIGINFO flag.
+ * Value NULL is allowed.
+ *
+ */
+__rte_experimental
+void rte_oops_decode(int sig, siginfo_t *info, ucontext_t *uc);
+#else
+
+/**
+ * Decode an oops
+ *
+ * @param sig
+ * Signal number
+ */
+__rte_experimental
+void rte_oops_decode(int sig);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_OOPS_H_ */
@@ -991,6 +991,11 @@ rte_eal_init(int argc, char **argv)
return -1;
}
+ if (eal_oops_init()) {
+ rte_eal_init_alert("oops init failed.");
+ rte_errno = ENOENT;
+ }
+
p = strrchr(argv[0], '/');
strlcpy(logid, p ? p + 1 : argv[0], sizeof(logid));
thread_id = pthread_self();
@@ -1371,6 +1376,7 @@ rte_eal_cleanup(void)
rte_trace_save();
eal_trace_fini();
eal_cleanup_config(internal_conf);
+ eal_oops_fini();
return 0;
}
new file mode 100644
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+
+#include <rte_oops.h>
+
+#include "eal_private.h"
+
+void
+rte_oops_decode(int sig, siginfo_t *info, ucontext_t *uc)
+{
+ RTE_SET_USED(sig);
+ RTE_SET_USED(info);
+ RTE_SET_USED(uc);
+
+}
+
+int
+rte_oops_signals_enabled(int *signals)
+{
+ RTE_SET_USED(signals);
+
+ return 0;
+}
+
+int
+eal_oops_init(void)
+{
+ return 0;
+}
+
+void
+eal_oops_fini(void)
+{
+}
@@ -6,5 +6,6 @@ sources += files(
'eal_unix_memory.c',
'eal_unix_timer.c',
'eal_firmware.c',
+ 'eal_oops.c',
'rte_thread.c',
)
@@ -426,6 +426,10 @@ EXPERIMENTAL {
# added in 21.08
rte_power_monitor_multi; # WINDOWS_NO_EXPORT
+
+ # added in 21.11
+ rte_oops_signals_enabled; # WINDOWS_NO_EXPORT
+ rte_oops_decode; # WINDOWS_NO_EXPORT
};
INTERNAL {