[PATCH] New try ac8 Athlon-SMP

From: Tom Leete (tleete@mountain.net)
Date: Tue Jun 06 2000 - 00:19:59 EST


Alan Cox wrote:
>
> > How about moving the in_interrupt() test into
> > out_of_line_copy? The objection is that that's the case
> > where you really want it fast.
>
> It really wants to be inline code. It should come out very small.
>

There was one other difference between your pseudo-asm and
the string.h source. There, the size test is done first. The
in_interrupt() test is only done for large copies. Function
call overhead is negligible compared to the copy time.

I want to emphasize that calling in_interrupt() in string.h
is broken. The build gags in the first include in
init/main.c. That is the reason for all this.

This patch compiles with K7+SMP. I just booted it and all
seems well.

Tom

--- linux.ac/arch/i386/lib/mmx.c.orig Wed Oct 27 21:30:39 1999
+++ linux.ac/arch/i386/lib/mmx.c Tue Jun 6 04:20:01 2000
@@ -1,6 +1,7 @@
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/sched.h>
+#include <asm/hardirq.h>
 
 /*
  * MMX 3DNow! library helper functions
@@ -88,6 +89,21 @@
         stts();
         return p;
 }
+
+void * __constant_mmx_memcpy3d(void * to, const void * from, size_t len)
+{
+ if(in_interrupt())
+ return __constant_memcpy(to, from, len);
+ return _mmx_memcpy(to, from, len);
+}
+
+void *__mmx_memcpy3d(void *to, const void *from, size_t len)
+{
+ if(in_interrupt())
+ return __memcpy(to, from, len);
+ return _mmx_memcpy(to, from, len);
+}
+
 
 static void fast_clear_page(void *page)
 {
--- linux.ac/include/asm-i386/mmx.h.orig Tue Jun 6 03:05:02 2000
+++ linux.ac/include/asm-i386/mmx.h Tue Jun 6 04:25:27 2000
@@ -10,5 +10,7 @@
 extern void *_mmx_memcpy(void *to, const void *from, size_t size);
 extern void mmx_clear_page(void *page);
 extern void mmx_copy_page(void *to, void *from);
+extern __inline__ void *__constant_mmx_memcpy3d(void * to, const void * from, size_t len);
+extern __inline__ void *__mmx_memcpy3d(void *to, const void *from, size_t len);
 
 #endif
--- linux.ac/include/asm-i386/string.h.orig Tue Jun 6 03:05:02 2000
+++ linux.ac/include/asm-i386/string.h Tue Jun 6 04:30:37 2000
@@ -287,13 +287,6 @@
 
 #ifdef CONFIG_X86_USE_3DNOW
 
-/* All this just for in_interrupt() ... */
-
-#include <asm/system.h>
-#include <asm/ptrace.h>
-#include <linux/smp.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
 #include <asm/mmx.h>
 
 /*
@@ -302,16 +295,16 @@
 
 static inline void * __constant_memcpy3d(void * to, const void * from, size_t len)
 {
- if(len<512 || in_interrupt())
+ if(len<512)
                 return __constant_memcpy(to, from, len);
- return _mmx_memcpy(to, from, len);
+ return __constant_mmx_memcpy3d(to, from, len);
 }
 
 extern __inline__ void *__memcpy3d(void *to, const void *from, size_t len)
 {
- if(len<512 || in_interrupt())
+ if(len<512)
                 return __memcpy(to, from, len);
- return _mmx_memcpy(to, from, len);
+ return __mmx_memcpy3d(to, from, len);
 }
 
 #define memcpy(t, f, n) \

-
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/



This archive was generated by hypermail 2b29 : Wed Jun 07 2000 - 21:00:24 EST