LCOV - code coverage report
Current view: top level - ipc - util.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 3 3 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 5 10 50.0 %

           Branch data     Line data    Source code
       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                 :            : struct ipc_rcu {
      51                 :            :         struct rcu_head rcu;
      52                 :            :         atomic_t refcount;
      53                 :            : } ____cacheline_aligned_in_smp;
      54                 :            : 
      55                 :            : #define ipc_rcu_to_struct(p)  ((void *)(p+1))
      56                 :            : 
      57                 :            : /*
      58                 :            :  * Structure that holds the parameters needed by the ipc operations
      59                 :            :  * (see after)
      60                 :            :  */
      61                 :            : struct ipc_params {
      62                 :            :         key_t key;
      63                 :            :         int flg;
      64                 :            :         union {
      65                 :            :                 size_t size;    /* for shared memories */
      66                 :            :                 int nsems;      /* for semaphores */
      67                 :            :         } u;                    /* holds the getnew() specific param */
      68                 :            : };
      69                 :            : 
      70                 :            : /*
      71                 :            :  * Structure that holds some ipc operations. This structure is used to unify
      72                 :            :  * the calls to sys_msgget(), sys_semget(), sys_shmget()
      73                 :            :  *      . routine to call to create a new ipc object. Can be one of newque,
      74                 :            :  *        newary, newseg
      75                 :            :  *      . routine to call to check permissions for a new ipc object.
      76                 :            :  *        Can be one of security_msg_associate, security_sem_associate,
      77                 :            :  *        security_shm_associate
      78                 :            :  *      . routine to call for an extra check if needed
      79                 :            :  */
      80                 :            : struct ipc_ops {
      81                 :            :         int (*getnew) (struct ipc_namespace *, struct ipc_params *);
      82                 :            :         int (*associate) (struct kern_ipc_perm *, int);
      83                 :            :         int (*more_checks) (struct kern_ipc_perm *, struct ipc_params *);
      84                 :            : };
      85                 :            : 
      86                 :            : struct seq_file;
      87                 :            : struct ipc_ids;
      88                 :            : 
      89                 :            : void ipc_init_ids(struct ipc_ids *);
      90                 :            : #ifdef CONFIG_PROC_FS
      91                 :            : void __init ipc_init_proc_interface(const char *path, const char *header,
      92                 :            :                 int ids, int (*show)(struct seq_file *, void *));
      93                 :            : #else
      94                 :            : #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
      95                 :            : #endif
      96                 :            : 
      97                 :            : #define IPC_SEM_IDS     0
      98                 :            : #define IPC_MSG_IDS     1
      99                 :            : #define IPC_SHM_IDS     2
     100                 :            : 
     101                 :            : #define ipcid_to_idx(id) ((id) % SEQ_MULTIPLIER)
     102                 :            : #define ipcid_to_seqx(id) ((id) / SEQ_MULTIPLIER)
     103                 :            : 
     104                 :            : /* must be called with ids->rwsem acquired for writing */
     105                 :            : int ipc_addid(struct ipc_ids *, struct kern_ipc_perm *, int);
     106                 :            : 
     107                 :            : /* must be called with ids->rwsem acquired for reading */
     108                 :            : int ipc_get_maxid(struct ipc_ids *);
     109                 :            : 
     110                 :            : /* must be called with both locks acquired. */
     111                 :            : void ipc_rmid(struct ipc_ids *, struct kern_ipc_perm *);
     112                 :            : 
     113                 :            : /* must be called with ipcp locked */
     114                 :            : int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg);
     115                 :            : 
     116                 :            : /* for rare, potentially huge allocations.
     117                 :            :  * both function can sleep
     118                 :            :  */
     119                 :            : void* ipc_alloc(int size);
     120                 :            : void ipc_free(void* ptr, int size);
     121                 :            : 
     122                 :            : /*
     123                 :            :  * For allocation that need to be freed by RCU.
     124                 :            :  * Objects are reference counted, they start with reference count 1.
     125                 :            :  * getref increases the refcount, the putref call that reduces the recount
     126                 :            :  * to 0 schedules the rcu destruction. Caller must guarantee locking.
     127                 :            :  */
     128                 :            : void* ipc_rcu_alloc(int size);
     129                 :            : int ipc_rcu_getref(void *ptr);
     130                 :            : void ipc_rcu_putref(void *ptr, void (*func)(struct rcu_head *head));
     131                 :            : void ipc_rcu_free(struct rcu_head *head);
     132                 :            : 
     133                 :            : struct kern_ipc_perm *ipc_lock(struct ipc_ids *, int);
     134                 :            : struct kern_ipc_perm *ipc_obtain_object(struct ipc_ids *ids, int id);
     135                 :            : 
     136                 :            : void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
     137                 :            : void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
     138                 :            : int ipc_update_perm(struct ipc64_perm *in, struct kern_ipc_perm *out);
     139                 :            : struct kern_ipc_perm *ipcctl_pre_down_nolock(struct ipc_namespace *ns,
     140                 :            :                                              struct ipc_ids *ids, int id, int cmd,
     141                 :            :                                              struct ipc64_perm *perm, int extra_perm);
     142                 :            : 
     143                 :            : #ifndef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
     144                 :            :   /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
     145                 :            : # define ipc_parse_version(cmd) IPC_64
     146                 :            : #else
     147                 :            : int ipc_parse_version (int *cmd);
     148                 :            : #endif
     149                 :            : 
     150                 :            : extern void free_msg(struct msg_msg *msg);
     151                 :            : extern struct msg_msg *load_msg(const void __user *src, size_t len);
     152                 :            : extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst);
     153                 :            : extern int store_msg(void __user *dest, struct msg_msg *msg, size_t len);
     154                 :            : 
     155                 :            : extern void recompute_msgmni(struct ipc_namespace *);
     156                 :            : 
     157                 :            : static inline int ipc_buildid(int id, int seq)
     158                 :            : {
     159                 :       8775 :         return SEQ_MULTIPLIER * seq + id;
     160                 :            : }
     161                 :            : 
     162                 :            : static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int uid)
     163                 :            : {
     164                 :   47425071 :         return uid / SEQ_MULTIPLIER != ipcp->seq;
     165                 :            : }
     166                 :            : 
     167                 :            : static inline void ipc_lock_object(struct kern_ipc_perm *perm)
     168                 :            : {
     169                 :            :         spin_lock(&perm->lock);
     170                 :            : }
     171                 :            : 
     172                 :            : static inline void ipc_unlock_object(struct kern_ipc_perm *perm)
     173                 :            : {
     174                 :            :         spin_unlock(&perm->lock);
     175                 :            : }
     176                 :            : 
     177                 :            : static inline void ipc_assert_locked_object(struct kern_ipc_perm *perm)
     178                 :            : {
     179 [ -  + ][ -  + ]:        477 :         assert_spin_locked(&perm->lock);
         [ -  + ][ -  + ]
                 [ -  + ]
     180                 :            : }
     181                 :            : 
     182                 :            : static inline void ipc_unlock(struct kern_ipc_perm *perm)
     183                 :            : {
     184                 :            :         ipc_unlock_object(perm);
     185                 :            :         rcu_read_unlock();
     186                 :            : }
     187                 :            : 
     188                 :            : struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id);
     189                 :            : int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
     190                 :            :                         struct ipc_ops *ops, struct ipc_params *params);
     191                 :            : void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
     192                 :            :                 void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
     193                 :            : #endif

Generated by: LCOV version 1.9