On Tue, 12 Jul 2016, Fenghua Yu wrote: > +void rdtgroup_fork(struct task_struct *child) > +{ > + INIT_LIST_HEAD(&child->rg_list); > + child->rdtgroup = NULL; > +} > + > +void rdtgroup_post_fork(struct task_struct *child) > +{ > + if (!use_rdtgroup_tasks) > + return; > + > + spin_lock_irq(&rdtgroup_task_lock); > + if (list_empty(&child->rg_list)) {
Why would the list be non empty after a fork? > + struct rdtgroup *rdtgrp = current->rdtgroup; > + > + list_add_tail(&child->rg_list, &rdtgrp->pset.tasks); > + child->rdtgroup = rdtgrp; > + atomic_inc(&rdtgrp->pset.refcount); > + } > + spin_unlock_irq(&rdtgroup_task_lock); > +} > diff --git a/kernel/exit.c b/kernel/exit.c > index 9e6e135..04346b6 100644 > --- a/kernel/exit.c > +++ b/kernel/exit.c > @@ -59,6 +59,7 @@ > #include <asm/unistd.h> > #include <asm/pgtable.h> > #include <asm/mmu_context.h> > +#include <asm/intel_rdt.h> > > static void __unhash_process(struct task_struct *p, bool group_dead) > { > @@ -757,6 +758,7 @@ void do_exit(long code) > perf_event_exit_task(tsk); > > cgroup_exit(tsk); > + rdtgroup_exit(tsk); -ENOSUCHFUNCTION Please provide the implementations first and then hook it up not the other way round. Thanks, tglx