[PATCH] SHM_NORESERVE flags for shmget()
authorBadari Pulavarty <pbadari@us.ibm.com>
Mon, 7 Nov 2005 08:59:27 +0000 (00:59 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 7 Nov 2005 15:53:37 +0000 (07:53 -0800)
Add SHM_NORESERVE functionality similar to MAP_NORESERVE for shared memory
segments.

This is mainly to avoid abuse of OVERCOMMIT_ALWAYS and this flag is ignored
for OVERCOMMIT_NEVER.

Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com>
Cc: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/linux/shm.h
ipc/shm.c

index 80113a1f60bc83447184c6cc55b89eafa7eebd10..a2c896ad0befa6819dbae3e1ffd47b1679597346 100644 (file)
@@ -92,6 +92,7 @@ struct shmid_kernel /* private to the kernel */
 #define        SHM_DEST        01000   /* segment will be destroyed on last detach */
 #define SHM_LOCKED      02000   /* segment will not be swapped */
 #define SHM_HUGETLB     04000   /* segment will use huge TLB pages */
+#define SHM_NORESERVE   010000  /* don't check for reservations */
 
 #ifdef CONFIG_SYSVIPC
 long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr);
index b58c651d31ae23a36c58a1de3005e6b5d46a2662..587d836d80d9d07f075259d3efe73917413f8010 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -212,8 +212,16 @@ static int newseg (key_t key, int shmflg, size_t size)
                file = hugetlb_zero_setup(size);
                shp->mlock_user = current->user;
        } else {
+               int acctflag = VM_ACCOUNT;
+               /*
+                * Do not allow no accounting for OVERCOMMIT_NEVER, even
+                * if it's asked for.
+                */
+               if  ((shmflg & SHM_NORESERVE) &&
+                               sysctl_overcommit_memory != OVERCOMMIT_NEVER)
+                       acctflag = 0;
                sprintf (name, "SYSV%08x", key);
-               file = shmem_file_setup(name, size, VM_ACCOUNT);
+               file = shmem_file_setup(name, size, acctflag);
        }
        error = PTR_ERR(file);
        if (IS_ERR(file))