Mikulas Patocka wrote:
> 
> Hi.
> 
> arch/i386/kernel/entry.S
>         xchgl %eax, ORIG_EAX(%esp)      # orig_eax (get the error code. )
>         movl %esp,%edx
>         xchgl %ecx, ES(%esp)            # get the address and save es.
>         pushl %eax                      # push the error code
> 
> xchg with memory operand has implicit lock prefix and is slooooooow. It is

Here is a patch that removes the xchg instructions.  As an interesting
note, I tested the difference in cycles between one xchgl and two movl
instructions on 3 different processors (a Celeron, a K6-2, and an
Athlon, all UP).  The celeron and K6-2 showed noticable improvements. 
The real surprise was the the Athlon, where the times were identical. 
This means that either the Athlon has a really fast lock cycle or it is
ignoring it.

-- 

                                                Brian Gerst
diff -urN linux-2.4.0t9/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- linux-2.4.0t9/arch/i386/kernel/entry.S      Tue Oct  3 20:05:10 2000
+++ linux/arch/i386/kernel/entry.S      Wed Oct  4 20:17:09 2000
@@ -305,16 +305,18 @@
        pushl %ebx
        cld
        movl %es,%ecx
-       xchgl %eax, ORIG_EAX(%esp)      # orig_eax (get the error code. )
+       movl ORIG_EAX(%esp), %esi       # get the error code
+       movl ES(%esp), %edi             # get the function address
+       movl %eax, ORIG_EAX(%esp)
+       movl %ecx, ES(%esp)
        movl %esp,%edx
-       xchgl %ecx, ES(%esp)            # get the address and save es.
-       pushl %eax                      # push the error code
-       pushl %edx
+       pushl %esi                      # push the error code
+       pushl %edx                      # push the pt_regs pointer
        movl $(__KERNEL_DS),%edx
        movl %edx,%ds
        movl %edx,%es
        GET_CURRENT(%ebx)
-       call *%ecx
+       call *%edi
        addl $8,%esp
        jmp ret_from_exception
 

Reply via email to