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
   9/*
  10 * ipc namespace events
  11 */
  12#define IPCNS_MEMCHANGED   0x00000001   /* Notify lowmem size changed */
  13#define IPCNS_CREATED  0x00000002   /* Notify new ipc namespace created */
  14#define IPCNS_REMOVED  0x00000003   /* Notify ipc namespace removed */
  15
  16#define IPCNS_CALLBACK_PRI 0
  17
  18
  19struct ipc_ids {
  20        int in_use;
  21        unsigned short seq;
  22        unsigned short seq_max;
  23        struct rw_semaphore rw_mutex;
  24        struct idr ipcs_idr;
  25};
  26
  27struct ipc_namespace {
  28        atomic_t        count;
  29        struct ipc_ids  ids[3];
  30
  31        int             sem_ctls[4];
  32        int             used_sems;
  33
  34        int             msg_ctlmax;
  35        int             msg_ctlmnb;
  36        int             msg_ctlmni;
  37        atomic_t        msg_bytes;
  38        atomic_t        msg_hdrs;
  39        int             auto_msgmni;
  40
  41        size_t          shm_ctlmax;
  42        size_t          shm_ctlall;
  43        int             shm_ctlmni;
  44        int             shm_tot;
  45
  46        struct notifier_block ipcns_nb;
  47
  48        /* The kern_mount of the mqueuefs sb.  We take a ref on it */
  49        struct vfsmount *mq_mnt;
  50
  51        /* # queues in this ns, protected by mq_lock */
  52        unsigned int    mq_queues_count;
  53
  54        /* next fields are set through sysctl */
  55        unsigned int    mq_queues_max;   /* initialized to DFLT_QUEUESMAX */
  56        unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
  57        unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */
  58
  59};
  60
  61extern struct ipc_namespace init_ipc_ns;
  62extern atomic_t nr_ipc_ns;
  63
  64extern spinlock_t mq_lock;
  65#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
  66#define INIT_IPC_NS(ns)         .ns             = &init_ipc_ns,
  67#else
  68#define INIT_IPC_NS(ns)
  69#endif
  70
  71#ifdef CONFIG_SYSVIPC
  72extern int register_ipcns_notifier(struct ipc_namespace *);
  73extern int cond_register_ipcns_notifier(struct ipc_namespace *);
  74extern void unregister_ipcns_notifier(struct ipc_namespace *);
  75extern int ipcns_notify(unsigned long);
  76#else /* CONFIG_SYSVIPC */
  77static inline int register_ipcns_notifier(struct ipc_namespace *ns)
  78{ return 0; }
  79static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
  80{ return 0; }
  81static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
  82static inline int ipcns_notify(unsigned long l) { return 0; }
  83#endif /* CONFIG_SYSVIPC */
  84
  85#ifdef CONFIG_POSIX_MQUEUE
  86extern int mq_init_ns(struct ipc_namespace *ns);
  87/* default values */
  88#define DFLT_QUEUESMAX 256     /* max number of message queues */
  89#define DFLT_MSGMAX    10      /* max number of messages in each queue */
  90#define HARD_MSGMAX    (131072/sizeof(void *))
  91#define DFLT_MSGSIZEMAX 8192   /* max message size */
  92#else
  93static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
  94#endif
  95
  96#if defined(CONFIG_IPC_NS)
  97extern struct ipc_namespace *copy_ipcs(unsigned long flags,
  98                                       struct ipc_namespace *ns);
  99static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 100{
 101        if (ns)
 102                atomic_inc(&ns->count);
 103        return ns;
 104}
 105
 106extern void put_ipc_ns(struct ipc_namespace *ns);
 107#else
 108static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
 109                struct ipc_namespace *ns)
 110{
 111        if (flags & CLONE_NEWIPC)
 112                return ERR_PTR(-EINVAL);
 113
 114        return ns;
 115}
 116
 117static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 118{
 119        return ns;
 120}
 121
 122static inline void put_ipc_ns(struct ipc_namespace *ns)
 123{
 124}
 125#endif
 126
 127#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
 128
 129struct ctl_table_header;
 130extern struct ctl_table_header *mq_register_sysctl_table(void);
 131
 132#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
 133
 134static inline struct ctl_table_header *mq_register_sysctl_table(void)
 135{
 136        return NULL;
 137}
 138
 139#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
 140#endif
 141