lkml.org 
[lkml]   [1998]   [Nov]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: entry.S mess with %ebx (&current pointer)


    On Thu, 19 Nov 1998, Andrea Arcangeli wrote:
    >
    > I am sure that the kernel run do_signal() from signal_return, even if
    > sigpending is 0. This mean that %ebx got corrupted somewhere (and this
    > explain very well also the need_resched flood I suspected some days ago).
    > A patch for 2.1.128 that fix the UP hang fine here is this:

    Good debugging, but the fix is incorrect (or at least unnecessarily slow).

    I see where the problem is, and I also see why it _only_ happens on UP.

    The problem is that the fork return point to the new process does not
    initialize %ebx in the UP case.

    It _does_ initialize it in the SMP case, and this is basically just an
    oversight.

    This patch should fix it properly, please tell me whether that is true..

    Linus

    -----
    diff -u --recursive --new-file v2.1.129/linux/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
    --- v2.1.129/linux/arch/i386/kernel/entry.S Sun Nov 8 14:02:42 1998
    +++ linux/arch/i386/kernel/entry.S Thu Nov 19 09:53:08 1998
    @@ -150,14 +150,14 @@
    jmp ret_from_sys_call


    -#ifdef __SMP__
    ALIGN
    .globl ret_from_smpfork
    -ret_from_smpfork:
    +ret_from_fork:
    GET_CURRENT(%ebx)
    +#ifdef __SMP__
    btrl $0, SYMBOL_NAME(scheduler_lock)
    - jmp ret_from_sys_call
    #endif /* __SMP__ */
    + jmp ret_from_sys_call

    /*
    * Return to user mode is not as complex as all this looks,
    diff -u --recursive --new-file v2.1.129/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
    --- v2.1.129/linux/arch/i386/kernel/process.c Fri Oct 9 13:27:05 1998
    +++ linux/arch/i386/kernel/process.c Thu Nov 19 09:53:35 1998
    @@ -50,11 +50,7 @@

    spinlock_t semaphore_wake_lock = SPIN_LOCK_UNLOCKED;

    -#ifdef __SMP__
    -asmlinkage void ret_from_fork(void) __asm__("ret_from_smpfork");
    -#else
    -asmlinkage void ret_from_fork(void) __asm__("ret_from_sys_call");
    -#endif
    +asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");

    #ifdef CONFIG_APM
    extern int apm_do_idle(void);


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.rutgers.edu
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:45    [W:0.035 / U:178.384 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site