lkml.org 
[lkml]   [2003]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 1/5] 2.6.0 fix preempt ctx switch accounting
    Make sure to count kernel preemption as a context switch. A short cut
    has been preventing it.



    Make sure to count kernel preemption as a context switch. A short cut
    has been preventing it.


    linux-2.6-npiggin/kernel/sched.c | 37 +++++++++++++++----------------------
    1 files changed, 15 insertions(+), 22 deletions(-)

    diff -puN kernel/sched.c~sched-ctx-count-preempt kernel/sched.c
    --- linux-2.6/kernel/sched.c~sched-ctx-count-preempt 2003-12-04 13:01:03.000000000 +1100
    +++ linux-2.6-npiggin/kernel/sched.c 2003-12-04 13:01:26.000000000 +1100
    @@ -1512,33 +1512,20 @@ need_resched:

    spin_lock_irq(&rq->lock);

    - /*
    - * if entering off of a kernel preemption go straight
    - * to picking the next task.
    - */
    - if (unlikely(preempt_count() & PREEMPT_ACTIVE))
    - goto pick_next_task;
    -
    - switch (prev->state) {
    - case TASK_INTERRUPTIBLE:
    - if (unlikely(signal_pending(prev))) {
    + if (prev->state != TASK_RUNNING &&
    + likely(!(preempt_count() & PREEMPT_ACTIVE)) ) {
    + if (unlikely(signal_pending(prev)) &&
    + prev->state == TASK_INTERRUPTIBLE)
    prev->state = TASK_RUNNING;
    - break;
    - }
    - default:
    - deactivate_task(prev, rq);
    - prev->nvcsw++;
    - break;
    - case TASK_RUNNING:
    - prev->nivcsw++;
    + else
    + deactivate_task(prev, rq);
    }
    -pick_next_task:
    - if (unlikely(!rq->nr_running)) {
    +
    #ifdef CONFIG_SMP
    + if (unlikely(!rq->nr_running))
    load_balance(rq, 1, cpu_to_node_mask(smp_processor_id()));
    - if (rq->nr_running)
    - goto pick_next_task;
    #endif
    + if (unlikely(!rq->nr_running)) {
    next = rq->idle;
    rq->expired_timestamp = 0;
    goto switch_tasks;
    @@ -1585,6 +1572,12 @@ switch_tasks:
    prev->timestamp = now;

    if (likely(prev != next)) {
    + if (prev->state == TASK_RUNNING ||
    + unlikely(preempt_count() & PREEMPT_ACTIVE))
    + prev->nivcsw++;
    + else
    + prev->nvcsw++;
    +
    next->timestamp = now;
    rq->nr_switches++;
    rq->curr = next;
    _
    \
     
     \ /
      Last update: 2005-03-22 13:59    [W:0.021 / U:1.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site