linux/include/linux/ipc_namespace.h
<<
>>
Prefs
   1#ifndef __IPC_NAMESPACE_H__
   2#define __IPC_NAMESPACE_H__
   3
   4#include <linux/err.h>
   5#include <linux/idr.h>
   6#include <linux/rwsem.h>
   7#include <linux/notifier.h>
   8#include <linux/nsproxy.h>
   9
  10/*
  11 * ipc namespace events
  12 */
  13#define IPCNS_MEMCHANGED   0x00000001   /* Notify lowmem size changed */
  14#define IPCNS_CREATED  0x00000002   /* Notify new ipc namespace created */
  15#define IPCNS_REMOVED  0x00000003   /* Notify ipc namespace removed */
  16
  17#define IPCNS_CALLBACK_PRI 0
  18
  19struct user_namespace;
  20
  21struct ipc_ids {
  22        int in_use;
  23        unsigned short seq;
  24        unsigned short seq_max;
  25        struct rw_semaphore rw_mutex;
  26        struct idr ipcs_idr;
  27        int next_id;
  28};
  29
  30struct ipc_namespace {
  31        atomic_t        count;
  32        struct ipc_ids  ids[3];
  33
  34        int             sem_ctls[4];
  35        int             used_sems;
  36
  37        int             msg_ctlmax;
  38        int             msg_ctlmnb;
  39        int             msg_ctlmni;
  40        atomic_t        msg_bytes;
  41        atomic_t        msg_hdrs;
  42        int             auto_msgmni;
  43
  44        size_t          shm_ctlmax;
  45        size_t          shm_ctlall;
  46        unsigned long   shm_tot;
  47        int             shm_ctlmni;
  48        /*
  49         * Defines whether IPC_RMID is forced for _all_ shm segments regardless
  50         * of shmctl()
  51         */
  52        int             shm_rmid_forced;
  53
  54        struct notifier_block ipcns_nb;
  55
  56        /* The kern_mount of the mqueuefs sb.  We take a ref on it */
  57        struct vfsmount *mq_mnt;
  58
  59        /* # queues in this ns, protected by mq_lock */
  60        unsigned int    mq_queues_count;
  61
  62        /* next fields are set through sysctl */
  63        unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
  64        unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
  65        unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
  66        unsigned int    mq_msg_default;
  67        unsigned int    mq_msgsize_default;
  68
  69        /* user_ns which owns the ipc ns */
  70        struct user_namespace *user_ns;
  71
  72        unsigned int    proc_inum;
  73};
  74
  75extern struct ipc_namespace init_ipc_ns;
  76extern atomic_t nr_ipc_ns;
  77
  78extern spinlock_t mq_lock;
  79
  80#ifdef CONFIG_SYSVIPC
  81extern int register_ipcns_notifier(struct ipc_namespace *);
  82extern int cond_register_ipcns_notifier(struct ipc_namespace *);
  83extern void unregister_ipcns_notifier(struct ipc_namespace *);
  84extern int ipcns_notify(unsigned long);
  85extern void shm_destroy_orphaned(struct ipc_namespace *ns);
  86#else /* CONFIG_SYSVIPC */
  87static inline int register_ipcns_notifier(struct ipc_namespace *ns)
  88{ return 0; }
  89static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
  90{ return 0; }
  91static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
  92static inline int ipcns_notify(unsigned long l) { return 0; }
  93static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {}
  94#endif /* CONFIG_SYSVIPC */
  95
  96#ifdef CONFIG_POSIX_MQUEUE
  97extern int mq_init_ns(struct ipc_namespace *ns);
  98/*
  99 * POSIX Message Queue default values:
 100 *
 101 * MIN_*: Lowest value an admin can set the maximum unprivileged limit to
 102 * DFLT_*MAX: Default values for the maximum unprivileged limits
 103 * DFLT_{MSG,MSGSIZE}: Default values used when the user doesn't supply
 104 *   an attribute to the open call and the queue must be created
 105 * HARD_*: Highest value the maximums can be set to.  These are enforced
 106 *   on CAP_SYS_RESOURCE apps as well making them inviolate (so make them
 107 *   suitably high)
 108 *
 109 * POSIX Requirements:
 110 *   Per app minimum openable message queues - 8.  This does not map well
 111 *     to the fact that we limit the number of queues on a per namespace
 112 *     basis instead of a per app basis.  So, make the default high enough
 113 *     that no given app should have a hard time opening 8 queues.
 114 *   Minimum maximum for HARD_MSGMAX - 32767.  I bumped this to 65536.
 115 *   Minimum maximum for HARD_MSGSIZEMAX - POSIX is silent on this.  However,
 116 *     we have run into a situation where running applications in the wild
 117 *     require this to be at least 5MB, and preferably 10MB, so I set the
 118 *     value to 16MB in hopes that this user is the worst of the bunch and
 119 *     the new maximum will handle anyone else.  I may have to revisit this
 120 *     in the future.
 121 */
 122#define MIN_QUEUESMAX                   1
 123#define DFLT_QUEUESMAX                256
 124#define HARD_QUEUESMAX               1024
 125#define MIN_MSGMAX                      1
 126#define DFLT_MSG                       10U
 127#define DFLT_MSGMAX                    10
 128#define HARD_MSGMAX                 65536
 129#define MIN_MSGSIZEMAX                128
 130#define DFLT_MSGSIZE                 8192U
 131#define DFLT_MSGSIZEMAX              8192
 132#define HARD_MSGSIZEMAX     (16*1024*1024)
 133#else
 134static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
 135#endif
 136
 137#if defined(CONFIG_IPC_NS)
 138extern struct ipc_namespace *copy_ipcs(unsigned long flags,
 139        struct user_namespace *user_ns, struct ipc_namespace *ns);
 140
 141static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 142{
 143        if (ns)
 144                atomic_inc(&ns->count);
 145        return ns;
 146}
 147
 148extern void put_ipc_ns(struct ipc_namespace *ns);
 149#else
 150static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
 151        struct user_namespace *user_ns, struct ipc_namespace *ns)
 152{
 153        if (flags & CLONE_NEWIPC)
 154                return ERR_PTR(-EINVAL);
 155
 156        return ns;
 157}
 158
 159static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 160{
 161        return ns;
 162}
 163
 164static inline void put_ipc_ns(struct ipc_namespace *ns)
 165{
 166}
 167#endif
 168
 169#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
 170
 171struct ctl_table_header;
 172extern struct ctl_table_header *mq_register_sysctl_table(void);
 173
 174#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
 175
 176static inline struct ctl_table_header *mq_register_sysctl_table(void)
 177{
 178        return NULL;
 179}
 180
 181#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
 182#endif
 183