Hi Ralf, *, On Wed, Apr 24, 2002 at 03:03:15PM -0700, Jun Sun wrote: > Looks like the infamous cache aliasing problem. Steve Longerbeam had a > patch which may help. Please try it and let me know the results. > Maurice Turcotte wrote: > >I am having a problem with Linux Kernel 2.4.5 on a mips. > > > >I have two processes using share memory for IPC. This same > >code works fine with Kernel 2.4.7 on a x86. The problem is > >that the second process reads old data out of the shared > >memory. > > > >The executive summary-> > > > >Process #1 writes "A" to shared memory at 0x2aac7210 > >Process #2 reads 0 from shared memory at address 0x2aaca210 > >Process #1 writes "B" to shared memory at 0x2aac7210 > >Process #2 read "A" from shared memory at address 0x2aaca210 > >Process #1 writes "C" to shared memory at 0x2aac7210 > >Process #2 read "B" from shared memory at address 0x2aaca210 > > I today tried the patch in conjunction with XFree86 and XSHM on an Indy R5000/150. Usually all gtk shared-pixmaps get destroyed and written lines in it. With this patch all these garbage disappears. As long as there a no serious issues against this patch i would vote for inclused. It applies against todays cvs with only little offsets and gave me no problems. It definitly solves some serious issues with shm. Flo -- Florian Lohoff flo@rfc822.org +49-5201-669912 Nine nineth on september the 9th Welcome to the new billenium
diff -Nuar -X /home/stevel/dontdiff linux-2.4.17.orig/arch/mips/kernel/syscall.c linux-2.4.17/arch/mips/kernel/syscall.c --- linux-2.4.17.orig/arch/mips/kernel/syscall.c Sun Sep 16 16:29:10 2001 +++ linux-2.4.17/arch/mips/kernel/syscall.c Thu Jan 24 15:02:18 2002 @@ -24,6 +24,7 @@ #include <linux/slab.h> #include <linux/utsname.h> #include <linux/unistd.h> +#include <linux/shm.h> #include <asm/branch.h> #include <asm/offset.h> #include <asm/ptrace.h> @@ -53,6 +54,50 @@ out: return res; } + +/* + * To avoid cache aliases, we map the shard page with same color. + */ +#define COLOUR_ALIGN(addr) (((addr)+SHMLBA-1)&~(SHMLBA-1)) + +unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, + unsigned long flags) +{ + struct vm_area_struct *vma; + + if (flags & MAP_FIXED) { + /* + * We do not accept a shared mapping if it would violate + * cache aliasing constraints. + */ + if ((flags & MAP_SHARED) && (addr & (SHMLBA - 1))) + return -EINVAL; + return addr; + } + + if (len > TASK_SIZE) + return -ENOMEM; + if (!addr) + addr = TASK_UNMAPPED_BASE; + + if (flags & MAP_SHARED) + addr = COLOUR_ALIGN(addr); + else + addr = PAGE_ALIGN(addr); + + for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { + /* At this point: (!vma || addr < vma->vm_end). */ + if (TASK_SIZE - len < addr) + return -ENOMEM; + if (!vma || addr + len <= vma->vm_start) + return addr; + addr = vma->vm_end; + if (flags & MAP_SHARED) + addr = COLOUR_ALIGN(addr); + } +} + /* common code for old and new mmaps */ static inline long diff -Nuar -X /home/stevel/dontdiff linux-2.4.17.orig/include/asm-mips/pgtable.h linux-2.4.17/include/asm-mips/pgtable.h --- linux-2.4.17.orig/include/asm-mips/pgtable.h Thu Jan 24 14:35:06 2002 +++ linux-2.4.17/include/asm-mips/pgtable.h Thu Jan 24 14:56:52 2002 @@ -64,6 +64,9 @@ #define flush_icache_all() do { } while(0) #endif +/* We provide our own get_unmapped_area to avoid cache aliasing */ +#define HAVE_ARCH_UNMAPPED_AREA + /* * - add_wired_entry() add a fixed TLB entry, and move wired register */
Attachment:
pgp00177.pgp
Description: PGP signature