mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-05 07:36:56 +07:00
b34a6b1da3
Add support for the shm_rmid_forced sysctl. If set to 1, all shared memory objects in current ipc namespace will be automatically forced to use IPC_RMID. The POSIX way of handling shmem allows one to create shm objects and call shmdt(), leaving shm object associated with no process, thus consuming memory not counted via rlimits. With shm_rmid_forced=1 the shared memory object is counted at least for one process, so OOM killer may effectively kill the fat process holding the shared memory. It obviously breaks POSIX - some programs relying on the feature would stop working. So set shm_rmid_forced=1 only if you're sure nobody uses "orphaned" memory. Use shm_rmid_forced=0 by default for compatability reasons. The feature was previously impemented in -ow as a configure option. [akpm@linux-foundation.org: fix documentation, per Randy] [akpm@linux-foundation.org: fix warning] [akpm@linux-foundation.org: readability/conventionality tweaks] [akpm@linux-foundation.org: fix shm_rmid_forced/shm_forced_rmid confusion, use standard comment layout] Signed-off-by: Vasiliy Kulikov <segoon@openwall.com> Cc: Randy Dunlap <rdunlap@xenotime.net> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: "Serge E. Hallyn" <serge.hallyn@canonical.com> Cc: Daniel Lezcano <daniel.lezcano@free.fr> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Tejun Heo <tj@kernel.org> Cc: Ingo Molnar <mingo@elte.hu> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Solar Designer <solar@openwall.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
128 lines
3.4 KiB
C
128 lines
3.4 KiB
C
#ifndef _LINUX_SHM_H_
|
|
#define _LINUX_SHM_H_
|
|
|
|
#include <linux/ipc.h>
|
|
#include <linux/errno.h>
|
|
#ifdef __KERNEL__
|
|
#include <asm/page.h>
|
|
#else
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
/*
|
|
* SHMMAX, SHMMNI and SHMALL are upper limits are defaults which can
|
|
* be increased by sysctl
|
|
*/
|
|
|
|
#define SHMMAX 0x2000000 /* max shared seg size (bytes) */
|
|
#define SHMMIN 1 /* min shared seg size (bytes) */
|
|
#define SHMMNI 4096 /* max num of segs system wide */
|
|
#ifdef __KERNEL__
|
|
#define SHMALL (SHMMAX/PAGE_SIZE*(SHMMNI/16)) /* max shm system wide (pages) */
|
|
#else
|
|
#define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))
|
|
#endif
|
|
#define SHMSEG SHMMNI /* max shared segs per process */
|
|
|
|
#ifdef __KERNEL__
|
|
#include <asm/shmparam.h>
|
|
#endif
|
|
|
|
/* Obsolete, used only for backwards compatibility and libc5 compiles */
|
|
struct shmid_ds {
|
|
struct ipc_perm shm_perm; /* operation perms */
|
|
int shm_segsz; /* size of segment (bytes) */
|
|
__kernel_time_t shm_atime; /* last attach time */
|
|
__kernel_time_t shm_dtime; /* last detach time */
|
|
__kernel_time_t shm_ctime; /* last change time */
|
|
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
|
|
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
|
|
unsigned short shm_nattch; /* no. of current attaches */
|
|
unsigned short shm_unused; /* compatibility */
|
|
void *shm_unused2; /* ditto - used by DIPC */
|
|
void *shm_unused3; /* unused */
|
|
};
|
|
|
|
/* Include the definition of shmid64_ds and shminfo64 */
|
|
#include <asm/shmbuf.h>
|
|
|
|
/* permission flag for shmget */
|
|
#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */
|
|
#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */
|
|
|
|
/* mode for attach */
|
|
#define SHM_RDONLY 010000 /* read-only access */
|
|
#define SHM_RND 020000 /* round attach address to SHMLBA boundary */
|
|
#define SHM_REMAP 040000 /* take-over region on attach */
|
|
#define SHM_EXEC 0100000 /* execution access */
|
|
|
|
/* super user shmctl commands */
|
|
#define SHM_LOCK 11
|
|
#define SHM_UNLOCK 12
|
|
|
|
/* ipcs ctl commands */
|
|
#define SHM_STAT 13
|
|
#define SHM_INFO 14
|
|
|
|
/* Obsolete, used only for backwards compatibility */
|
|
struct shminfo {
|
|
int shmmax;
|
|
int shmmin;
|
|
int shmmni;
|
|
int shmseg;
|
|
int shmall;
|
|
};
|
|
|
|
struct shm_info {
|
|
int used_ids;
|
|
unsigned long shm_tot; /* total allocated shm */
|
|
unsigned long shm_rss; /* total resident shm */
|
|
unsigned long shm_swp; /* total swapped shm */
|
|
unsigned long swap_attempts;
|
|
unsigned long swap_successes;
|
|
};
|
|
|
|
#ifdef __KERNEL__
|
|
struct shmid_kernel /* private to the kernel */
|
|
{
|
|
struct kern_ipc_perm shm_perm;
|
|
struct file * shm_file;
|
|
unsigned long shm_nattch;
|
|
unsigned long shm_segsz;
|
|
time_t shm_atim;
|
|
time_t shm_dtim;
|
|
time_t shm_ctim;
|
|
pid_t shm_cprid;
|
|
pid_t shm_lprid;
|
|
struct user_struct *mlock_user;
|
|
};
|
|
|
|
/* shm_mode upper byte flags */
|
|
#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);
|
|
extern int is_file_shm_hugepages(struct file *file);
|
|
extern void exit_shm(struct task_struct *task);
|
|
#else
|
|
static inline long do_shmat(int shmid, char __user *shmaddr,
|
|
int shmflg, unsigned long *addr)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
static inline int is_file_shm_hugepages(struct file *file)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline void exit_shm(struct task_struct *task)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _LINUX_SHM_H_ */
|