lkml.org 
[lkml]   [2020]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [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
    \
     
     \ /
      Last update: 2020-12-01 19:55    [W:4.168 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site