The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ipc/util.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 #include <linux/unistd.h>
   14 #include <linux/err.h>
   15 
   16 #define SEQ_MULTIPLIER  (IPCMNI)
   17 
   18 void sem_init (void);
   19 void msg_init (void);
   20 void shm_init (void);
   21 
   22 struct ipc_namespace;
   23 
   24 #ifdef CONFIG_POSIX_MQUEUE
   25 extern void mq_clear_sbinfo(struct ipc_namespace *ns);
   26 extern void mq_put_mnt(struct ipc_namespace *ns);
   27 #else
   28 static inline void mq_clear_sbinfo(struct ipc_namespace *ns) { }
   29 static inline void mq_put_mnt(struct ipc_namespace *ns) { }
   30 #endif
   31 
   32 #ifdef CONFIG_SYSVIPC
   33 void sem_init_ns(struct ipc_namespace *ns);
   34 void msg_init_ns(struct ipc_namespace *ns);
   35 void shm_init_ns(struct ipc_namespace *ns);
   36 
   37 void sem_exit_ns(struct ipc_namespace *ns);
   38 void msg_exit_ns(struct ipc_namespace *ns);
   39 void shm_exit_ns(struct ipc_namespace *ns);
   40 #else
   41 static inline void sem_init_ns(struct ipc_namespace *ns) { }
   42 static inline void msg_init_ns(struct ipc_namespace *ns) { }
   43 static inline void shm_init_ns(struct ipc_namespace *ns) { }
   44 
   45 static inline void sem_exit_ns(struct ipc_namespace *ns) { }
   46 static inline void msg_exit_ns(struct ipc_namespace *ns) { }
   47 static inline void shm_exit_ns(struct ipc_namespace *ns) { }
   48 #endif
   49 
   50 /*
   51  * Structure that holds the parameters needed by the ipc operations
   52  * (see after)
   53  */
   54 struct ipc_params {
   55         key_t key;
   56         int flg;
   57         union {
   58                 size_t size;    /* for shared memories */
   59                 int nsems;      /* for semaphores */
   60         } u;                    /* holds the getnew() specific param */
   61 };
   62 
   63 /*
   64  * Structure that holds some ipc operations. This structure is used to unify
   65  * the calls to sys_msgget(), sys_semget(), sys_shmget()
   66  *      . routine to call to create a new ipc object. Can be one of newque,
   67  *        newary, newseg
   68  *      . routine to call to check permissions for a new ipc object.
   69  *        Can be one of security_msg_associate, security_sem_associate,
   70  *        security_shm_associate
   71  *      . routine to call for an extra check if needed
   72  */
   73 struct ipc_ops {
   74         int (*getnew) (struct ipc_namespace *, struct ipc_params *);
   75         int (*associate) (struct kern_ipc_perm *, int);
   76         int (*more_checks) (struct kern_ipc_perm *, struct ipc_params *);
   77 };
   78 
   79 struct seq_file;
   80 struct ipc_ids;
   81 
   82 void ipc_init_ids(struct ipc_ids *);
   83 #ifdef CONFIG_PROC_FS
   84 void __init ipc_init_proc_interface(const char *path, const char *header,
   85                 int ids, int (*show)(struct seq_file *, void *));
   86 #else
   87 #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
   88 #endif
   89 
   90 #define IPC_SEM_IDS     0
   91 #define IPC_MSG_IDS     1
   92 #define IPC_SHM_IDS     2
   93 
   94 #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
   95 #define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER)
   96 
   97 /* must be called with ids->rw_mutex acquired for writing */
   98 int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
   99 
  100 /* must be called with ids->rw_mutex acquired for reading */
  101 int ipc_get_maxid(struct ipc_ids *);
  102 
  103 /* must be called with both locks acquired. */
  104 void ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *);
  105 
  106 /* must be called with ipcp locked */
  107 int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg);
  108 
  109 /* for rare, potentially huge allocations.
  110  * both function can sleep
  111  */
  112 void* ipc_alloc(int size);
  113 void ipc_free(void* ptr, int size);
  114 
  115 /*
  116  * For allocation that need to be freed by RCU.
  117  * Objects are reference counted, they start with reference count 1.
  118  * getref increases the refcount, the putref call that reduces the recount
  119  * to 0 schedules the rcu destruction. Caller must guarantee locking.
  120  */
  121 void* ipc_rcu_alloc(int size);
  122 void ipc_rcu_getref(void *ptr);
  123 void ipc_rcu_putref(void *ptr);
  124 
  125 struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int);
  126 
  127 void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
  128 void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
  129 int ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out);
  130 struct kern_ipc_perm *ipcctl_pre_down(struct ipc_namespace *ns,
  131                                       struct ipc_ids *ids, int id, int cmd,
  132                                       struct ipc64_perm *perm, int extra_perm);
  133 
  134 #ifndef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
  135   /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
  136 # define ipc_parse_version(cmd) IPC_64
  137 #else
  138 int ipc_parse_version (int *cmd);
  139 #endif
  140 
  141 extern void free_msg(struct msg_msg *msg);
  142 extern struct msg_msg *load_msg(const void __user *src, int len);
  143 extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst);
  144 extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
  145 
  146 extern void recompute_msgmni(struct ipc_namespace *);
  147 
  148 static inline int ipc_buildid(int id, int seq)
  149 {
  150         return SEQ_MULTIPLIER * seq + id;
  151 }
  152 
  153 /*
  154  * Must be called with ipcp locked
  155  */
  156 static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int uid)
  157 {
  158         if (uid / SEQ_MULTIPLIER != ipcp->seq)
  159                 return 1;
  160         return 0;
  161 }
  162 
  163 static inline void ipc_lock_by_ptr(struct kern_ipc_perm *perm)
  164 {
  165         rcu_read_lock();
  166         spin_lock(&perm->lock);
  167 }
  168 
  169 static inline void ipc_unlock(struct kern_ipc_perm *perm)
  170 {
  171         spin_unlock(&perm->lock);
  172         rcu_read_unlock();
  173 }
  174 
  175 struct kern_ipc_perm *ipc_lock_check(struct ipc_ids *ids, int id);
  176 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
  177                         struct ipc_ops *ops, struct ipc_params *params);
  178 void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
  179                 void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
  180 #endif

Cache object: 3bf0d868322fec578a4cdd170bcc5e3e


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.