mirror of
https://github.com/apache/nuttx.git
synced 2026-05-22 22:20:01 +08:00
sched: add CRITMONITOR time out panic
Signed-off-by: yinshengkai <yinshengkai@xiaomi.com>
This commit is contained in:
@@ -863,6 +863,20 @@ config SCHED_CRITMONITOR_MAXTIME_WDOG
|
||||
|
||||
endif # SCHED_CRITMONITOR
|
||||
|
||||
config SCHED_CRITMONITOR_MAXTIME_PANIC
|
||||
bool "Monitor timeout panic"
|
||||
depends on \
|
||||
SCHED_CRITMONITOR_MAXTIME_THREAD > 0 || \
|
||||
SCHED_CRITMONITOR_MAXTIME_WDOG > 0 || \
|
||||
SCHED_CRITMONITOR_MAXTIME_WQUEUE > 0 || \
|
||||
SCHED_CRITMONITOR_MAXTIME_PREEMPTION > 0 || \
|
||||
SCHED_CRITMONITOR_MAXTIME_CSECTION > 0 || \
|
||||
SCHED_CRITMONITOR_MAXTIME_IRQ > 0
|
||||
default n
|
||||
---help---
|
||||
If this option is enabled, a panic will be triggered when
|
||||
IRQ/WQUEUE/PREEMPTION execution time exceeds SCHED_CRITMONITOR_MAXTIME_xxx
|
||||
|
||||
config SCHED_CPULOAD
|
||||
bool "Enable CPU load monitoring"
|
||||
default n
|
||||
|
||||
@@ -96,8 +96,8 @@
|
||||
if (CONFIG_SCHED_CRITMONITOR_MAXTIME_IRQ > 0 && \
|
||||
elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_IRQ) \
|
||||
{ \
|
||||
serr("IRQ %d(%p), execute time too long %lu\n", \
|
||||
irq, vector, elapsed); \
|
||||
CRITMONITOR_PANIC("IRQ %d(%p), execute time too long %lu\n", \
|
||||
irq, vector, elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -91,6 +91,18 @@
|
||||
# define TLIST_BLOCKED(t) __TLIST_HEAD(t)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCHED_CRITMONITOR_MAXTIME_PANIC
|
||||
# define CRITMONITOR_PANIC(fmt, ...) \
|
||||
do \
|
||||
{ \
|
||||
_alert(fmt, ##__VA_ARGS__); \
|
||||
PANIC(); \
|
||||
} \
|
||||
while(0)
|
||||
#else
|
||||
# define CRITMONITOR_PANIC(fmt, ...) _alert(fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Type Definitions
|
||||
****************************************************************************/
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
if (pid > 0 && \
|
||||
elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_PREEMPTION) \
|
||||
{ \
|
||||
serr("PID %d hold sched lock too long %"PRIu32"\n", \
|
||||
pid, elapsed); \
|
||||
CRITMONITOR_PANIC("PID %d hold sched lock too long %"PRIu32"\n", \
|
||||
pid, elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
@@ -72,8 +72,8 @@
|
||||
if (pid > 0 && \
|
||||
elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_CSECTION) \
|
||||
{ \
|
||||
serr("PID %d hold critical section too long %"PRIu32"\n", \
|
||||
pid, elapsed); \
|
||||
CRITMONITOR_PANIC("PID %d hold critical section too long %" \
|
||||
PRIu32 "\n", pid, elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
@@ -88,8 +88,8 @@
|
||||
if (pid > 0 && \
|
||||
elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_THREAD) \
|
||||
{ \
|
||||
serr("PID %d execute too long %"PRIu32"\n", \
|
||||
pid, elapsed); \
|
||||
CRITMONITOR_PANIC("PID %d execute too long %"PRIu32"\n", \
|
||||
pid, elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -59,8 +59,9 @@
|
||||
elapsed = up_perf_gettime() - start; \
|
||||
if (elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_WDOG) \
|
||||
{ \
|
||||
serr("WDOG %p, %s IRQ, execute too long %lu\n", \
|
||||
func, up_interrupt_context() ? "IN" : "NOT", elapsed); \
|
||||
CRITMONITOR_PANIC("WDOG %p, %s IRQ, execute too long %lu\n", \
|
||||
func, up_interrupt_context() ? \
|
||||
"IN" : "NOT", elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <nuttx/kthread.h>
|
||||
#include <nuttx/semaphore.h>
|
||||
|
||||
#include "sched/sched.h"
|
||||
#include "wqueue/wqueue.h"
|
||||
|
||||
#if defined(CONFIG_SCHED_WORKQUEUE)
|
||||
@@ -61,8 +62,8 @@
|
||||
elapsed = up_perf_gettime() - start; \
|
||||
if (elapsed > CONFIG_SCHED_CRITMONITOR_MAXTIME_WQUEUE) \
|
||||
{ \
|
||||
serr("WORKER %p execute too long %lu\n", \
|
||||
worker, elapsed); \
|
||||
CRITMONITOR_PANIC("WORKER %p execute too long %lu\n", \
|
||||
worker, elapsed); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
Reference in New Issue
Block a user