15 Oct, 2007

4 commits

  • mark scheduling classes as const. The speeds up the code
    a bit and shrinks it:

    text data bss dec hex filename
    40027 4018 292 44337 ad31 sched.o.before
    40190 3842 292 44324 ad24 sched.o.after

    Signed-off-by: Ingo Molnar
    Reviewed-by: Thomas Gleixner

    Ingo Molnar
     
  • Revert removal of set_curr_task.
    Use put_prev_task/set_curr_task when changing groups/policies

    Signed-off-by: Srivatsa Vaddagiri < vatsa@linux.vnet.ibm.com>
    Signed-off-by: Dhaval Giani
    Signed-off-by: Ingo Molnar
    Signed-off-by: Peter Zijlstra

    Srivatsa Vaddagiri
     
  • rework enqueue/dequeue_entity() to get rid of
    sched_class::set_curr_task(). This simplifies sched_setscheduler(),
    rt_mutex_setprio() and sched_move_tasks().

    text data bss dec hex filename
    24330 2734 20 27084 69cc sched.o.before
    24233 2730 20 26983 6967 sched.o.after

    Signed-off-by: Dmitry Adamushko
    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar
    Signed-off-by: Peter Zijlstra
    Reviewed-by: Thomas Gleixner

    Dmitry Adamushko
     
  • Add interface to control cpu bandwidth allocation to task-groups.

    (not yet configurable, due to missing CONFIG_CONTAINERS)

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Dhaval Giani
    Signed-off-by: Ingo Molnar
    Signed-off-by: Peter Zijlstra

    Srivatsa Vaddagiri
     

09 Aug, 2007

5 commits

  • remove the 'u64 now' parameter from ->put_prev_task().

    ( identity transformation that causes no change in functionality. )

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • remove the 'u64 now' parameter from ->pick_next_task().

    ( identity transformation that causes no change in functionality. )

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • remove the 'u64 now' parameter from ->dequeue_task().

    ( identity transformation that causes no change in functionality. )

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • There are two problems with balance_tasks() and how it used:

    1. The variables best_prio and best_prio_seen (inherited from the old
    move_tasks()) were only required to handle problems caused by the
    active/expired arrays, the order in which they were processed and the
    possibility that the task with the highest priority could be on either.
    These issues are no longer present and the extra overhead associated
    with their use is unnecessary (and possibly wrong).

    2. In the absence of CONFIG_FAIR_GROUP_SCHED being set, the same
    this_best_prio variable needs to be used by all scheduling classes or
    there is a risk of moving too much load. E.g. if the highest priority
    task on this at the beginning is a fairly low priority task and the rt
    class migrates a task (during its turn) then that moved task becomes the
    new highest priority task on this_rq but when the sched_fair class
    initializes its copy of this_best_prio it will get the priority of the
    original highest priority task as, due to the run queue locks being
    held, the reschedule triggered by pull_task() will not have taken place.
    This could result in inappropriate overriding of skip_for_load and
    excessive load being moved.

    The attached patch addresses these problems by deleting all reference to
    best_prio and best_prio_seen and making this_best_prio a reference
    parameter to the various functions involved.

    load_balance_fair() has also been modified so that this_best_prio is
    only reset (in the loop) if CONFIG_FAIR_GROUP_SCHED is set. This should
    preserve the effect of helping spread groups' higher priority tasks
    around the available CPUs while improving system performance when
    CONFIG_FAIR_GROUP_SCHED isn't set.

    Signed-off-by: Peter Williams
    Signed-off-by: Ingo Molnar

    Peter Williams
     
  • The move_tasks() function is currently multiplexed with two distinct
    capabilities:

    1. attempt to move a specified amount of weighted load from one run
    queue to another; and
    2. attempt to move a specified number of tasks from one run queue to
    another.

    The first of these capabilities is used in two places, load_balance()
    and load_balance_idle(), and in both of these cases the return value of
    move_tasks() is used purely to decide if tasks/load were moved and no
    notice of the actual number of tasks moved is taken.

    The second capability is used in exactly one place,
    active_load_balance(), to attempt to move exactly one task and, as
    before, the return value is only used as an indicator of success or failure.

    This multiplexing of sched_task() was introduced, by me, as part of the
    smpnice patches and was motivated by the fact that the alternative, one
    function to move specified load and one to move a single task, would
    have led to two functions of roughly the same complexity as the old
    move_tasks() (or the new balance_tasks()). However, the new modular
    design of the new CFS scheduler allows a simpler solution to be adopted
    and this patch addresses that solution by:

    1. adding a new function, move_one_task(), to be used by
    active_load_balance(); and
    2. making move_tasks() a single purpose function that tries to move a
    specified weighted load and returns 1 for success and 0 for failure.

    One of the consequences of these changes is that neither move_one_task()
    or the new move_tasks() care how many tasks sched_class.load_balance()
    moves and this enables its interface to be simplified by returning the
    amount of load moved as its result and removing the load_moved pointer
    from the argument list. This helps simplify the new move_tasks() and
    slightly reduces the amount of work done in each of
    sched_class.load_balance()'s implementations.

    Further simplification, e.g. changes to balance_tasks(), are possible
    but (slightly) complicated by the special needs of load_balance_fair()
    so I've left them to a later patch (if this one gets accepted).

    NB Since move_tasks() gets called with two run queue locks held even
    small reductions in overhead are worthwhile.

    [ mingo@elte.hu ]

    this change also reduces code size nicely:

    text data bss dec hex filename
    39216 3618 24 42858 a76a sched.o.before
    39173 3618 24 42815 a73f sched.o.after

    Signed-off-by: Peter Williams
    Signed-off-by: Ingo Molnar

    Peter Williams
     

10 Jul, 2007

1 commit

  • add kernel/sched_idletask.c - which implements the idle thread
    scheduling class. This further simplifies sched.c (under CFS),
    for example a number of 'if (p == rq->idle)' type of special-cases
    can be removed from sched.c, and schedule() gets simpler too.

    Signed-off-by: Ingo Molnar

    Ingo Molnar