Commit ff4e233d authored by Nam Cao's avatar Nam Cao Committed by Steven Rostedt (Google)
Browse files

rv: Let the reactors take care of buffers



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: default avatarGabriele Monaco <gmonaco@redhat.com>
Signed-off-by: default avatarNam Cao <namcao@linutronix.de>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 3f045de7
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -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 */
+10 −35
Original line number Diff line number Diff line
@@ -19,45 +19,22 @@
#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)			\
static void cond_react_##name(type curr_state, type event)					\
{												\
	snprintf(REACT_MSG_##name, 1024,							\
		 "rv: monitor %s does not allow event %s on state %s\n",			\
	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));				\
	return REACT_MSG_##name;								\
}												\
												\
static void cond_react_##name(char *msg)							\
{												\
	if (rv_##name.react)									\
		rv_##name.react(msg);								\
}												\
												\
static bool rv_reacting_on_##name(void)								\
{												\
	return rv_reacting_on();								\
}

#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),				\
+6 −2
Original line number Diff line number Diff line
@@ -13,9 +13,13 @@
#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 = {
+6 −2
Original line number Diff line number Diff line
@@ -12,9 +12,13 @@
#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 = {
+1 −1
Original line number Diff line number Diff line
@@ -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, ...)
{
}