01 Feb, 2008

2 commits

  • * 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc: (22 commits)
    Remove commented-out code copied from NFS
    NFS: Switch from intr mount option to TASK_KILLABLE
    Add wait_for_completion_killable
    Add wait_event_killable
    Add schedule_timeout_killable
    Use mutex_lock_killable in vfs_readdir
    Add mutex_lock_killable
    Use lock_page_killable
    Add lock_page_killable
    Add fatal_signal_pending
    Add TASK_WAKEKILL
    exit: Use task_is_*
    signal: Use task_is_*
    sched: Use task_contributes_to_load, TASK_ALL and TASK_NORMAL
    ptrace: Use task_is_*
    power: Use task_is_*
    wait: Use TASK_NORMAL
    proc/base.c: Use task_is_*
    proc/array.c: Use TASK_REPORT
    perfmon: Use task_is_*
    ...

    Fixed up conflicts in NFS/sunrpc manually..

    Linus Torvalds
     
  • This removes the extra struct task_struct *p parameter in inc_nr_running
    and dec_nr_running functions.

    Signed-off by: Jerry Stralko
    Signed-off-by: Ingo Molnar

    Gerald Stralko
     

30 Jan, 2008

1 commit

  • The break_lock data structure and code for spinlocks is quite nasty.
    Not only does it double the size of a spinlock but it changes locking to
    a potentially less optimal trylock.

    Put all of that under CONFIG_GENERIC_LOCKBREAK, and introduce a
    __raw_spin_is_contended that uses the lock data itself to determine whether
    there are waiters on the lock, to be used if CONFIG_GENERIC_LOCKBREAK is
    not set.

    Rename need_lockbreak to spin_needbreak, make it use spin_is_contended to
    decouple it from the spinlock implementation, and make it typesafe (rwlocks
    do not have any need_lockbreak sites -- why do they even get bloated up
    with that break_lock then?).

    Signed-off-by: Nick Piggin
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Nick Piggin
     

26 Jan, 2008

