Lines Matching +full:name +full:-
1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2019-2022 Red Hat, Inc. Daniel Bristot de Oliveira <bristot@kernel.org>
21 #define DECLARE_RV_REACTING_HELPERS(name, type) \ argument
22 static void cond_react_##name(type curr_state, type event) \
24 if (!rv_reacting_on() || !rv_##name.react) \
26 rv_##name.react("rv: monitor %s does not allow event %s on state %s\n", \
27 #name, \
28 model_get_event_name_##name(event), \
29 model_get_state_name_##name(curr_state)); \
34 #define DECLARE_RV_REACTING_HELPERS(name, type) \ argument
35 static void cond_react_##name(type curr_state, type event) \
44 #define DECLARE_DA_MON_GENERIC_HELPERS(name, type) \ argument
46 DECLARE_RV_REACTING_HELPERS(name, type) \
49 * da_monitor_reset_##name - reset a monitor and setting it to init state \
51 static inline void da_monitor_reset_##name(struct da_monitor *da_mon) \
53 da_mon->monitoring = 0; \
54 da_mon->curr_state = model_get_initial_state_##name(); \
58 * da_monitor_start_##name - start monitoring \
63 static inline void da_monitor_start_##name(struct da_monitor *da_mon) \
65 da_mon->curr_state = model_get_initial_state_##name(); \
66 da_mon->monitoring = 1; \
70 * da_monitoring_##name - returns true if the monitor is processing events \
72 static inline bool da_monitoring_##name(struct da_monitor *da_mon) \
74 return da_mon->monitoring; \
78 * da_monitor_enabled_##name - checks if the monitor is enabled \
80 static inline bool da_monitor_enabled_##name(void) \
87 if (unlikely(!rv_##name.enabled)) \
94 * da_monitor_handling_event_##name - checks if the monitor is ready to handle events \
96 static inline bool da_monitor_handling_event_##name(struct da_monitor *da_mon) \
99 if (!da_monitor_enabled_##name()) \
103 if (unlikely(!da_monitoring_##name(da_mon))) \
118 #define DECLARE_DA_MON_MODEL_HANDLER_IMPLICIT(name, type) \ argument
121 da_event_##name(struct da_monitor *da_mon, enum events_##name event) \
123 enum states_##name curr_state, next_state; \
125 curr_state = READ_ONCE(da_mon->curr_state); \
127 next_state = model_get_next_state_##name(curr_state, event); \
129 cond_react_##name(curr_state, event); \
130 trace_error_##name(model_get_state_name_##name(curr_state), \
131 model_get_event_name_##name(event)); \
134 if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) { \
135 trace_event_##name(model_get_state_name_##name(curr_state), \
136 model_get_event_name_##name(event), \
137 model_get_state_name_##name(next_state), \
138 model_is_final_state_##name(next_state)); \
143 trace_rv_retries_error(#name, model_get_event_name_##name(event)); \
146 model_get_event_name_##name(event), #name); \
157 #define DECLARE_DA_MON_MODEL_HANDLER_PER_TASK(name, type) \ argument
159 static inline bool da_event_##name(struct da_monitor *da_mon, struct task_struct *tsk, \
160 enum events_##name event) \
162 enum states_##name curr_state, next_state; \
164 curr_state = READ_ONCE(da_mon->curr_state); \
166 next_state = model_get_next_state_##name(curr_state, event); \
168 cond_react_##name(curr_state, event); \
169 trace_error_##name(tsk->pid, \
170 model_get_state_name_##name(curr_state), \
171 model_get_event_name_##name(event)); \
174 if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) { \
175 trace_event_##name(tsk->pid, \
176 model_get_state_name_##name(curr_state), \
177 model_get_event_name_##name(event), \
178 model_get_state_name_##name(next_state), \
179 model_is_final_state_##name(next_state)); \
184 trace_rv_retries_error(#name, model_get_event_name_##name(event)); \
187 model_get_event_name_##name(event), #name); \
194 #define DECLARE_DA_MON_INIT_GLOBAL(name, type) \ argument
199 static struct da_monitor da_mon_##name; \
202 * da_get_monitor_##name - return the global monitor address \
204 static struct da_monitor *da_get_monitor_##name(void) \
206 return &da_mon_##name; \
210 * da_monitor_reset_all_##name - reset the single monitor \
212 static void da_monitor_reset_all_##name(void) \
214 da_monitor_reset_##name(da_get_monitor_##name()); \
218 * da_monitor_init_##name - initialize a monitor \
220 static inline int da_monitor_init_##name(void) \
222 da_monitor_reset_all_##name(); \
227 * da_monitor_destroy_##name - destroy the monitor \
229 static inline void da_monitor_destroy_##name(void) \
235 * Functions to define, init and get a per-cpu monitor.
237 #define DECLARE_DA_MON_INIT_PER_CPU(name, type) \ argument
240 * per-cpu monitor variables \
242 static DEFINE_PER_CPU(struct da_monitor, da_mon_##name); \
245 * da_get_monitor_##name - return current CPU monitor address \
247 static struct da_monitor *da_get_monitor_##name(void) \
249 return this_cpu_ptr(&da_mon_##name); \
253 * da_monitor_reset_all_##name - reset all CPUs' monitor \
255 static void da_monitor_reset_all_##name(void) \
260 da_mon = per_cpu_ptr(&da_mon_##name, cpu); \
261 da_monitor_reset_##name(da_mon); \
266 * da_monitor_init_##name - initialize all CPUs' monitor \
268 static inline int da_monitor_init_##name(void) \
270 da_monitor_reset_all_##name(); \
275 * da_monitor_destroy_##name - destroy the monitor \
277 static inline void da_monitor_destroy_##name(void) \
283 * Functions to define, init and get a per-task monitor.
285 #define DECLARE_DA_MON_INIT_PER_TASK(name, type) \ argument
288 * The per-task monitor is stored a vector in the task struct. This variable \
291 static int task_mon_slot_##name = RV_PER_TASK_MONITOR_INIT; \
294 * da_get_monitor_##name - return the monitor in the allocated slot for tsk \
296 static inline struct da_monitor *da_get_monitor_##name(struct task_struct *tsk) \
298 return &tsk->rv[task_mon_slot_##name].da_mon; \
301 static void da_monitor_reset_all_##name(void) \
308 da_monitor_reset_##name(da_get_monitor_##name(p)); \
310 da_monitor_reset_##name(da_get_monitor_##name(idle_task(cpu))); \
315 * da_monitor_init_##name - initialize the per-task monitor \
320 static int da_monitor_init_##name(void) \
328 task_mon_slot_##name = slot; \
330 da_monitor_reset_all_##name(); \
335 * da_monitor_destroy_##name - return the allocated slot \
337 static inline void da_monitor_destroy_##name(void) \
339 if (task_mon_slot_##name == RV_PER_TASK_MONITOR_INIT) { \
340 WARN_ONCE(1, "Disabling a disabled monitor: " #name); \
343 rv_put_task_monitor_slot(task_mon_slot_##name); \
344 task_mon_slot_##name = RV_PER_TASK_MONITOR_INIT; \
349 * Handle event for implicit monitor: da_get_monitor_##name() will figure out
352 #define DECLARE_DA_MON_MONITOR_HANDLER_IMPLICIT(name, type) \ argument
354 static inline void __da_handle_event_##name(struct da_monitor *da_mon, \
355 enum events_##name event) \
359 retval = da_event_##name(da_mon, event); \
361 da_monitor_reset_##name(da_mon); \
365 * da_handle_event_##name - handle an event \
367 static inline void da_handle_event_##name(enum events_##name event) \
369 struct da_monitor *da_mon = da_get_monitor_##name(); \
372 retval = da_monitor_handling_event_##name(da_mon); \
376 __da_handle_event_##name(da_mon, event); \
380 * da_handle_start_event_##name - start monitoring or handle event \
389 static inline bool da_handle_start_event_##name(enum events_##name event) \
393 if (!da_monitor_enabled_##name()) \
396 da_mon = da_get_monitor_##name(); \
398 if (unlikely(!da_monitoring_##name(da_mon))) { \
399 da_monitor_start_##name(da_mon); \
403 __da_handle_event_##name(da_mon, event); \
409 * da_handle_start_run_event_##name - start monitoring and handle event \
414 static inline bool da_handle_start_run_event_##name(enum events_##name event) \
418 if (!da_monitor_enabled_##name()) \
421 da_mon = da_get_monitor_##name(); \
423 if (unlikely(!da_monitoring_##name(da_mon))) \
424 da_monitor_start_##name(da_mon); \
426 __da_handle_event_##name(da_mon, event); \
434 #define DECLARE_DA_MON_MONITOR_HANDLER_PER_TASK(name, type) \ argument
437 __da_handle_event_##name(struct da_monitor *da_mon, struct task_struct *tsk, \
438 enum events_##name event) \
442 retval = da_event_##name(da_mon, tsk, event); \
444 da_monitor_reset_##name(da_mon); \
448 * da_handle_event_##name - handle an event \
451 da_handle_event_##name(struct task_struct *tsk, enum events_##name event) \
453 struct da_monitor *da_mon = da_get_monitor_##name(tsk); \
456 retval = da_monitor_handling_event_##name(da_mon); \
460 __da_handle_event_##name(da_mon, tsk, event); \
464 * da_handle_start_event_##name - start monitoring or handle event \
474 da_handle_start_event_##name(struct task_struct *tsk, enum events_##name event) \
478 if (!da_monitor_enabled_##name()) \
481 da_mon = da_get_monitor_##name(tsk); \
483 if (unlikely(!da_monitoring_##name(da_mon))) { \
484 da_monitor_start_##name(da_mon); \
488 __da_handle_event_##name(da_mon, tsk, event); \
494 * da_handle_start_run_event_##name - start monitoring and handle event \
500 da_handle_start_run_event_##name(struct task_struct *tsk, enum events_##name event) \
504 if (!da_monitor_enabled_##name()) \
507 da_mon = da_get_monitor_##name(tsk); \
509 if (unlikely(!da_monitoring_##name(da_mon))) \
510 da_monitor_start_##name(da_mon); \
512 __da_handle_event_##name(da_mon, tsk, event); \
520 #define DECLARE_DA_MON_GLOBAL(name, type) \ argument
522 DECLARE_AUTOMATA_HELPERS(name, type) \
523 DECLARE_DA_MON_GENERIC_HELPERS(name, type) \
524 DECLARE_DA_MON_MODEL_HANDLER_IMPLICIT(name, type) \
525 DECLARE_DA_MON_INIT_GLOBAL(name, type) \
526 DECLARE_DA_MON_MONITOR_HANDLER_IMPLICIT(name, type)
529 * Entry point for the per-cpu monitor.
531 #define DECLARE_DA_MON_PER_CPU(name, type) \ argument
533 DECLARE_AUTOMATA_HELPERS(name, type) \
534 DECLARE_DA_MON_GENERIC_HELPERS(name, type) \
535 DECLARE_DA_MON_MODEL_HANDLER_IMPLICIT(name, type) \
536 DECLARE_DA_MON_INIT_PER_CPU(name, type) \
537 DECLARE_DA_MON_MONITOR_HANDLER_IMPLICIT(name, type)
540 * Entry point for the per-task monitor.
542 #define DECLARE_DA_MON_PER_TASK(name, type) \ argument
544 DECLARE_AUTOMATA_HELPERS(name, type) \
545 DECLARE_DA_MON_GENERIC_HELPERS(name, type) \
546 DECLARE_DA_MON_MODEL_HANDLER_PER_TASK(name, type) \
547 DECLARE_DA_MON_INIT_PER_TASK(name, type) \
548 DECLARE_DA_MON_MONITOR_HANDLER_PER_TASK(name, type)