lkml.org 
[lkml]   [2003]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH]O15int for interactivity
    Date
    This patch addresses the problem of tasks that preempt their children when 
    they're forking, wasting cpu cycles until they get demoted to a priority where
    they no longer preempt their child. Although this has been said to be a design
    flaw in the applications, it can cause sustained periods of starvation due to
    this coding problem, and the more I looked, the more examples I found of this
    happening.

    Tasks now cannot preempt their own children. This speeds up the startup of
    child applications (eg pgp signed email).

    This change has allowed tasks to stay at higher priority for much longer so
    the sleep avg decay of high credit tasks has been changed to match the rate of
    rise during periods of sleep (which I wanted to do originally but was limited
    by the first problem). This makes for much more sustained interactivity at
    extreme loads, and much less X jerkiness.

    Con

    Patch against 2.6.0-test3-mm1:

    --- linux-2.6.0-test3-mm1-O14.1/kernel/sched.c 2003-08-12 22:04:13.000000000 +1000
    +++ linux-2.6.0-test3-mm1/kernel/sched.c 2003-08-12 22:03:47.000000000 +1000
    @@ -620,8 +620,13 @@ repeat_lock_task:
    __activate_task(p, rq);
    else {
    activate_task(p, rq);
    - if (TASK_PREEMPTS_CURR(p, rq))
    - resched_task(rq->curr);
    + /*
    + * Parents are not allowed to preempt their
    + * children
    + */
    + if (TASK_PREEMPTS_CURR(p, rq) &&
    + p != rq->curr->parent)
    + resched_task(rq->curr);
    }
    success = 1;
    }
    @@ -1124,7 +1129,7 @@ static inline void pull_task(runqueue_t
    * Note that idle threads have a prio of MAX_PRIO, for this test
    * to be always true for them.
    */
    - if (TASK_PREEMPTS_CURR(p, this_rq))
    + if (TASK_PREEMPTS_CURR(p, this_rq) && p != this_rq->curr->parent)
    set_need_resched();
    }

    @@ -1493,9 +1498,8 @@ need_resched:
    * priority bonus
    */
    if (HIGH_CREDIT(prev))
    - run_time /= (MAX_BONUS + 1 -
    - (NS_TO_JIFFIES(prev->sleep_avg) * MAX_BONUS /
    - MAX_SLEEP_AVG));
    + run_time /= ((NS_TO_JIFFIES(prev->sleep_avg) * MAX_BONUS /
    + MAX_SLEEP_AVG) ? : 1);

    spin_lock_irq(&rq->lock);

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:47    [W:0.022 / U:32.112 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site