Currently L1_CACHE_BYTES is defined as 32 for ev6. Increasing this
to 64 (as it should be) broke networking.
Most probably the reason is in the entry.S:
ret_from_sys_call:
        cmovne  $26,0,$19               /* $19 = 0 => non-restartable */
        ldl     $3,TASK_PROCESSOR($8)
        lda     $4,softirq_state
        sll     $3,5,$3
        ^^^^^^^^^^^^^^^
        addq    $3,$4,$4
        ldq     $4,0($4)
        ...
sizeof(struct softirq_state) hardcoded to 32 here, although 
it depends on SMP_CACHE_BYTES (see include/linux/interrupt.h).
Could someone try this patch on ev6 SMP boxes?

Ivan.


diff -ur 2.4.0t5/arch/alpha/kernel/entry.S linux/arch/alpha/kernel/entry.S
--- 2.4.0t5/arch/alpha/kernel/entry.S   Tue Jul 25 09:46:40 2000
+++ linux/arch/alpha/kernel/entry.S     Mon Jul 31 17:40:30 2000
@@ -6,6 +6,7 @@
 
 #include <linux/config.h>
 #include <asm/system.h>
+#include <asm/cache.h>
 
 #define SIGCHLD 20
 
@@ -577,7 +578,7 @@
        cmovne  $26,0,$19               /* $19 = 0 => non-restartable */
        ldl     $3,TASK_PROCESSOR($8)
        lda     $4,softirq_state
-       sll     $3,5,$3
+       sll     $3,L1_CACHE_SHIFT,$3
        addq    $3,$4,$4
        ldq     $4,0($4)
        sll     $4,32,$3
diff -ur 2.4.0t5/include/asm-alpha/cache.h linux/include/asm-alpha/cache.h
--- 2.4.0t5/include/asm-alpha/cache.h   Thu Jun 22 09:30:59 2000
+++ linux/include/asm-alpha/cache.h     Mon Jul 31 17:51:11 2000
@@ -8,12 +8,14 @@
 
 /* Bytes per L1 (data) cache line. */
 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_EV6)
-# define L1_CACHE_BYTES     32 /* should be 64, but networking dies */
+# define L1_CACHE_BYTES     64
+# define L1_CACHE_SHIFT     6
 #else
 /* Both EV4 and EV5 are write-through, read-allocate,
    direct-mapped, physical.
 */
 # define L1_CACHE_BYTES     32
+# define L1_CACHE_SHIFT     5
 #endif
 
 #define L1_CACHE_ALIGN(x)  (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))

Reply via email to