linux/ipc/util.h
<<
>>
Prefs
   1/*
   2 * linux/ipc/util.h
   3 * Copyright (C) 1999 Christoph Rohland
   4 *
   5 * ipc helper functions (c) 1999 Manfred Spraul <manfred@colorfullife.com>
   6 * namespaces support.      2006 OpenVZ, SWsoft Inc.
   7 *                               Pavel Emelianov <xemul@openvz.org>
   8 */
   9
  10#ifndef _IPC_UTIL_H
  11#define _IPC_UTIL_H
  12
  13#define USHRT_MAX 0xffff
  14#define SEQ_MULTIPLIER  (IPCMNI)
  15
  16void sem_init (void);
  17void msg_init (void);
  18void shm_init (void);
  19
  20int sem_init_ns(struct ipc_namespace *ns);
  21int msg_init_ns(struct ipc_namespace *ns);
  22int shm_init_ns(struct ipc_namespace *ns);
  23
  24void sem_exit_ns(struct ipc_namespace *ns);
  25void msg_exit_ns(struct ipc_namespace *ns);
  26void shm_exit_ns(struct ipc_namespace *ns);
  27
  28struct ipc_id_ary {
  29        int size;
  30        struct kern_ipc_perm *p[0];
  31};
  32
  33struct ipc_ids {
  34        int in_use;
  35        int max_id;
  36        unsigned short seq;
  37        unsigned short seq_max;
  38        struct mutex mutex;
  39        struct ipc_id_ary nullentry;
  40        struct ipc_id_ary* entries;
  41};
  42
  43struct seq_file;
  44#ifdef CONFIG_IPC_NS
  45#define __ipc_init
  46#else
  47#define __ipc_init      __init
  48#endif
  49void __ipc_init ipc_init_ids(struct ipc_ids *ids, int size);
  50#ifdef CONFIG_PROC_FS
  51void __init ipc_init_proc_interface(const char *path, const char *header,
  52                int ids, int (*show)(struct seq_file *, void *));
  53#else
  54#define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
  55#endif
  56
  57#define IPC_SEM_IDS     0
  58#define IPC_MSG_IDS     1
  59#define IPC_SHM_IDS     2
  60
  61/* must be called with ids->mutex acquired.*/
  62int ipc_findkey(struct ipc_ids* ids, key_t key);
  63int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size);
  64
  65/* must be called with both locks acquired. */
  66struct kern_ipc_perm* ipc_rmid(struct ipc_ids* ids, int id);
  67
  68int ipcperms (struct kern_ipc_perm *ipcp, short flg);
  69
  70/* for rare, potentially huge allocations.
  71 * both function can sleep
  72 */
  73void* ipc_alloc(int size);
  74void ipc_free(void* ptr, int size);
  75
  76/*
  77 * For allocation that need to be freed by RCU.
  78 * Objects are reference counted, they start with reference count 1.
  79 * getref increases the refcount, the putref call that reduces the recount
  80 * to 0 schedules the rcu destruction. Caller must guarantee locking.
  81 */
  82void* ipc_rcu_alloc(int size);
  83void ipc_rcu_getref(void *ptr);
  84void ipc_rcu_putref(void *ptr);
  85
  86static inline void __ipc_fini_ids(struct ipc_ids *ids,
  87                struct ipc_id_ary *entries)
  88{
  89        if (entries != &ids->nullentry)
  90                ipc_rcu_putref(entries);
  91}
  92
  93static inline void ipc_fini_ids(struct ipc_ids *ids)
  94{
  95        __ipc_fini_ids(ids, ids->entries);
  96}
  97
  98struct kern_ipc_perm* ipc_get(struct ipc_ids* ids, int id);
  99struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id);
 100void ipc_lock_by_ptr(struct kern_ipc_perm *ipcp);
 101void ipc_unlock(struct kern_ipc_perm* perm);
 102int ipc_buildid(struct ipc_ids* ids, int id, int seq);
 103int ipc_checkid(struct ipc_ids* ids, struct kern_ipc_perm* ipcp, int uid);
 104
 105void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
 106void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
 107
 108#if defined(__ia64__) || defined(__x86_64__) || defined(__hppa__) || defined(__XTENSA__)
 109  /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
 110# define ipc_parse_version(cmd) IPC_64
 111#else
 112int ipc_parse_version (int *cmd);
 113#endif
 114
 115extern void free_msg(struct msg_msg *msg);
 116extern struct msg_msg *load_msg(const void __user *src, int len);
 117extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
 118
 119#endif
 120
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.