09 Jan, 2006

1 commit

  • RCU tasklist_lock and RCU signal handling: send signals RCU-read-locked
    instead of tasklist_lock read-locked. This is a scalability improvement on
    SMP and a preemption-latency improvement under PREEMPT_RCU.

    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar
    Acked-by: William Irwin
    Cc: Roland McGrath
    Cc: Oleg Nesterov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

14 Nov, 2005

2 commits

  • encapsulates the rest of arch-dependent operations with thread_info access.
    Two new helpers - setup_thread_stack() and end_of_stack(). For normal case
    the former consists of copying thread_info of parent to new thread_info and
    the latter returns pointer immediately past the end of thread_info.

    Signed-off-by: Al Viro
    Signed-off-by: Roman Zippel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Al Viro
     
  • new helper - task_thread_info(task). On platforms that have thread_info
    allocated separately (i.e. in default case) it simply returns
    task->thread_info. m68k wants (and for good reasons) to embed its thread_info
    into task_struct. So it will (in later patch) have task_thread_info() of its
    own. For now we just add a macro for generic case and convert existing
    instances of its body in core kernel to uses of new macro. Obviously safe -
    all normal architectures get the same preprocessor output they used to get.

    Signed-off-by: Al Viro
    Signed-off-by: Roman Zippel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Al Viro
     

10 Nov, 2005

1 commit

  • recalc_task_prio() is called from activate_task() to calculate dynamic
    priority and interactive credit for the activating task. For real-time
    scheduling process, all that dynamic calculation is thrown away at the end
    because rt priority is fixed. Patch to optimize recalc_task_prio() away
    for rt processes.

    Signed-off-by: Ken Chen
    Acked-by: Ingo Molnar
    Cc: Nick Piggin
    Cc: Con Kolivas
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Chen, Kenneth W
     

09 Nov, 2005

7 commits

  • Make some changes to the NEED_RESCHED and POLLING_NRFLAG to reduce
    confusion, and make their semantics rigid. Improves efficiency of
    resched_task and some cpu_idle routines.

    * In resched_task:
    - TIF_NEED_RESCHED is only cleared with the task's runqueue lock held,
    and as we hold it during resched_task, then there is no need for an
    atomic test and set there. The only other time this should be set is
    when the task's quantum expires, in the timer interrupt - this is
    protected against because the rq lock is irq-safe.

    - If TIF_NEED_RESCHED is set, then we don't need to do anything. It
    won't get unset until the task get's schedule()d off.

    - If we are running on the same CPU as the task we resched, then set
    TIF_NEED_RESCHED and no further action is required.

    - If we are running on another CPU, and TIF_POLLING_NRFLAG is *not* set
    after TIF_NEED_RESCHED has been set, then we need to send an IPI.

    Using these rules, we are able to remove the test and set operation in
    resched_task, and make clear the previously vague semantics of
    POLLING_NRFLAG.

    * In idle routines:
    - Enter cpu_idle with preempt disabled. When the need_resched() condition
    becomes true, explicitly call schedule(). This makes things a bit clearer
    (IMO), but haven't updated all architectures yet.

    - Many do a test and clear of TIF_NEED_RESCHED for some reason. According
    to the resched_task rules, this isn't needed (and actually breaks the
    assumption that TIF_NEED_RESCHED is only cleared with the runqueue lock
    held). So remove that. Generally one less locked memory op when switching
    to the idle thread.

    - Many idle routines clear TIF_POLLING_NRFLAG, and only set it in the inner
    most polling idle loops. The above resched_task semantics allow it to be
    set until before the last time need_resched() is checked before going into
    a halt requiring interrupt wakeup.

    Many idle routines simply never enter such a halt, and so POLLING_NRFLAG
    can be always left set, completely eliminating resched IPIs when rescheduling
    the idle task.

    POLLING_NRFLAG width can be increased, to reduce the chance of resched IPIs.

    Signed-off-by: Nick Piggin
    Cc: Ingo Molnar
    Cc: Con Kolivas
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nick Piggin
     
  • The intermittent scheduling of the migration thread at ultra high priority
    makes the smp nice handling see that runqueue as being heavily loaded. The
    migration thread itself actually handles the balancing so its influence on
    priority balancing should be ignored.

    Signed-off-by: Con Kolivas
    Cc: Ingo Molnar
    Cc: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • The priority biasing was off by mutliplying the total load by the total
    priority bias and this ruins the ratio of loads between runqueues. This
    patch should correct the ratios of loads between runqueues to be proportional
    to overall load. -2nd attempt.

    From: Dave Kleikamp

    This patch fixes a divide-by-zero error that I hit on a two-way i386
    machine. rq->nr_running is tested to be non-zero, but may change by the
    time it is used in the division. Saving the value to a local variable
    ensures that the same value that is checked is used in the division.

    Signed-off-by: Con Kolivas
    Signed-off-by: Dave Kleikamp
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • To intensify the 'nice' support across physical cpus on SMP we can bias the
    loads on idle rebalancing. To prevent idle rebalance from trying to pull tasks
    from queues that appear heavily loaded we only bias the load if there is more
    than one task running.

    Add some minor micro-optimisations and have only one return from __source_load
    and __target_load functions.

    Fix the fact that target_load was not biased by priority when type == 0.

    Signed-off-by: Con Kolivas
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • Real time tasks' effect on prio_bias should be based on their real time
    priority level instead of their static_prio which is based on nice.

    Signed-off-by: Con Kolivas
    Cc: Ingo Molnar
    Cc: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • prio_bias should only be adjusted in set_user_nice if p is actually currently
    queued.

    Signed-off-by: Con Kolivas
    Cc: Ingo Molnar
    Cc: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • This patch implements 'nice' support across physical cpus on SMP.

    It introduces an extra runqueue variable prio_bias which is the sum of the
    (inverted) static priorities of all the tasks on the runqueue.

    This is then used to bias busy rebalancing between runqueues to obtain good
    distribution of tasks of different nice values. By biasing the balancing only
    during busy rebalancing we can avoid having any significant loss of throughput
    by not affecting the carefully tuned idle balancing already in place. If all
    tasks are running at the same nice level this code should also have minimal
    effect. The code is optimised out in the !CONFIG_SMP case.

    Signed-off-by: Con Kolivas
    Cc: Ingo Molnar
    Cc: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     

