Messages in this thread | | | Date | Thu, 5 Nov 2020 09:49:19 -0500 | From | Joel Fernandes <> | Subject | Re: [PATCH v8 -tip 17/26] sched: Split the cookie and setup per-task cookie on fork |
| |
On Wed, Nov 04, 2020 at 05:30:24PM -0500, chris hyser wrote: [..] > + wr.cookies[0] = cookie; > > + } else > > + /* > > + * t1 joining t2 > > + * CASE 1: > > + * before 0 0 > > + * after new cookie new cookie > > + * > > + * CASE 2: > > + * before X (non-zero) 0 > > + * after 0 0 > > + * > > + * CASE 3: > > + * before 0 X (non-zero) > > + * after X X > > + * > > + * CASE 4: > > + * before Y (non-zero) X (non-zero) > > + * after X X > > + */ > > + if (!t1->core_task_cookie && !t2->core_task_cookie) { > > + /* CASE 1. */ > > + cookie = sched_core_alloc_task_cookie(); > > + if (!cookie) > > + goto out_unlock; > > + > > + /* Add another reference for the other task. */ > > + if (!sched_core_get_task_cookie(cookie)) { > > + return -EINVAL; > > should be: ret = -EINVAL;
Fixed now, thanks.
thanks,
- Joel
> > > + goto out_unlock; > > + } > > + > > + wr.tasks[0] = t1; > > + wr.tasks[1] = t2; > > + wr.cookies[0] = wr.cookies[1] = cookie; > > + > > + } else if (t1->core_task_cookie && !t2->core_task_cookie) { > > + /* CASE 2. */ > > + sched_core_put_task_cookie(t1->core_task_cookie); > > + sched_core_put_after_stopper = true; > > + > > + wr.tasks[0] = t1; /* Reset cookie for t1. */ > > + > > + } else if (!t1->core_task_cookie && t2->core_task_cookie) { > > + /* CASE 3. */ > > + if (!sched_core_get_task_cookie(t2->core_task_cookie)) { > > + ret = -EINVAL; > > + goto out_unlock; > > + } > > + > > + wr.tasks[0] = t1; > > + wr.cookies[0] = t2->core_task_cookie; > > + > > + } else { > > + /* CASE 4. */ > > + if (!sched_core_get_task_cookie(t2->core_task_cookie)) { > > + ret = -EINVAL; > > + goto out_unlock; > > + } > > + sched_core_put_task_cookie(t1->core_task_cookie); > > + sched_core_put_after_stopper = true; > > + > > + wr.tasks[0] = t1; > > + wr.cookies[0] = t2->core_task_cookie; > > + } > > + > > + stop_machine(sched_core_task_join_stopper, (void *)&wr, NULL); > > + > > + if (sched_core_put_after_stopper) > > + sched_core_put(); > > + > > + ret = 0; > > +out_unlock: > > + mutex_unlock(&sched_core_mutex); > > + return ret; > > +} > > + > > +/* CGroup interface */ > > static u64 cpu_core_tag_read_u64(struct cgroup_subsys_state *css, struct cftype *cft) > > { > > struct task_group *tg = css_tg(css); > > @@ -9207,18 +9435,9 @@ static int __sched_write_tag(void *data) > > * when we set cgroup tag to 0 when the loop is done below. > > */ > > while ((p = css_task_iter_next(&it))) { > > - p->core_cookie = !!val ? (unsigned long)tg : 0UL; > > - > > - if (sched_core_enqueued(p)) { > > - sched_core_dequeue(task_rq(p), p); > > - if (!p->core_cookie) > > - continue; > > - } > > - > > - if (sched_core_enabled(task_rq(p)) && > > - p->core_cookie && task_on_rq_queued(p)) > > - sched_core_enqueue(task_rq(p), p); > > + unsigned long cookie = !!val ? (unsigned long)tg : 0UL; > > + sched_core_tag_requeue(p, cookie, true /* group */); > > } > > css_task_iter_end(&it); > > diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c > > index c8fee8d9dfd4..88bf45267672 100644 > > --- a/kernel/sched/debug.c > > +++ b/kernel/sched/debug.c > > @@ -1024,6 +1024,10 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, > > __PS("clock-delta", t1-t0); > > } > > +#ifdef CONFIG_SCHED_CORE > > + __PS("core_cookie", p->core_cookie); > > +#endif > > + > > sched_show_numa(p, m); > > } > > > > -chrish
| |