On Wed, May 19, 2021 at 01:36:25PM +0200, Daniel Bristot de Oliveira wrote: > +struct da_monitor { > + char curr_state; > + bool monitoring; > + void *model; > +}; > + > +#define MAX_PID 1024000 > +/* > + * Functions to define, init and get a per-task monitor. > + * > + * XXX: Make it dynamic? make it part of the task structure? Yes ! I'd start with maybe adding a list_head to da_monitor and embedding a single copy into task_struct and link from there. Yes lists suck, but how many monitors do you realistically expect to run concurrently? > + */ > +#define DECLARE_DA_MON_INIT_PER_TASK(name, type) \ > + \ > +struct da_monitor da_mon_##name[MAX_PID]; \ That's ~16M of memory, which seems somewhat silly. > + \ > +static inline struct da_monitor *da_get_monitor_##name(pid_t pid) \ > +{ \ > + return &da_mon_##name[pid]; \ > +} \ > + \ > +void da_monitor_reset_all_##name(void) \ > +{ \ > + struct da_monitor *mon = da_mon_##name; \ > + int i; \ > + for (i = 0; i < MAX_PID; i++) \ > + da_monitor_reset_##name(&mon[i]); \ > +} \ > + \ > +static void da_monitor_init_##name(void) \ > +{ \ > + struct da_monitor *mon = da_mon_##name; \ > + int i; \ > + \ > + for (i = 0; i < MAX_PID; i++) { \ > + mon[i].curr_state = model_get_init_state_##name(); \ > + mon[i].monitoring = 0; \ > + mon[i].model = model_get_model_##name(); \ > + } \ > +} \