07 Nov, 2005

2 commits

  • I didn't find any possible modular usage in the kernel.

    Signed-off-by: Adrian Bunk
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Adrian Bunk
     
  • Replace smp_processor_id() with any_online_cpu(cpu_online_map) in order to
    avoid lots of "BUG: using smp_processor_id() in preemptible [00000001]
    code:..." messages in case taking a cpu online fails.

    All the traces start at the last notifier_call_chain(...) in kernel/cpu.c.
    Since we hold the cpu_control semaphore it shouldn't be any problem to access
    cpu_online_map.

    The reason why cpu_up failed is simply that the cpu that was supposed to be
    taken online wasn't even there. That is because on s390 we never know when a
    new cpu comes and therefore cpu_possible_map consists of only ones and doesn't
    reflect reality.

    Signed-off-by: Heiko Carstens
    Cc: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Heiko Carstens
     

05 Nov, 2005

1 commit


31 Oct, 2005

1 commit

  • Simplify the UP (1 CPU) implementatin of set_cpus_allowed.

    The one CPU is hardcoded to be cpu 0 - so just test for that bit, and avoid
    having to pick up the cpu_online_map.

    Also, unexport cpu_online_map: it was only needed for set_cpus_allowed().

    Signed-off-by: Paul Jackson
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paul Jackson
     

30 Oct, 2005

