Branch data Line data Source code
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 : :
19 : : struct user_namespace;
20 : :
21 : : struct ipc_ids {
22 : : int in_use;
23 : : unsigned short seq;
24 : : unsigned short seq_max;
25 : : struct rw_semaphore rwsem;
26 : : struct idr ipcs_idr;
27 : : int next_id;
28 : : };
29 : :
30 : : struct ipc_namespace {
31 : : atomic_t count;
32 : : struct ipc_ids ids[3];
33 : :
34 : : int sem_ctls[4];
35 : : int used_sems;
36 : :
37 : : unsigned int msg_ctlmax;
38 : : unsigned int msg_ctlmnb;
39 : : unsigned 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 : :
75 : : extern struct ipc_namespace init_ipc_ns;
76 : : extern atomic_t nr_ipc_ns;
77 : :
78 : : extern spinlock_t mq_lock;
79 : :
80 : : #ifdef CONFIG_SYSVIPC
81 : : extern int register_ipcns_notifier(struct ipc_namespace *);
82 : : extern int cond_register_ipcns_notifier(struct ipc_namespace *);
83 : : extern void unregister_ipcns_notifier(struct ipc_namespace *);
84 : : extern int ipcns_notify(unsigned long);
85 : : extern void shm_destroy_orphaned(struct ipc_namespace *ns);
86 : : #else /* CONFIG_SYSVIPC */
87 : : static inline int register_ipcns_notifier(struct ipc_namespace *ns)
88 : : { return 0; }
89 : : static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
90 : : { return 0; }
91 : : static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
92 : : static inline int ipcns_notify(unsigned long l) { return 0; }
93 : : static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {}
94 : : #endif /* CONFIG_SYSVIPC */
95 : :
96 : : #ifdef CONFIG_POSIX_MQUEUE
97 : : extern 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
134 : : static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
135 : : #endif
136 : :
137 : : #if defined(CONFIG_IPC_NS)
138 : : extern struct ipc_namespace *copy_ipcs(unsigned long flags,
139 : : struct user_namespace *user_ns, struct ipc_namespace *ns);
140 : :
141 : : static 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 : :
148 : : extern void put_ipc_ns(struct ipc_namespace *ns);
149 : : #else
150 : : static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
151 : : struct user_namespace *user_ns, struct ipc_namespace *ns)
152 : : {
153 [ + + ]: 5 : if (flags & CLONE_NEWIPC)
154 : : return ERR_PTR(-EINVAL);
155 : :
156 : : return ns;
157 : : }
158 : :
159 : : static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
160 : : {
161 : : return ns;
162 : : }
163 : :
164 : : static inline void put_ipc_ns(struct ipc_namespace *ns)
165 : : {
166 : : }
167 : : #endif
168 : :
169 : : #ifdef CONFIG_POSIX_MQUEUE_SYSCTL
170 : :
171 : : struct ctl_table_header;
172 : : extern struct ctl_table_header *mq_register_sysctl_table(void);
173 : :
174 : : #else /* CONFIG_POSIX_MQUEUE_SYSCTL */
175 : :
176 : : static inline struct ctl_table_header *mq_register_sysctl_table(void)
177 : : {
178 : : return NULL;
179 : : }
180 : :
181 : : #endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
182 : : #endif
|