37 commits

  • The attached patch is something really simple that can sometimes help
    in getting more info out of a hung system.

    Signed-off-by: Ingo Molnar

    Nick Piggin
     
  • We monitor clock overflows, let's also monitor clock underflows.

    Signed-off-by: Guillaume Chazarain
    Signed-off-by: Ingo Molnar

    Guillaume Chazarain
     
  • sched: fix rq->clock warps on frequency changes

    Fix 2bacec8c318ca0418c0ee9ac662ee44207765dd4
    (sched: touch softlockup watchdog after idling) that reintroduced warps
    on frequency changes. touch_softlockup_watchdog() calls __update_rq_clock
    that checks rq->clock for warps, so call it after adjusting rq->clock.

    Signed-off-by: Guillaume Chazarain
    Signed-off-by: Ingo Molnar

    Guillaume Chazarain
     
  • remove the !PREEMPT_BKL code.

    this removes 160 lines of legacy code.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • We need to teach no_hz about the rt throttling because its tick driven.

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

    Peter Zijlstra
     
  • Extend group scheduling to also cover the realtime classes. It uses the time
    limiting introduced by the previous patch to allow multiple realtime groups.

    The hard time limit is required to keep behaviour deterministic.

    The algorithms used make the realtime scheduler O(tg), linear scaling wrt the
    number of task groups. This is the worst case behaviour I can't seem to get out
    of, the avg. case of the algorithms can be improved, I focused on correctness
    and worst case.

    [ akpm@linux-foundation.org: move side-effects out of BUG_ON(). ]

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

    Peter Zijlstra
     
  • Very simple time limit on the realtime scheduling classes.
    Allow the rq's realtime class to consume sched_rt_ratio of every
    sched_rt_period slice. If the class exceeds this quota the fair class
    will preempt the realtime class.

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

    Peter Zijlstra
     
  • Use HR-timers (when available) to deliver an accurate preemption tick.

    The regular scheduler tick that runs at 1/HZ can be too coarse when nice
    level are used. The fairness system will still keep the cpu utilisation 'fair'
    by then delaying the task that got an excessive amount of CPU time but try to
    minimize this by delivering preemption points spot-on.

    The average frequency of this extra interrupt is sched_latency / nr_latency.
    Which need not be higher than 1/HZ, its just that the distribution within the
    sched_latency period is important.

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

    Peter Zijlstra
     
  • Why do we even have cond_resched when real preemption
    is on? It seems to be a waste of space and time.

    remove cond_resched with CONFIG_PREEMPT on.

    Signed-off-by: Ingo Molnar

    Herbert Xu
     
  • whitespace fixes.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Move the task_struct members specific to rt scheduling together.
    A future optimization could be to put sched_entity and sched_rt_entity
    into a union.

    Signed-off-by: Peter Zijlstra
    CC: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • The baseline code statically builds the span maps when the domain is formed.
    Previous attempts at dynamically updating the maps caused a suspend-to-ram
    regression, which should now be fixed.

    Signed-off-by: Gregory Haskins
    CC: Gautham R Shenoy
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • Dmitry Adamushko found that the current implementation of the RT
    balancing code left out changes to the sched_setscheduler and
    rt_mutex_setprio.

    This patch addresses this issue by adding methods to the schedule classes
    to handle being switched out of (switched_from) and being switched into
    (switched_to) a sched_class. Also a method for changing of priorities
    is also added (prio_changed).

    This patch also removes some duplicate logic between rt_mutex_setprio and
    sched_setscheduler.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • To make the main sched.c code more agnostic to the schedule classes.
    Instead of having specific hooks in the schedule code for the RT class
    balancing. They are replaced with a pre_schedule, post_schedule
    and task_wake_up methods. These methods may be used by any of the classes
    but currently, only the sched_rt class implements them.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • Clean-up try_to_wake_up().

    Get rid of the 'new_cpu' variable in try_to_wake_up() [ that's, one
    #ifdef section less ]. Also remove a few redundant blank lines.

    Signed-off-by: Dmitry Adamushko
    Signed-off-by: Ingo Molnar

    Dmitry Adamushko
     
  • add credits for RT balancing improvements.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • style cleanup of various changes that were done recently.

    no code changed:

    text data bss dec hex filename
    26399 2578 48 29025 7161 sched.o.before
    26399 2578 48 29025 7161 sched.o.after

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • remove unused JIFFIES_TO_NS() macro.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • We move the rt-overload data as the first global to per-domain
    reclassification. This limits the scope of overload related cache-line
    bouncing to stay with a specified partition instead of affecting all
    cpus in the system.

    Finally, we limit the scope of find_lowest_cpu searches to the domain
    instead of the entire system. Note that we would always respect domain
    boundaries even without this patch, but we first would scan potentially
    all cpus before whittling the list down. Now we can avoid looking at
    RQs that are out of scope, again reducing cache-line hits.

    Note: In some cases, task->cpus_allowed will effectively reduce our search
    to within our domain. However, I believe there are cases where the
    cpus_allowed mask may be all ones and therefore we err on the side of
    caution. If it can be optimized later, so be it.

    Signed-off-by: Gregory Haskins
    CC: Christoph Lameter
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • We add the notion of a root-domain which will be used later to rescope
    global variables to per-domain variables. Each exclusive cpuset
    essentially defines an island domain by fully partitioning the member cpus
    from any other cpuset. However, we currently still maintain some
    policy/state as global variables which transcend all cpusets. Consider,
    for instance, rt-overload state.

    Whenever a new exclusive cpuset is created, we also create a new
    root-domain object and move each cpu member to the root-domain's span.
    By default the system creates a single root-domain with all cpus as
    members (mimicking the global state we have today).

    We add some plumbing for storing class specific data in our root-domain.
    Whenever a RQ is switching root-domains (because of repartitioning) we
    give each sched_class the opportunity to remove any state from its old
    domain and add state to the new one. This logic doesn't have any clients
    yet but it will later in the series.

    Signed-off-by: Gregory Haskins
    CC: Christoph Lameter
    CC: Paul Jackson
    CC: Simon Derr
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • rt-balance when creating new tasks.

    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • We have logic to detect whether the system has migratable tasks, but we are
    not using it when deciding whether to push tasks away. So we add support
    for considering this new information.

    Signed-off-by: Gregory Haskins
    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • The current wake-up code path tries to determine if it can optimize the
    wake-up to "this_cpu" by computing load calculations. The problem is that
    these calculations are only relevant to SCHED_OTHER tasks where load is king.
    For RT tasks, priority is king. So the load calculation is completely wasted
    bandwidth.

    Therefore, we create a new sched_class interface to help with
    pre-wakeup routing decisions and move the load calculation as a function
    of CFS task's class.

    Signed-off-by: Gregory Haskins
    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • Some RT tasks (particularly kthreads) are bound to one specific CPU.
    It is fairly common for two or more bound tasks to get queued up at the
    same time. Consider, for instance, softirq_timer and softirq_sched. A
    timer goes off in an ISR which schedules softirq_thread to run at RT50.
    Then the timer handler determines that it's time to smp-rebalance the
    system so it schedules softirq_sched to run. So we are in a situation
    where we have two RT50 tasks queued, and the system will go into
    rt-overload condition to request other CPUs for help.

    This causes two problems in the current code:

    1) If a high-priority bound task and a low-priority unbounded task queue
    up behind the running task, we will fail to ever relocate the unbounded
    task because we terminate the search on the first unmovable task.

    2) We spend precious futile cycles in the fast-path trying to pull
    overloaded tasks over. It is therefore optimial to strive to avoid the
    overhead all together if we can cheaply detect the condition before
    overload even occurs.

    This patch tries to achieve this optimization by utilizing the hamming
    weight of the task->cpus_allowed mask. A weight of 1 indicates that
    the task cannot be migrated. We will then utilize this information to
    skip non-migratable tasks and to eliminate uncessary rebalance attempts.

    We introduce a per-rq variable to count the number of migratable tasks
    that are currently running. We only go into overload if we have more
    than one rt task, AND at least one of them is migratable.

    In addition, we introduce a per-task variable to cache the cpus_allowed
    weight, since the hamming calculation is probably relatively expensive.
    We only update the cached value when the mask is updated which should be
    relatively infrequent, especially compared to scheduling frequency
    in the fast path.

    Signed-off-by: Gregory Haskins
    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Gregory Haskins
     
  • This patch adds pushing of overloaded RT tasks from a runqueue that is
    having tasks (most likely RT tasks) added to the run queue.

    TODO: We don't cover the case of waking of new RT tasks (yet).

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • This patch adds the algorithm to pull tasks from RT overloaded runqueues.

    When a pull RT is initiated, all overloaded runqueues are examined for
    a RT task that is higher in prio than the highest prio task queued on the
    target runqueue. If another runqueue holds a RT task that is of higher
    prio than the highest prio task on the target runqueue is found it is pulled
    to the target runqueue.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • This patch adds an algorithm to push extra RT tasks off a run queue to
    other CPU runqueues.

    When more than one RT task is added to a run queue, this algorithm takes
    an assertive approach to push the RT tasks that are not running onto other
    run queues that have lower priority. The way this works is that the highest
    RT task that is not running is looked at and we examine the runqueues on
    the CPUS for that tasks affinity mask. We find the runqueue with the lowest
    prio in the CPU affinity of the picked task, and if it is lower in prio than
    the picked task, we push the task onto that CPU runqueue.

    We continue pushing RT tasks off the current runqueue until we don't push any
    more. The algorithm stops when the next highest RT task can't preempt any
    other processes on other CPUS.

    TODO: The algorithm may stop when there are still RT tasks that can be
    migrated. Specifically, if the highest non running RT task CPU affinity
    is restricted to CPUs that are running higher priority tasks, there may
    be a lower priority task queued that has an affinity with a CPU that is
    running a lower priority task that it could be migrated to. This
    patch set does not address this issue.

    Note: checkpatch reveals two over 80 character instances. I'm not sure
    that breaking them up will help visually, so I left them as is.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • This patch adds accounting to each runqueue to keep track of the
    highest prio task queued on the run queue. We only care about
    RT tasks, so if the run queue does not contain any active RT tasks
    its priority will be considered MAX_RT_PRIO.

    This information will be used for later patches.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • This patch adds accounting to keep track of the number of RT tasks running
    on a runqueue. This information will be used in later patches.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     
  • this patch extends the soft-lockup detector to automatically
    detect hung TASK_UNINTERRUPTIBLE tasks. Such hung tasks are
    printed the following way:

    ------------------>
    INFO: task prctl:3042 blocked for more than 120 seconds.
    "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message
    prctl D fd5e3793 0 3042 2997
    f6050f38 00000046 00000001 fd5e3793 00000009 c06d8264 c06dae80 00000286
    f6050f40 f6050f00 f7d34d90 f7d34fc8 c1e1be80 00000001 f6050000 00000000
    f7e92d00 00000286 f6050f18 c0489d1a f6050f40 00006605 00000000 c0133a5b
    Call Trace:
    [] schedule_timeout+0x6d/0x8b
    [] schedule_timeout_uninterruptible+0x15/0x17
    [] msleep+0x10/0x16
    [] sys_prctl+0x30/0x1e2
    [] sysenter_past_esp+0x5f/0xa5
    =======================
    2 locks held by prctl/3042:
    #0: (&sb->s_type->i_mutex_key#5){--..}, at: [] do_fsync+0x38/0x7a
    #1: (jbd_handle){--..}, at: [] journal_start+0xc7/0xe9
    : CPU hotplug fixes. ]
    [ Andrew Morton : build warning fix. ]

    Signed-off-by: Ingo Molnar
    Signed-off-by: Arjan van de Ven

    Ingo Molnar
     
  • This patch converts the known per-subsystem mutexes to get_online_cpus
    put_online_cpus. It also eliminates the CPU_LOCK_ACQUIRE and
    CPU_LOCK_RELEASE hotplug notification events.

    Signed-off-by: Gautham R Shenoy
    Signed-off-by: Ingo Molnar

    Gautham R Shenoy
     
  • Replace all lock_cpu_hotplug/unlock_cpu_hotplug from the kernel and use
    get_online_cpus and put_online_cpus instead as it highlights the
    refcount semantics in these operations.

    The new API guarantees protection against the cpu-hotplug operation, but
    it doesn't guarantee serialized access to any of the local data
    structures. Hence the changes needs to be reviewed.

    In case of pseries_add_processor/pseries_remove_processor, use
    cpu_maps_update_begin()/cpu_maps_update_done() as we're modifying the
    cpu_present_map there.

    Signed-off-by: Gautham R Shenoy
    Signed-off-by: Ingo Molnar

    Gautham R Shenoy
     
  • The current load balancing scheme isn't good enough for precise
    group fairness.

    For example: on a 8-cpu system, I created 3 groups as under:

    a = 8 tasks (cpu.shares = 1024)
    b = 4 tasks (cpu.shares = 1024)
    c = 3 tasks (cpu.shares = 1024)

    a, b and c are task groups that have equal weight. We would expect each
    of the groups to receive 33.33% of cpu bandwidth under a fair scheduler.

    This is what I get with the latest scheduler git tree:

    Signed-off-by: Ingo Molnar
    --------------------------------------------------------------------------------
    Col1 | Col2 | Col3 | Col4
    ------|---------|-------|-------------------------------------------------------
    a | 277.676 | 57.8% | 54.1% 54.1% 54.1% 54.2% 56.7% 62.2% 62.8% 64.5%
    b | 116.108 | 24.2% | 47.4% 48.1% 48.7% 49.3%
    c | 86.326 | 18.0% | 47.5% 47.9% 48.5%
    --------------------------------------------------------------------------------

    Explanation of o/p:

    Col1 -> Group name
    Col2 -> Cumulative execution time (in seconds) received by all tasks of that
    group in a 60sec window across 8 cpus
    Col3 -> CPU bandwidth received by the group in the 60sec window, expressed in
    percentage. Col3 data is derived as:
    Col3 = 100 * Col2 / (NR_CPUS * 60)
    Col4 -> CPU bandwidth received by each individual task of the group.
    Col4 = 100 * cpu_time_recd_by_task / 60

    [I can share the test case that produces a similar o/p if reqd]

    The deviation from desired group fairness is as below:

    a = +24.47%
    b = -9.13%
    c = -15.33%

    which is quite high.

    After the patch below is applied, here are the results:

    --------------------------------------------------------------------------------
    Col1 | Col2 | Col3 | Col4
    ------|---------|-------|-------------------------------------------------------
    a | 163.112 | 34.0% | 33.2% 33.4% 33.5% 33.5% 33.7% 34.4% 34.8% 35.3%
    b | 156.220 | 32.5% | 63.3% 64.5% 66.1% 66.5%
    c | 160.653 | 33.5% | 85.8% 90.6% 91.4%
    --------------------------------------------------------------------------------

    Deviation from desired group fairness is as below:

    a = +0.67%
    b = -0.83%
    c = +0.17%

    which is far better IMO. Most of other runs have yielded a deviation within
    +-2% at the most, which is good.

    Why do we see bad (group) fairness with current scheuler?
    =========================================================

    Currently cpu's weight is just the summation of individual task weights.
    This can yield incorrect results. For ex: consider three groups as below
    on a 2-cpu system:

    CPU0 CPU1
    ---------------------------
    A (10) B(5)
    C(5)
    ---------------------------

    Group A has 10 tasks, all on CPU0, Group B and C have 5 tasks each all
    of which are on CPU1. Each task has the same weight (NICE_0_LOAD =
    1024).

    The current scheme would yield a cpu weight of 10240 (10*1024) for each cpu and
    the load balancer will think both CPUs are perfectly balanced and won't
    move around any tasks. This, however, would yield this bandwidth:

    A = 50%
    B = 25%
    C = 25%

    which is not the desired result.

    What's changing in the patch?
    =============================

    - How cpu weights are calculated when CONFIF_FAIR_GROUP_SCHED is
    defined (see below)
    - API Change
    - Two tunables introduced in sysfs (under SCHED_DEBUG) to
    control the frequency at which the load balance monitor
    thread runs.

    The basic change made in this patch is how cpu weight (rq->load.weight) is
    calculated. Its now calculated as the summation of group weights on a cpu,
    rather than summation of task weights. Weight exerted by a group on a
    cpu is dependent on the shares allocated to it and also the number of
    tasks the group has on that cpu compared to the total number of
    (runnable) tasks the group has in the system.

    Let,
    W(K,i) = Weight of group K on cpu i
    T(K,i) = Task load present in group K's cfs_rq on cpu i
    T(K) = Total task load of group K across various cpus
    S(K) = Shares allocated to group K
    NRCPUS = Number of online cpus in the scheduler domain to
    which group K is assigned.

    Then,
    W(K,i) = S(K) * NRCPUS * T(K,i) / T(K)

    A load balance monitor thread is created at bootup, which periodically
    runs and adjusts group's weight on each cpu. To avoid its overhead, two
    min/max tunables are introduced (under SCHED_DEBUG) to control the rate
    at which it runs.

    Fixes from: Peter Zijlstra

    - don't start the load_balance_monitor when there is only a single cpu.
    - rename the kthread because its currently longer than TASK_COMM_LEN

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Srivatsa Vaddagiri
     
  • doms_cur[] array represents various scheduling domains which are
    mutually exclusive. Currently cpusets code can modify this array (by
    calling partition_sched_domains()) as a result of user modifying
    sched_load_balance flag for various cpusets.

    This patch introduces a mutex and corresponding API (only when
    CONFIG_FAIR_GROUP_SCHED is defined) which allows a reader to safely read
    the doms_cur[] array w/o worrying abt concurrent modifications to the
    array.

    The fair group scheduler code (introduced in next patch of this series)
    makes use of this mutex to walk thr' doms_cur[] array while rebalancing
    shares of task groups across cpus.

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Srivatsa Vaddagiri
     
  • This patch changes how the cpu load exerted by fair_sched_class tasks
    is calculated. Load exerted by fair_sched_class tasks on a cpu is now
    a summation of the group weights, rather than summation of task weights.
    Weight exerted by a group on a cpu is dependent on the shares allocated
    to it.

    This version of patch has a minor impact on code size, but should have
    no runtime/functional impact for !CONFIG_FAIR_GROUP_SCHED.

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Srivatsa Vaddagiri
     
  • Minor bug fixes for the group scheduler:

    - Use a mutex to serialize add/remove of task groups and also when
    changing shares of a task group. Use the same mutex when printing
    cfs_rq debugging stats for various task groups.

    - Use list_for_each_entry_rcu in for_each_leaf_cfs_rq macro (when
    walking task group list)

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Srivatsa Vaddagiri
     
  • Minor cleanups:

    - Fix coding style
    - remove obsolete comment

    Signed-off-by: Srivatsa Vaddagiri
    Signed-off-by: Ingo Molnar

    Srivatsa Vaddagiri