1 commit

  • update_mem_hiwater has attracted various criticisms, in particular from those
    concerned with mm scalability. Originally it was called whenever rss or
    total_vm got raised. Then many of those callsites were replaced by a timer
    tick call from account_system_time. Now Frank van Maarseveen reports that to
    be found inadequate. How about this? Works for Frank.

    Replace update_mem_hiwater, a poor combination of two unrelated ops, by macros
    update_hiwater_rss and update_hiwater_vm. Don't attempt to keep
    mm->hiwater_rss up to date at timer tick, nor every time we raise rss (usually
    by 1): those are hot paths. Do the opposite, update only when about to lower
    rss (usually by many), or just before final accounting in do_exit. Handle
    mm->hiwater_vm in the same way, though it's much less of an issue. Demand
    that whoever collects these hiwater statistics do the work of taking the
    maximum with rss or total_vm.

    And there has been no collector of these hiwater statistics in the tree. The
    new convention needs an example, so match Frank's usage by adding a VmPeak
    line above VmSize to /proc//status, and also a VmHWM line above VmRSS
    (High-Water-Mark or High-Water-Memory).

    There was a particular anomaly during mremap move, that hiwater_vm might be
    captured too high. A fleeting such anomaly remains, but it's quickly
    corrected now, whereas before it would stick.

    What locking? None: if the app is racy then these statistics will be racy,
    it's not worth any overhead to make them exact. But whenever it suits,
    hiwater_vm is updated under exclusive mmap_sem, and hiwater_rss under
    page_table_lock (for now) or with preemption disabled (later on): without
    going to any trouble, minimize the time between reading current values and
    updating, to minimize those occasions when a racing thread bumps a count up
    and back down in between.

    Signed-off-by: Hugh Dickins
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Hugh Dickins
     

27 Oct, 2005

1 commit


14 Sep, 2005

1 commit


12 Sep, 2005

2 commits


11 Sep, 2005

