lkml.org 
[lkml]   [2011]   [Jan]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [RFC][PATCH 14/18] sched: Remove rq->lock from the first half of ttwu()
    From
    Date
    On Tue, 2011-01-04 at 15:59 +0100, Peter Zijlstra wrote:
    > Index: linux-2.6/kernel/sched_fair.c
    > ===================================================================
    > --- linux-2.6.orig/kernel/sched_fair.c
    > +++ linux-2.6/kernel/sched_fair.c
    > @@ -1343,8 +1343,7 @@ static void task_waking_fair(struct task
    > struct sched_entity *se = &p->se;
    > struct cfs_rq *cfs_rq = cfs_rq_of(se);
    >
    > - lockdep_assert_held(&task_rq(p)->lock);
    > -
    > + // XXX racy on 32bit
    > se->vruntime -= cfs_rq->min_vruntime;
    > }


    Best I can come up with is something like this:


    Index: linux-2.6/kernel/sched.c
    ===================================================================
    --- linux-2.6.orig/kernel/sched.c
    +++ linux-2.6/kernel/sched.c
    @@ -315,6 +315,9 @@ struct cfs_rq {

    u64 exec_clock;
    u64 min_vruntime;
    +#ifndef CONFIG_64BIT
    + u64 min_vruntime_copy;
    +#endif

    struct rb_root tasks_timeline;
    struct rb_node *rb_leftmost;
    Index: linux-2.6/kernel/sched_fair.c
    ===================================================================
    --- linux-2.6.orig/kernel/sched_fair.c
    +++ linux-2.6/kernel/sched_fair.c
    @@ -365,6 +365,10 @@ static void update_min_vruntime(struct c
    }

    cfs_rq->min_vruntime = max_vruntime(cfs_rq->min_vruntime, vruntime);
    +#ifndef CONFIG_64BIT
    + smp_wmb();
    + cfs_rq->min_vruntime_copy = cfs_rq->min_vruntime;
    +#endif
    }

    /*
    @@ -1342,9 +1346,21 @@ static void task_waking_fair(struct task
    {
    struct sched_entity *se = &p->se;
    struct cfs_rq *cfs_rq = cfs_rq_of(se);
    + u64 min_vruntime;

    - // XXX racy on 32bit
    - se->vruntime -= cfs_rq->min_vruntime;
    +#ifndef CONFIG_64BIT
    + u64 min_vruntime_copy;
    +
    + do {
    + min_vruntime_copy = cfs_rq->min_vruntime_copy;
    + smp_rmb();
    + min_vruntime = cfs_rq->min_vruntime;
    + } while (min_vruntime != min_vruntime_copy);
    +#else
    + min_vruntime = cfs_rq->min_vruntime;
    +#endif
    +
    + se->vruntime -= min_vruntime;
    }

    #ifdef CONFIG_FAIR_GROUP_SCHED


    \
     
     \ /
      Last update: 2011-01-06 17:31    [W:0.023 / U:0.948 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site