This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 9dabcf9ad2 sched: add CRITMONITOR time out panic
9dabcf9ad2 is described below

commit 9dabcf9ad220e0d73103e4fa904316892c5b9ab3
Author: yinshengkai <yinsheng...@xiaomi.com>
AuthorDate: Fri Apr 7 18:52:57 2023 +0800

    sched: add CRITMONITOR time out panic
    
    Signed-off-by: yinshengkai <yinsheng...@xiaomi.com>
---
 sched/Kconfig                   | 14 ++++++++++++++
 sched/irq/irq_dispatch.c        |  4 ++--
 sched/sched/sched.h             | 12 ++++++++++++
 sched/sched/sched_critmonitor.c | 12 ++++++------
 sched/wdog/wd_start.c           |  5 +++--
 sched/wqueue/kwork_thread.c     |  5 +++--
 6 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/sched/Kconfig b/sched/Kconfig
index b6219795ec..41d3fc5b62 100644
--- a/sched/Kconfig
+++ b/sched/Kconfig
@@ -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
diff --git a/sched/irq/irq_dispatch.c b/sched/irq/irq_dispatch.c
index be9f17607d..7533ce7ad1 100644
--- a/sched/irq/irq_dispatch.c
+++ b/sched/irq/irq_dispatch.c
@@ -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)
diff --git a/sched/sched/sched.h b/sched/sched/sched.h
index 607ab430a8..699a2fc61d 100644
--- a/sched/sched/sched.h
+++ b/sched/sched/sched.h
@@ -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
  ****************************************************************************/
diff --git a/sched/sched/sched_critmonitor.c b/sched/sched/sched_critmonitor.c
index 293e0a4b3e..c4560fd0da 100644
--- a/sched/sched/sched_critmonitor.c
+++ b/sched/sched/sched_critmonitor.c
@@ -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)
diff --git a/sched/wdog/wd_start.c b/sched/wdog/wd_start.c
index a715456fba..a3655d5a22 100644
--- a/sched/wdog/wd_start.c
+++ b/sched/wdog/wd_start.c
@@ -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)
diff --git a/sched/wqueue/kwork_thread.c b/sched/wqueue/kwork_thread.c
index d31792494b..6668c889a6 100644
--- a/sched/wqueue/kwork_thread.c
+++ b/sched/wqueue/kwork_thread.c
@@ -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)

Reply via email to