12 commits

  • Don't pull tasks from a group if that would cause the group's total load to
    drop below its total cpu_power (ie. cause the group to start going idle).

    Signed-off-by: Suresh Siddha
    Signed-off-by: Nick Piggin
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Siddha, Suresh B
     
  • Jack Steiner brought this issue at my OLS talk.

    Take a scenario where two tasks are pinned to two HT threads in a physical
    package. Idle packages in the system will keep kicking migration_thread on
    the busy package with out any success.

    We will run into similar scenarios in the presence of CMP/NUMA.

    Signed-off-by: Suresh Siddha
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Siddha, Suresh B
     
  • In sys_sched_yield(), we cache current->array in the "array" variable, thus
    there's no need to dereference "current" again later.

    Signed-Off-By: Renaud Lienhart
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Renaud Lienhart
     
  • If an idle sibling of an HT queue encounters a busy sibling, then make
    higher level load balancing of the non-idle variety.

    Performance of multiprocessor HT systems with low numbers of tasks
    (generally < number of virtual CPUs) can be significantly worse than the
    exact same workloads when running in non-HT mode. The reason is largely
    due to poor scheduling behaviour.

    This patch improves the situation, making the performance gap far less
    significant on one problematic test case (tbench).

    Signed-off-by: Nick Piggin
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nick Piggin
     
  • During periodic load balancing, don't hold this runqueue's lock while
    scanning remote runqueues, which can take a non trivial amount of time
    especially on very large systems.

    Holding the runqueue lock will only help to stabilise ->nr_running, however
    this doesn't do much to help because tasks being woken will simply get held
    up on the runqueue lock, so ->nr_running would not provide a really
    accurate picture of runqueue load in that case anyway.

    What's more, ->nr_running (and possibly the cpu_load averages) of remote
    runqueues won't be stable anyway, so load balancing is always an inexact
    operation.

    Signed-off-by: Nick Piggin
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nick Piggin
     
  • Similarly to the earlier change in load_balance, only lock the runqueue in
    load_balance_newidle if the busiest queue found has a nr_running > 1. This
    will reduce frequency of expensive remote runqueue lock aquisitions in the
    schedule() path on some workloads.

    Signed-off-by: Nick Piggin
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Nick Piggin
     
  • William Weston reported unusually high scheduling latencies on his x86 HT
    box, on the -RT kernel. I managed to reproduce it on my HT box and the
    latency tracer shows the incident in action:

    _------=> CPU#
    / _-----=> irqs-off
    | / _----=> need-resched
    || / _---=> hardirq/softirq
    ||| / _--=> preempt-depth
    |||| /
    ||||| delay
    cmd pid ||||| time | caller
    \ / ||||| \ | /
    du-2803 3Dnh2 0us : __trace_start_sched_wakeup (try_to_wake_up)
    ..............................................................
    ... we are running on CPU#3, PID 2778 gets woken to CPU#1: ...
    ..............................................................
    du-2803 3Dnh2 0us : __trace_start_sched_wakeup <-2778> (73 1)
    du-2803 3Dnh2 0us : _raw_spin_unlock (try_to_wake_up)
    ................................................
    ... still on CPU#3, we send an IPI to CPU#1: ...
    ................................................
    du-2803 3Dnh1 0us : resched_task (try_to_wake_up)
    du-2803 3Dnh1 1us : smp_send_reschedule (try_to_wake_up)
    du-2803 3Dnh1 1us : send_IPI_mask_bitmask (smp_send_reschedule)
    du-2803 3Dnh1 2us : _raw_spin_unlock_irqrestore (try_to_wake_up)
    ...............................................
    ... 1 usec later, the IPI arrives on CPU#1: ...
    ...............................................
    -0 1Dnh. 2us : smp_reschedule_interrupt (c0100c5a 0 0)

    So far so good, this is the normal wakeup/preemption mechanism. But here
    comes the scheduler anomaly on CPU#1:

    -0 1Dnh. 2us : preempt_schedule_irq (need_resched)
    -0 1Dnh. 2us : preempt_schedule_irq (need_resched)
    -0 1Dnh. 3us : __schedule (preempt_schedule_irq)
    -0 1Dnh. 3us : profile_hit (__schedule)
    -0 1Dnh1 3us : sched_clock (__schedule)
    -0 1Dnh1 4us : _raw_spin_lock_irq (__schedule)
    -0 1Dnh1 4us : _raw_spin_lock_irqsave (__schedule)
    -0 1Dnh2 5us : _raw_spin_unlock (__schedule)
    -0 1Dnh1 5us : preempt_schedule (__schedule)
    -0 1Dnh1 6us : _raw_spin_lock (__schedule)
    -0 1Dnh2 6us : find_next_bit (__schedule)
    -0 1Dnh2 6us : _raw_spin_lock (__schedule)
    -0 1Dnh3 7us : find_next_bit (__schedule)
    -0 1Dnh3 7us : find_next_bit (__schedule)
    -0 1Dnh3 8us : _raw_spin_unlock (__schedule)
    -0 1Dnh2 8us : preempt_schedule (__schedule)
    -0 1Dnh2 8us : find_next_bit (__schedule)
    -0 1Dnh2 9us : trace_stop_sched_switched (__schedule)
    -0 1Dnh2 9us : _raw_spin_lock (trace_stop_sched_switched)
    -0 1Dnh3 10us : trace_stop_sched_switched <-2778> (73 8c)
    -0 1Dnh3 10us : _raw_spin_unlock (trace_stop_sched_switched)
    -0 1Dnh1 10us : _raw_spin_unlock (__schedule)
    -0 1Dnh. 11us : local_irq_enable_noresched (preempt_schedule_irq)
    -0 1Dnh. 11us < (0)

    we didnt pick up pid 2778! It only gets scheduled much later:

    -2778 1Dnh2 412us : __switch_to (__schedule)
    -2778 1Dnh2 413us : __schedule <-0> (8c 73)
    -2778 1Dnh2 413us : _raw_spin_unlock (__schedule)
    -2778 1Dnh1 413us : trace_stop_sched_switched (__schedule)
    -2778 1Dnh1 414us : _raw_spin_lock (trace_stop_sched_switched)
    -2778 1Dnh2 414us : trace_stop_sched_switched <-2778> (73 1)
    -2778 1Dnh2 414us : _raw_spin_unlock (trace_stop_sched_switched)
    -2778 1Dnh1 415us : trace_stop_sched_switched (__schedule)

    the reason for this anomaly is the following code in dependent_sleeper():

    /*
    * If a user task with lower static priority than the
    * running task on the SMT sibling is trying to schedule,
    * delay it till there is proportionately less timeslice
    * left of the sibling task to prevent a lower priority
    * task from using an unfair proportion of the
    * physical cpu's resources. -ck
    */
    [...]
    if (((smt_curr->time_slice * (100 - sd->per_cpu_gain) /
    100) > task_timeslice(p)))
    ret = 1;

    Note that in contrast to the comment above, we dont actually do the check
    based on static priority, we do the check based on timeslices. But
    timeslices go up and down, and even highprio tasks can randomly have very
    low timeslices (just before their next refill) and can thus be judged as
    'lowprio' by the above piece of code. This condition is clearly buggy.
    The correct test is to check for static_prio _and_ to check for the
    preemption priority. Even on different static priority levels, a
    higher-prio interactive task should not be delayed due to a
    higher-static-prio CPU hog.

    There is a symmetric bug in the 'kick SMT sibling' code of this function as
    well, which can be solved in a similar way.

    The patch below (against the current scheduler queue in -mm) fixes both
    bugs. I have build and boot-tested this on x86 SMT, and nice +20 tasks
    still get properly throttled - so the dependent-sleeper logic is still in
    action.

    btw., these bugs pessimised the SMT scheduler because the 'delay wakeup'
    property was applied too liberally, so this fix is likely a throughput
    improvement as well.

    I separated out a smt_slice() function to make the code easier to read.

    Signed-off-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • This patch implements a task state bit (TASK_NONINTERACTIVE), which can be
    used by blocking points to mark the task's wait as "non-interactive". This
    does not mean the task will be considered a CPU-hog - the wait will simply
    not have an effect on the waiting task's priority - positive or negative
    alike. Right now only pipe_wait() will make use of it, because it's a
    common source of not-so-interactive waits (kernel compilation jobs, etc.).

    Signed-off-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • whitespace cleanups.

    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • Add relevant checks into find_idlest_group() and find_idlest_cpu() to make
    them return only the groups that have allowed CPUs and allowed CPUs
    respectively.

    Signed-off-by: M.Baris Demiray
    Signed-off-by: Nick Piggin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    M.Baris Demiray
     
  • The hyperthread aware nice handling currently puts to sleep any non real
    time task when a real time task is running on its sibling cpu. This can
    lead to prolonged starvation by having the non real time task pegged to the
    cpu with load balancing not pulling that task away.

    Currently we force lower priority hyperthread tasks to run a percentage of
    time difference based on timeslice differences which is meaningless when
    comparing real time tasks to SCHED_NORMAL tasks. We can allow non real
    time tasks to run with real time tasks on the sibling up to per_cpu_gain%
    if we use jiffies as a counter.

    Cleanups and micro-optimisations to the relevant code section should make
    it more understandable as well.

    Signed-off-by: Con Kolivas
    Acked-by: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Con Kolivas
     
  • This patch (written by me and also containing many suggestions of Arjan van
    de Ven) does a major cleanup of the spinlock code. It does the following
    things:

    - consolidates and enhances the spinlock/rwlock debugging code

    - simplifies the asm/spinlock.h files

    - encapsulates the raw spinlock type and moves generic spinlock
    features (such as ->break_lock) into the generic code.

    - cleans up the spinlock code hierarchy to get rid of the spaghetti.

    Most notably there's now only a single variant of the debugging code,
    located in lib/spinlock_debug.c. (previously we had one SMP debugging
    variant per architecture, plus a separate generic one for UP builds)

    Also, i've enhanced the rwlock debugging facility, it will now track
    write-owners. There is new spinlock-owner/CPU-tracking on SMP builds too.
    All locks have lockup detection now, which will work for both soft and hard
    spin/rwlock lockups.

    The arch-level include files now only contain the minimally necessary
    subset of the spinlock code - all the rest that can be generalized now
    lives in the generic headers:

    include/asm-i386/spinlock_types.h | 16
    include/asm-x86_64/spinlock_types.h | 16

    I have also split up the various spinlock variants into separate files,
    making it easier to see which does what. The new layout is:

    SMP | UP
    ----------------------------|-----------------------------------
    asm/spinlock_types_smp.h | linux/spinlock_types_up.h
    linux/spinlock_types.h | linux/spinlock_types.h
    asm/spinlock_smp.h | linux/spinlock_up.h
    linux/spinlock_api_smp.h | linux/spinlock_api_up.h
    linux/spinlock.h | linux/spinlock.h

    /*
    * here's the role of the various spinlock/rwlock related include files:
    *
    * on SMP builds:
    *
    * asm/spinlock_types.h: contains the raw_spinlock_t/raw_rwlock_t and the
    * initializers
    *
    * linux/spinlock_types.h:
    * defines the generic type and initializers
    *
    * asm/spinlock.h: contains the __raw_spin_*()/etc. lowlevel
    * implementations, mostly inline assembly code
    *
    * (also included on UP-debug builds:)
    *
    * linux/spinlock_api_smp.h:
    * contains the prototypes for the _spin_*() APIs.
    *
    * linux/spinlock.h: builds the final spin_*() APIs.
    *
    * on UP builds:
    *
    * linux/spinlock_type_up.h:
    * contains the generic, simplified UP spinlock type.
    * (which is an empty structure on non-debug builds)
    *
    * linux/spinlock_types.h:
    * defines the generic type and initializers
    *
    * linux/spinlock_up.h:
    * contains the __raw_spin_*()/etc. version of UP
    * builds. (which are NOPs on non-debug, non-preempt
    * builds)
    *
    * (included on UP-non-debug builds:)
    *
    * linux/spinlock_api_up.h:
    * builds the _spin_*() APIs.
    *
    * linux/spinlock.h: builds the final spin_*() APIs.
    */

    All SMP and UP architectures are converted by this patch.

    arm, i386, ia64, ppc, ppc64, s390/s390x, x64 was build-tested via
    crosscompilers. m32r, mips, sh, sparc, have not been tested yet, but should
    be mostly fine.

    From: Grant Grundler

    Booted and lightly tested on a500-44 (64-bit, SMP kernel, dual CPU).
    Builds 32-bit SMP kernel (not booted or tested). I did not try to build
    non-SMP kernels. That should be trivial to fix up later if necessary.

    I converted bit ops atomic_hash lock to raw_spinlock_t. Doing so avoids
    some ugly nesting of linux/*.h and asm/*.h files. Those particular locks
    are well tested and contained entirely inside arch specific code. I do NOT
    expect any new issues to arise with them.

    If someone does ever need to use debug/metrics with them, then they will
    need to unravel this hairball between spinlocks, atomic ops, and bit ops
    that exist only because parisc has exactly one atomic instruction: LDCW
    (load and clear word).

    From: "Luck, Tony"

    ia64 fix

    Signed-off-by: Ingo Molnar
    Signed-off-by: Arjan van de Ven
    Signed-off-by: Grant Grundler
    Cc: Matthew Wilcox
    Signed-off-by: Hirokazu Takata
    Signed-off-by: Mikael Pettersson
    Signed-off-by: Benoit Boissinot
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

10 Sep, 2005

1 commit

  • For architecture like ia64, the switch stack structure is fairly large
    (currently 528 bytes). For context switch intensive application, we found
    that significant amount of cache misses occurs in switch_to() function.
    The following patch adds a hook in the schedule() function to prefetch
    switch stack structure as soon as 'next' task is determined. This allows
    maximum overlap in prefetch cache lines for that structure.

    Signed-off-by: Ken Chen
    Cc: Ingo Molnar
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Chen, Kenneth W
     

08 Sep, 2005

3 commits


07 Sep, 2005

1 commit


19 Aug, 2005

1 commit


27 Jul, 2005

2 commits

  • Here's the patch again to fix the code to handle if the values between
    MAX_USER_RT_PRIO and MAX_RT_PRIO are different.

    Without this patch, an SMP system will crash if the values are
    different.

    Signed-off-by: Steven Rostedt
    Cc: Ingo Molnar
    Signed-off-by: Dean Nelson
    Signed-off-by: Linus Torvalds

    Steven Rostedt
     
  • RLIMIT_RTPRIO is supposed to grant non privileged users the right to use
    SCHED_FIFO/SCHED_RR scheduling policies with priorites bounded by the
    RLIMIT_RTPRIO value via sched_setscheduler(). This is usually used by
    audio users.

    Unfortunately this is broken in 2.6.13rc3 as you can see in the excerpt
    from sched_setscheduler below:

    /*
    * Allow unprivileged RT tasks to decrease priority:
    */
    if (!capable(CAP_SYS_NICE)) {
    /* can't change policy */
    if (policy != p->policy)
    return -EPERM;

    After the above unconditional test which causes sched_setscheduler to
    fail with no regard to the RLIMIT_RTPRIO value the following check is made:

    /* can't increase priority */
    if (policy != SCHED_NORMAL &&
    param->sched_priority > p->rt_priority &&
    param->sched_priority >
    p->signal->rlim[RLIMIT_RTPRIO].rlim_cur)
    return -EPERM;

    Thus I do believe that the RLIMIT_RTPRIO value must be taken into
    account for the policy check, especially as the RLIMIT_RTPRIO limit is
    of no use without this change.

    The attached patch fixes this problem.

    Signed-off-by: Andreas Steinmetz
    Acked-by: Ingo Molnar
    Signed-off-by: Linus Torvalds

    Andreas Steinmetz