Commit 614b84cf authored by Serge E. Hallyn's avatar Serge E. Hallyn Committed by Linus Torvalds

namespaces: mqueue ns: move mqueue_mnt into struct ipc_namespace

Move mqueue vfsmount plus a few tunables into the ipc_namespace struct.
The CONFIG_IPC_NS boolean and the ipc_namespace struct will serve both the
posix message queue namespaces and the SYSV ipc namespaces.

The sysctl code will be fixed separately in patch 3.  After just this
patch, making a change to posix mqueue tunables always changes the values
in the initial ipc namespace.
Signed-off-by: default avatarCedric Le Goater <clg@fr.ibm.com>
Signed-off-by: default avatarSerge E. Hallyn <serue@us.ibm.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 909e6d94
...@@ -44,24 +44,55 @@ struct ipc_namespace { ...@@ -44,24 +44,55 @@ struct ipc_namespace {
int shm_tot; int shm_tot;
struct notifier_block ipcns_nb; struct notifier_block ipcns_nb;
/* The kern_mount of the mqueuefs sb. We take a ref on it */
struct vfsmount *mq_mnt;
/* # queues in this ns, protected by mq_lock */
unsigned int mq_queues_count;
/* next fields are set through sysctl */
unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */
unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */
unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */
}; };
extern struct ipc_namespace init_ipc_ns; extern struct ipc_namespace init_ipc_ns;
extern atomic_t nr_ipc_ns; extern atomic_t nr_ipc_ns;
#ifdef CONFIG_SYSVIPC #if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
#define INIT_IPC_NS(ns) .ns = &init_ipc_ns, #define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
#else
#define INIT_IPC_NS(ns)
#endif
#ifdef CONFIG_SYSVIPC
extern int register_ipcns_notifier(struct ipc_namespace *); extern int register_ipcns_notifier(struct ipc_namespace *);
extern int cond_register_ipcns_notifier(struct ipc_namespace *); extern int cond_register_ipcns_notifier(struct ipc_namespace *);
extern void unregister_ipcns_notifier(struct ipc_namespace *); extern void unregister_ipcns_notifier(struct ipc_namespace *);
extern int ipcns_notify(unsigned long); extern int ipcns_notify(unsigned long);
#else /* CONFIG_SYSVIPC */ #else /* CONFIG_SYSVIPC */
#define INIT_IPC_NS(ns) static inline int register_ipcns_notifier(struct ipc_namespace *ns)
{ return 0; }
static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
{ return 0; }
static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
static inline int ipcns_notify(unsigned long l) { return 0; }
#endif /* CONFIG_SYSVIPC */ #endif /* CONFIG_SYSVIPC */
#if defined(CONFIG_SYSVIPC) && defined(CONFIG_IPC_NS) #ifdef CONFIG_POSIX_MQUEUE
extern void mq_init_ns(struct ipc_namespace *ns);
/* default values */
#define DFLT_QUEUESMAX 256 /* max number of message queues */
#define DFLT_MSGMAX 10 /* max number of messages in each queue */
#define HARD_MSGMAX (131072/sizeof(void *))
#define DFLT_MSGSIZEMAX 8192 /* max message size */
#else
#define mq_init_ns(ns) ((void) 0)
#endif
#if defined(CONFIG_IPC_NS)
extern void free_ipc_ns(struct kref *kref); extern void free_ipc_ns(struct kref *kref);
extern struct ipc_namespace *copy_ipcs(unsigned long flags, extern struct ipc_namespace *copy_ipcs(unsigned long flags,
struct ipc_namespace *ns); struct ipc_namespace *ns);
......
...@@ -670,10 +670,10 @@ config UTS_NS ...@@ -670,10 +670,10 @@ config UTS_NS
config IPC_NS config IPC_NS
bool "IPC namespace" bool "IPC namespace"
depends on NAMESPACES && SYSVIPC depends on NAMESPACES && (SYSVIPC || POSIX_MQUEUE)
help help
In this namespace tasks work with IPC ids which correspond to In this namespace tasks work with IPC ids which correspond to
different IPC objects in different namespaces different IPC objects in different namespaces.
config USER_NS config USER_NS
bool "User namespace (EXPERIMENTAL)" bool "User namespace (EXPERIMENTAL)"
......
This diff is collapsed.
...@@ -13,10 +13,32 @@ ...@@ -13,10 +13,32 @@
#include <linux/security.h> #include <linux/security.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/ipc.h> #include <linux/ipc.h>
#include <linux/ipc_namespace.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "util.h" #include "util.h"
/*
* The next 2 defines are here bc this is the only file
* compiled when either CONFIG_SYSVIPC and CONFIG_POSIX_MQUEUE
* and not CONFIG_IPC_NS.
*/
struct ipc_namespace init_ipc_ns = {
.kref = {
/* It's not for this patch to change, but should this be 1? */
.refcount = ATOMIC_INIT(2),
},
#ifdef CONFIG_POSIX_MQUEUE
.mq_mnt = NULL,
.mq_queues_count = 0,
.mq_queues_max = DFLT_QUEUESMAX,
.mq_msg_max = DFLT_MSGMAX,
.mq_msgsize_max = DFLT_MSGSIZEMAX,
#endif
};
atomic_t nr_ipc_ns = ATOMIC_INIT(1);
struct msg_msgseg { struct msg_msgseg {
struct msg_msgseg* next; struct msg_msgseg* next;
/* the next part of the message follows immediately */ /* the next part of the message follows immediately */
......
...@@ -25,6 +25,7 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns) ...@@ -25,6 +25,7 @@ static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
sem_init_ns(ns); sem_init_ns(ns);
msg_init_ns(ns); msg_init_ns(ns);
shm_init_ns(ns); shm_init_ns(ns);
mq_init_ns(ns);
/* /*
* msgmni has already been computed for the new ipc ns. * msgmni has already been computed for the new ipc ns.
...@@ -101,6 +102,7 @@ void free_ipc_ns(struct kref *kref) ...@@ -101,6 +102,7 @@ void free_ipc_ns(struct kref *kref)
sem_exit_ns(ns); sem_exit_ns(ns);
msg_exit_ns(ns); msg_exit_ns(ns);
shm_exit_ns(ns); shm_exit_ns(ns);
mq_exit_ns(ns);
kfree(ns); kfree(ns);
atomic_dec(&nr_ipc_ns); atomic_dec(&nr_ipc_ns);
......
...@@ -47,15 +47,6 @@ struct ipc_proc_iface { ...@@ -47,15 +47,6 @@ struct ipc_proc_iface {
int (*show)(struct seq_file *, void *); int (*show)(struct seq_file *, void *);
}; };
struct ipc_namespace init_ipc_ns = {
.kref = {
.refcount = ATOMIC_INIT(2),
},
};
atomic_t nr_ipc_ns = ATOMIC_INIT(1);
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
static void ipc_memory_notifier(struct work_struct *work) static void ipc_memory_notifier(struct work_struct *work)
......
...@@ -20,6 +20,13 @@ void shm_init (void); ...@@ -20,6 +20,13 @@ void shm_init (void);
struct ipc_namespace; struct ipc_namespace;
#ifdef CONFIG_POSIX_MQUEUE
void mq_exit_ns(struct ipc_namespace *ns);
#else
static inline void mq_exit_ns(struct ipc_namespace *ns) { }
#endif
#ifdef CONFIG_SYSVIPC
void sem_init_ns(struct ipc_namespace *ns); void sem_init_ns(struct ipc_namespace *ns);
void msg_init_ns(struct ipc_namespace *ns); void msg_init_ns(struct ipc_namespace *ns);
void shm_init_ns(struct ipc_namespace *ns); void shm_init_ns(struct ipc_namespace *ns);
...@@ -27,6 +34,15 @@ void shm_init_ns(struct ipc_namespace *ns); ...@@ -27,6 +34,15 @@ void shm_init_ns(struct ipc_namespace *ns);
void sem_exit_ns(struct ipc_namespace *ns); void sem_exit_ns(struct ipc_namespace *ns);
void msg_exit_ns(struct ipc_namespace *ns); void msg_exit_ns(struct ipc_namespace *ns);
void shm_exit_ns(struct ipc_namespace *ns); void shm_exit_ns(struct ipc_namespace *ns);
#else
static inline void sem_init_ns(struct ipc_namespace *ns) { }
static inline void msg_init_ns(struct ipc_namespace *ns) { }
static inline void shm_init_ns(struct ipc_namespace *ns) { }
static inline void sem_exit_ns(struct ipc_namespace *ns) { }
static inline void msg_exit_ns(struct ipc_namespace *ns) { }
static inline void shm_exit_ns(struct ipc_namespace *ns) { }
#endif
/* /*
* Structure that holds the parameters needed by the ipc operations * Structure that holds the parameters needed by the ipc operations
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment