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};
  28
  29struct ipc_namespace {
  30        atomic_t        count;
  31        struct ipc_ids  ids[3];
  32
  33        int             sem_ctls[4];
  34        int             used_sems;
  35
  36        int             msg_ctlmax;
  37        int             msg_ctlmnb;
  38        int             msg_ctlmni;
  39        atomic_t        msg_bytes;
  40        atomic_t        msg_hdrs;
  41        int             auto_msgmni;
  42
  43        size_t          shm_ctlmax;
  44        size_t          shm_ctlall;
  45        int             shm_ctlmni;
  46        int             shm_tot;
  47        /*
  48         * Defines whether IPC_RMID is forced for _all_ shm segments regardless
  49         * of shmctl()
  50         */
  51        int             shm_rmid_forced;
  52
  53        struct notifier_block ipcns_nb;
  54
  55        /* The kern_mount of the mqueuefs sb.  We take a ref on it */
  56        struct vfsmount *mq_mnt;
  57
  58        /* # queues in this ns, protected by mq_lock */
  59        unsigned int    mq_queues_count;
  60
  61        /* next fields are set through sysctl */
  62        unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
  63        unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
  64        unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
  65
  66        /* user_ns which owns the ipc ns */
  67        struct user_namespace *user_ns;
  68};
  69
  70extern struct ipc_namespace init_ipc_ns;
  71extern atomic_t nr_ipc_ns;
  72
  73extern spinlock_t mq_lock;
  74
  75#ifdef CONFIG_SYSVIPC
  76extern int register_ipcns_notifier(struct ipc_namespace *);
  77extern int cond_register_ipcns_notifier(struct ipc_namespace *);
  78extern void unregister_ipcns_notifier(struct ipc_namespace *);
  79extern int ipcns_notify(unsigned long);
  80extern void shm_destroy_orphaned(struct ipc_namespace *ns);
  81#else /* CONFIG_SYSVIPC */
  82static inline int register_ipcns_notifier(struct ipc_namespace *ns)
  83{ return 0; }
  84static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
  85{ return 0; }
  86static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
  87static inline int ipcns_notify(unsigned long l) { return 0; }
  88static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {}
  89#endif /* CONFIG_SYSVIPC */
  90
  91#ifdef CONFIG_POSIX_MQUEUE
  92extern int mq_init_ns(struct ipc_namespace *ns);
  93/* default values */
  94#define DFLT_QUEUESMAX 256     /* max number of message queues */
  95#define DFLT_MSGMAX    10      /* max number of messages in each queue */
  96#define HARD_MSGMAX    (32768*sizeof(void *)/4)
  97#define DFLT_MSGSIZEMAX 8192   /* max message size */
  98#else
  99static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
 100#endif
 101
 102#if defined(CONFIG_IPC_NS)
 103extern struct ipc_namespace *copy_ipcs(unsigned long flags,
 104                                       struct task_struct *tsk);
 105static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 106{
 107        if (ns)
 108                atomic_inc(&ns->count);
 109        return ns;
 110}
 111
 112extern void put_ipc_ns(struct ipc_namespace *ns);
 113#else
 114static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
 115                                              struct task_struct *tsk)
 116{
 117        if (flags & CLONE_NEWIPC)
 118                return ERR_PTR(-EINVAL);
 119
 120        return tsk->nsproxy->ipc_ns;
 121}
 122
 123static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 124{
 125        return ns;
 126}
 127
 128static inline void put_ipc_ns(struct ipc_namespace *ns)
 129{
 130}
 131#endif
 132
 133#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
 134
 135struct ctl_table_header;
 136extern struct ctl_table_header *mq_register_sysctl_table(void);
 137
 138#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
 139
 140static inline struct ctl_table_header *mq_register_sysctl_table(void)
 141{
 142        return NULL;
 143}
 144
 145#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
 146#endif
 147