]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rv: Let the reactors take care of buffers
authorNam Cao <namcao@linutronix.de>
Wed, 9 Jul 2025 19:21:15 +0000 (21:21 +0200)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 9 Jul 2025 19:27:00 +0000 (15:27 -0400)
Each RV monitor has one static buffer to send to the reactors. If multiple
errors are detected simultaneously, the one buffer could be overwritten.

Instead, leave it to the reactors to handle buffering.

Reviewed-by: Gabriele Monaco <gmonaco@redhat.com>
Signed-off-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
include/linux/rv.h
include/rv/da_monitor.h
kernel/trace/rv/reactor_panic.c
kernel/trace/rv/reactor_printk.c
kernel/trace/rv/rv_reactors.c

index 3452b5e4b29e75e34dad9e69a44f00b8b88fb390..9428e62eb8e90ca7e6be529d9a8c3aac08b02306 100644 (file)
@@ -38,7 +38,7 @@ union rv_task_monitor {
 struct rv_reactor {
        const char              *name;
        const char              *description;
-       void                    (*react)(char *msg);
+       __printf(1, 2) void     (*react)(const char *msg, ...);
 };
 #endif
 
@@ -50,7 +50,7 @@ struct rv_monitor {
        void                    (*disable)(void);
        void                    (*reset)(void);
 #ifdef CONFIG_RV_REACTORS
-       void                    (*react)(char *msg);
+       __printf(1, 2) void     (*react)(const char *msg, ...);
 #endif
 };
 
@@ -64,6 +64,11 @@ void rv_put_task_monitor_slot(int slot);
 bool rv_reacting_on(void);
 int rv_unregister_reactor(struct rv_reactor *reactor);
 int rv_register_reactor(struct rv_reactor *reactor);
+#else
+static inline bool rv_reacting_on(void)
+{
+       return false;
+}
 #endif /* CONFIG_RV_REACTORS */
 
 #endif /* CONFIG_RV */
index 510c88bfabd433c3f968c81f50285f529a378056..15f9ed4e4bb694c62dda7c8dabf6141601b615fc 100644 (file)
 #ifdef CONFIG_RV_REACTORS
 
 #define DECLARE_RV_REACTING_HELPERS(name, type)                                                        \
-static char REACT_MSG_##name[1024];                                                            \
-                                                                                               \
-static inline char *format_react_msg_##name(type curr_state, type event)                       \
-{                                                                                              \
-       snprintf(REACT_MSG_##name, 1024,                                                        \
-                "rv: monitor %s does not allow event %s on state %s\n",                        \
-                #name,                                                                         \
-                model_get_event_name_##name(event),                                            \
-                model_get_state_name_##name(curr_state));                                      \
-       return REACT_MSG_##name;                                                                \
-}                                                                                              \
-                                                                                               \
-static void cond_react_##name(char *msg)                                                       \
+static void cond_react_##name(type curr_state, type event)                                     \
 {                                                                                              \
-       if (rv_##name.react)                                                                    \
-               rv_##name.react(msg);                                                           \
-}                                                                                              \
-                                                                                               \
-static bool rv_reacting_on_##name(void)                                                                \
-{                                                                                              \
-       return rv_reacting_on();                                                                \
+       if (!rv_reacting_on() || !rv_##name.react)                                              \
+               return;                                                                         \
+       rv_##name.react("rv: monitor %s does not allow event %s on state %s\n",                 \
+                       #name,                                                                  \
+                       model_get_event_name_##name(event),                                     \
+                       model_get_state_name_##name(curr_state));                               \
 }
 
 #else /* CONFIG_RV_REACTOR */
 
 #define DECLARE_RV_REACTING_HELPERS(name, type)                                                        \
-static inline char *format_react_msg_##name(type curr_state, type event)                       \
-{                                                                                              \
-       return NULL;                                                                            \
-}                                                                                              \
-                                                                                               \
-static void cond_react_##name(char *msg)                                                       \
+static void cond_react_##name(type curr_state, type event)                                     \
 {                                                                                              \
        return;                                                                                 \
-}                                                                                              \
-                                                                                               \
-static bool rv_reacting_on_##name(void)                                                                \
-{                                                                                              \
-       return 0;                                                                               \
 }
 #endif
 
@@ -170,8 +147,7 @@ da_event_##name(struct da_monitor *da_mon, enum events_##name event)                                \
                return true;                                                                    \
        }                                                                                       \
                                                                                                \
-       if (rv_reacting_on_##name())                                                            \
-               cond_react_##name(format_react_msg_##name(curr_state, event));                  \
+       cond_react_##name(curr_state, event);                                                   \
                                                                                                \
        trace_error_##name(model_get_state_name_##name(curr_state),                             \
                           model_get_event_name_##name(event));                                 \
@@ -202,8 +178,7 @@ static inline bool da_event_##name(struct da_monitor *da_mon, struct task_struct
                return true;                                                                    \
        }                                                                                       \
                                                                                                \
-       if (rv_reacting_on_##name())                                                            \
-               cond_react_##name(format_react_msg_##name(curr_state, event));                  \
+       cond_react_##name(curr_state, event);                                                   \
                                                                                                \
        trace_error_##name(tsk->pid,                                                            \
                           model_get_state_name_##name(curr_state),                             \
index 0186ff4cbd0b4233afd886174e0fab1bb9101091..74c6bcc2c7494408770881dda2b0de885c5eb88c 100644 (file)
 #include <linux/init.h>
 #include <linux/rv.h>
 
-static void rv_panic_reaction(char *msg)
+__printf(1, 2) static void rv_panic_reaction(const char *msg, ...)
 {
-       panic(msg);
+       va_list args;
+
+       va_start(args, msg);
+       vpanic(msg, args);
+       va_end(args);
 }
 
 static struct rv_reactor rv_panic = {
index 178759dbf89f5a3d6995e3d3fde917608d775963..2dae2916c05fd17397195e37d9b42d24cea24b9c 100644 (file)
 #include <linux/init.h>
 #include <linux/rv.h>
 
-static void rv_printk_reaction(char *msg)
+__printf(1, 2) static void rv_printk_reaction(const char *msg, ...)
 {
-       printk_deferred(msg);
+       va_list args;
+
+       va_start(args, msg);
+       vprintk_deferred(msg, args);
+       va_end(args);
 }
 
 static struct rv_reactor rv_printk = {
index 9501ca886d8376be666af746aa49e14a73a5bb2c..740603670dd168199cbdf0a578fe607344b53e71 100644 (file)
@@ -490,7 +490,7 @@ void reactor_cleanup_monitor(struct rv_monitor_def *mdef)
 /*
  * Nop reactor register
  */
-static void rv_nop_reaction(char *msg)
+__printf(1, 2) static void rv_nop_reaction(const char *msg, ...)
 {
 }