lkml.org 
[lkml]   [2002]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] 2.5: preemptive kernel on UP
    From
    Date
    During 2.5.5-pre, an optimization was made that removed schedule_tail
    from UP kernels. This causes the initial preempt_count of a new task,
    which starts at 1, to never decrement to zero and thus never become
    preemptible.

    Thanks to everyone who pointed out the lousy performance - it took
    awhile to find but it should be fixed now. Please comment if not.

    Patch is against 2.5.6-pre2 and is critical for all UP+preempt users.

    Robert Love

    diff -urN linux-2.5.6-pre2/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
    --- linux-2.5.6-pre2/arch/alpha/kernel/entry.S Fri Mar 1 17:21:14 2002
    +++ linux/arch/alpha/kernel/entry.S Mon Mar 4 17:49:27 2002
    @@ -495,7 +495,7 @@
    ret $31,($26),1
    .end alpha_switch_to

    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    .globl ret_from_fork
    .align 3
    .ent ret_from_fork
    diff -urN linux-2.5.6-pre2/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
    --- linux-2.5.6-pre2/arch/i386/kernel/entry.S Tue Feb 19 21:10:58 2002
    +++ linux/arch/i386/kernel/entry.S Mon Mar 4 17:48:32 2002
    @@ -195,7 +195,7 @@


    ENTRY(ret_from_fork)
    -#if CONFIG_SMP
    +#if CONFIG_SMP || CONFIG_PREEMPT
    call SYMBOL_NAME(schedule_tail)
    #endif
    GET_THREAD_INFO(%ebx)
    diff -urN linux-2.5.6-pre2/arch/ppc/kernel/entry.S linux/arch/ppc/kernel/entry.S
    --- linux-2.5.6-pre2/arch/ppc/kernel/entry.S Tue Feb 19 21:10:59 2002
    +++ linux/arch/ppc/kernel/entry.S Mon Mar 4 17:48:41 2002
    @@ -343,7 +343,7 @@

    .globl ret_from_fork
    ret_from_fork:
    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    bl schedule_tail
    #endif
    rlwinm r3,r1,0,0,18
    diff -urN linux-2.5.6-pre2/arch/ppc64/kernel/entry.S linux/arch/ppc64/kernel/entry.S
    --- linux-2.5.6-pre2/arch/ppc64/kernel/entry.S Tue Feb 19 21:10:53 2002
    +++ linux/arch/ppc64/kernel/entry.S Mon Mar 4 17:52:16 2002
    @@ -311,7 +311,7 @@
    blr

    _GLOBAL(ret_from_fork)
    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    bl .schedule_tail
    #endif
    clrrdi r4,r1,THREAD_SHIFT
    diff -urN linux-2.5.6-pre2/arch/s390/kernel/entry.S linux/arch/s390/kernel/entry.S
    --- linux-2.5.6-pre2/arch/s390/kernel/entry.S Tue Feb 19 21:10:57 2002
    +++ linux/arch/s390/kernel/entry.S Mon Mar 4 17:48:12 2002
    @@ -295,7 +295,7 @@
    stosm 24(%r15),0x03 # reenable interrupts
    sr %r0,%r0 # child returns 0
    st %r0,SP_R2(%r15) # store return value (change R2 on stack)
    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    l %r1,BASED(.Lschedtail)
    la %r14,BASED(sysc_return)
    br %r1 # call schedule_tail, return to sysc_return
    @@ -896,7 +896,7 @@
    #error .Ltrace: .long syscall_trace
    .Lvfork: .long sys_vfork

    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    .Lschedtail: .long schedule_tail
    #endif

    diff -urN linux-2.5.6-pre2/arch/s390x/kernel/entry.S linux/arch/s390x/kernel/entry.S
    --- linux-2.5.6-pre2/arch/s390x/kernel/entry.S Tue Feb 19 21:10:58 2002
    +++ linux/arch/s390x/kernel/entry.S Mon Mar 4 17:53:31 2002
    @@ -280,7 +280,7 @@
    GET_CURRENT # load pointer to task_struct to R9
    stosm 48(%r15),0x03 # reenable interrupts
    xc SP_R2(8,%r15),SP_R2(%r15) # child returns 0
    -#ifdef CONFIG_SMP
    +#ifdef CONFIG_SMP || CONFIG_PREEMPT
    larl %r14,sysc_return
    jg schedule_tail # return to sysc_return
    #else
    diff -urN linux-2.5.6-pre2/kernel/sched.c linux/kernel/sched.c
    --- linux-2.5.6-pre2/kernel/sched.c Fri Mar 1 17:21:16 2002
    +++ linux/kernel/sched.c Mon Mar 4 17:54:00 2002
    @@ -397,7 +397,7 @@
    p->sleep_avg) / (EXIT_WEIGHT + 1);
    }

    -#if CONFIG_SMP
    +#if CONFIG_SMP || CONFIG_PREEMPT
    asmlinkage void schedule_tail(void)
    {
    spin_unlock_irq(&this_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:24    [W:0.057 / U:0.724 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site