diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 06:16:15 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-02-19 06:16:15 +0000 |
commit | 34e3b522eca7e8741cecb7c2241091f181d1bd1f (patch) | |
tree | 3b64ac3aa4603539b8f8f384bc39998e29948900 /libdde_linux26/contrib/include/linux/ipc_namespace.h | |
parent | d4e6a14eb3fad1b43a21214db139db441025baf5 (diff) | |
parent | 6fafeb146e9efd59140ea58cebd7dd38ae9a6379 (diff) |
Merge branch 'upstream-merged'
Diffstat (limited to 'libdde_linux26/contrib/include/linux/ipc_namespace.h')
-rw-r--r-- | libdde_linux26/contrib/include/linux/ipc_namespace.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/libdde_linux26/contrib/include/linux/ipc_namespace.h b/libdde_linux26/contrib/include/linux/ipc_namespace.h new file mode 100644 index 00000000..ea330f9e --- /dev/null +++ b/libdde_linux26/contrib/include/linux/ipc_namespace.h @@ -0,0 +1,102 @@ +#ifndef __IPC_NAMESPACE_H__ +#define __IPC_NAMESPACE_H__ + +#include <linux/err.h> +#include <linux/idr.h> +#include <linux/rwsem.h> +#include <linux/notifier.h> + +/* + * ipc namespace events + */ +#define IPCNS_MEMCHANGED 0x00000001 /* Notify lowmem size changed */ +#define IPCNS_CREATED 0x00000002 /* Notify new ipc namespace created */ +#define IPCNS_REMOVED 0x00000003 /* Notify ipc namespace removed */ + +#define IPCNS_CALLBACK_PRI 0 + + +struct ipc_ids { + int in_use; + unsigned short seq; + unsigned short seq_max; + struct rw_semaphore rw_mutex; + struct idr ipcs_idr; +}; + +struct ipc_namespace { + struct kref kref; + struct ipc_ids ids[3]; + + int sem_ctls[4]; + int used_sems; + + int msg_ctlmax; + int msg_ctlmnb; + int msg_ctlmni; + atomic_t msg_bytes; + atomic_t msg_hdrs; + int auto_msgmni; + + size_t shm_ctlmax; + size_t shm_ctlall; + int shm_ctlmni; + int shm_tot; + + struct notifier_block ipcns_nb; +}; + +extern struct ipc_namespace init_ipc_ns; +extern atomic_t nr_ipc_ns; + +#ifdef CONFIG_SYSVIPC +#define INIT_IPC_NS(ns) .ns = &init_ipc_ns, + +extern int register_ipcns_notifier(struct ipc_namespace *); +extern int cond_register_ipcns_notifier(struct ipc_namespace *); +extern void unregister_ipcns_notifier(struct ipc_namespace *); +extern int ipcns_notify(unsigned long); + +#else /* CONFIG_SYSVIPC */ +#define INIT_IPC_NS(ns) +#endif /* CONFIG_SYSVIPC */ + +#if defined(CONFIG_SYSVIPC) && defined(CONFIG_IPC_NS) +extern void free_ipc_ns(struct kref *kref); +extern struct ipc_namespace *copy_ipcs(unsigned long flags, + struct ipc_namespace *ns); +extern void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids, + void (*free)(struct ipc_namespace *, + struct kern_ipc_perm *)); + +static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) +{ + if (ns) + kref_get(&ns->kref); + return ns; +} + +static inline void put_ipc_ns(struct ipc_namespace *ns) +{ + kref_put(&ns->kref, free_ipc_ns); +} +#else +static inline struct ipc_namespace *copy_ipcs(unsigned long flags, + struct ipc_namespace *ns) +{ + if (flags & CLONE_NEWIPC) + return ERR_PTR(-EINVAL); + + return ns; +} + +static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) +{ + return ns; +} + +static inline void put_ipc_ns(struct ipc_namespace *ns) +{ +} +#endif +#endif |