Messages in this thread Patch in this message |  | | Date | Tue, 1 Dec 2020 13:52:53 -0500 | From | Joel Fernandes <> | Subject | Re: [PATCH -tip 22/32] sched: Split the cookie and setup per-task cookie on fork |
| |
On Wed, Nov 25, 2020 at 02:03:22PM +0100, Peter Zijlstra wrote: > On Tue, Nov 17, 2020 at 06:19:52PM -0500, Joel Fernandes (Google) wrote: > > +static bool sched_core_get_task_cookie(unsigned long cookie) > > +{ > > + struct sched_core_cookie *ptr = (struct sched_core_cookie *)cookie; > > + > > + /* > > + * NOTE: sched_core_put() is not done by put_task_cookie(). Instead, it > > + * is done after the stopper runs. > > + */ > > + sched_core_get(); > > + return refcount_inc_not_zero(&ptr->refcnt); > > See below, but afaict this should be refcount_inc().
Fully agreed with all these. Updated with diff as below. Will test further and post next version soon. Thanks!
---8<-----------------------
diff --git a/kernel/sched/coretag.c b/kernel/sched/coretag.c index 2fb5544a4a18..8fce3f4b7cae 100644 --- a/kernel/sched/coretag.c +++ b/kernel/sched/coretag.c @@ -288,12 +288,12 @@ static unsigned long sched_core_alloc_task_cookie(void) return (unsigned long)ck; } -static bool sched_core_get_task_cookie(unsigned long cookie) +static void sched_core_get_task_cookie(unsigned long cookie) { struct sched_core_task_cookie *ptr = (struct sched_core_task_cookie *)cookie; - return refcount_inc_not_zero(&ptr->refcnt); + refcount_inc(&ptr->refcnt); } static void sched_core_put_task_cookie(unsigned long cookie) @@ -392,10 +392,7 @@ int sched_core_share_tasks(struct task_struct *t1, struct task_struct *t2) sched_core_get(); /* For the alloc. */ /* Add another reference for the other task. */ - if (!sched_core_get_task_cookie(cookie)) { - ret = -EINVAL; - goto out_unlock; - } + sched_core_get_task_cookie(cookie); sched_core_get(); /* For the other task. */ wr.tasks[0] = t1; @@ -411,10 +408,7 @@ int sched_core_share_tasks(struct task_struct *t1, struct task_struct *t2) } 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; - } + sched_core_get_task_cookie(t2->core_task_cookie); sched_core_get(); wr.tasks[0] = t1; @@ -422,10 +416,7 @@ int sched_core_share_tasks(struct task_struct *t1, struct task_struct *t2) } else { /* CASE 4. */ - if (!sched_core_get_task_cookie(t2->core_task_cookie)) { - ret = -EINVAL; - goto out_unlock; - } + sched_core_get_task_cookie(t2->core_task_cookie); sched_core_get(); sched_core_put_task_cookie(t1->core_task_cookie); -- 2.29.2.454.gaff20da3a2-goog
|  |