Browse Source

[PATCH] SHM_NORESERVE flags for shmget()

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>
Badari Pulavarty 19 years ago
parent
commit
bf8f972d3a
2 changed files with 10 additions and 1 deletions
  1. 1 0
      include/linux/shm.h
  2. 9 1
      ipc/shm.c

+ 1 - 0
include/linux/shm.h

@@ -92,6 +92,7 @@ struct shmid_kernel /* private to the kernel */
 #define	SHM_DEST	01000	/* segment will be destroyed on last detach */
 #define	SHM_DEST	01000	/* segment will be destroyed on last detach */
 #define SHM_LOCKED      02000   /* segment will not be swapped */
 #define SHM_LOCKED      02000   /* segment will not be swapped */
 #define SHM_HUGETLB     04000   /* segment will use huge TLB pages */
 #define SHM_HUGETLB     04000   /* segment will use huge TLB pages */
+#define SHM_NORESERVE   010000  /* don't check for reservations */
 
 
 #ifdef CONFIG_SYSVIPC
 #ifdef CONFIG_SYSVIPC
 long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr);
 long do_shmat(int shmid, char __user *shmaddr, int shmflg, unsigned long *addr);

+ 9 - 1
ipc/shm.c

@@ -212,8 +212,16 @@ static int newseg (key_t key, int shmflg, size_t size)
 		file = hugetlb_zero_setup(size);
 		file = hugetlb_zero_setup(size);
 		shp->mlock_user = current->user;
 		shp->mlock_user = current->user;
 	} else {
 	} 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);
 		sprintf (name, "SYSV%08x", key);
-		file = shmem_file_setup(name, size, VM_ACCOUNT);
+		file = shmem_file_setup(name, size, acctflag);
 	}
 	}
 	error = PTR_ERR(file);
 	error = PTR_ERR(file);
 	if (IS_ERR(file))
 	if (IS_ERR(file))