]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] SHMLBA compat task alignment fix
authorAndrew Morton <akpm@osdl.org>
Tue, 16 Mar 2004 23:10:45 +0000 (15:10 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 16 Mar 2004 23:10:45 +0000 (15:10 -0800)
From: Arun Sharma <arun.sharma@intel.com>

The current Linux implementation of shmat() insists on SHMLBA alignment even
when shmflg & SHM_RND == 0.  This is not consistent with the man pages and
the single UNIX spec, which require only a page-aligned address.

However, some architectures require a SHMLBA alignment for correctness in all
cases.  Such architectures use __ARCH_FORCE_SHMLBA.

include/asm-mips/shmparam.h
include/asm-parisc/shmparam.h
include/asm-sparc/shmparam.h
include/asm-sparc64/shmparam.h
ipc/shm.c

index 305a08b6b645d176a1e6d83db832ed2acae433ef..09290720751cb2cb1187db63c5a8d20dc1c6a331 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef _ASM_SHMPARAM_H
 #define _ASM_SHMPARAM_H
 
+#define __ARCH_FORCE_SHMLBA    1
+
 #define        SHMLBA 0x40000                  /* attach addr a multiple of this */
 
 #endif /* _ASM_SHMPARAM_H */
index 98a56edda4dee34e44afce52a52539b6c373476d..628ddc22faa8928599553f0b18e748fa4cb06fae 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _ASMPARISC_SHMPARAM_H
 #define _ASMPARISC_SHMPARAM_H
 
+#define __ARCH_FORCE_SHMLBA    1
+
 #define SHMLBA 0x00400000   /* attach addr needs to be 4 Mb aligned */
 
 #endif /* _ASMPARISC_SHMPARAM_H */
index 69ba79a8f45a5cae40e7624c73ca5bcdefb3e413..bb93a6f74a388fb4470b264df7d703a6504b0f1c 100644 (file)
@@ -2,6 +2,8 @@
 #ifndef _ASMSPARC_SHMPARAM_H
 #define _ASMSPARC_SHMPARAM_H
 
+#define __ARCH_FORCE_SHMLBA    1
+
 extern int vac_cache_size;
 #define SHMLBA (vac_cache_size ? vac_cache_size : \
                (sparc_cpu_model == sun4c ? (64 * 1024) : \
index 97c667e7c0e45dcaa0ddccd442cbaaef1d727b61..8c66fded8a328113b3200da486826c1617610239 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <asm/spitfire.h>
 
+#define __ARCH_FORCE_SHMLBA    1
 /* attach addr a multiple of this */
 #define        SHMLBA  ((PAGE_SIZE > L1DCACHE_SIZE) ? PAGE_SIZE : L1DCACHE_SIZE)
 
index d7d932d6dea5dbb8dc3a5683a2e9bf7261a97a92..9721b42ec9d87c739ddb553cb4ee1acebe722c8c 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -656,7 +656,10 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr)
                        if (shmflg & SHM_RND)
                                addr &= ~(SHMLBA-1);       /* round down */
                        else
-                               return -EINVAL;
+#ifndef __ARCH_FORCE_SHMLBA
+                               if (addr & ~PAGE_MASK)
+#endif
+                                       return -EINVAL;
                }
                flags = MAP_SHARED | MAP_FIXED;
        } else {