RE: [PATCH 24/32] Task fork and exit for rdtgroup

From: Yu, Fenghua
Date: Wed Jul 13 2016 - 13:33:06 EST


On Wed, July 2016, Thomas Gleixner wrote
> On Tue, 12 Jul 2016, Fenghua Yu wrote:
> > +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?

In this situation for a pid:
1.rdtgroup_fork(): rg_list=null.
2.setup_task_rg_lists(): rg_list is setup
3.rdtgroup_fork(): rg_list is not empty

This situation happens only during rscctrl mount time. Before mount, post_fork()
returns from !use_rdtgroup_tasks and doesn't set up rg_list. After mount, rg_list()
is always empty in post_fork(). But we need to check rg_list for above situation.

Does that make sense? Any suggestion for better soluation?

>
> > + 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.

Will do.
>
> Thanks,
>
> tglx

Attachment: IMG_20160712_165549743.jpg
Description: IMG_20160712_165549743.jpg