On Fri, Jan 22, 2021 at 08:17:01PM -0500, Joel Fernandes (Google) wrote: > +/* All active sched_core_cookies */ > +static struct rb_root sched_core_cookies = RB_ROOT; > +static DEFINE_RAW_SPINLOCK(sched_core_cookies_lock);
> +/* > + * Returns the following: > + * a < b => -1 > + * a == b => 0 > + * a > b => 1 > + */ > +static int sched_core_cookie_cmp(const struct sched_core_cookie *a, > + const struct sched_core_cookie *b) > +{ > +#define COOKIE_CMP_RETURN(field) do { \ > + if (a->field < b->field) \ > + return -1; \ > + else if (a->field > b->field) \ > + return 1; \ > +} while (0) \ > + > + COOKIE_CMP_RETURN(task_cookie); > + COOKIE_CMP_RETURN(group_cookie); > + > + /* all cookie fields match */ > + return 0; > + > +#undef COOKIE_CMP_RETURN > +} AFAICT all this madness exists because cgroup + task interaction, yet none of that code is actually dependent on cgroups being on. So this seems to implement semantics that will make two tasks that share a cookie, but are then placed in different cgroups not actually share. Is that desired? Can we justify these semantics and the resulting code complexity.