Blame view

ipc/util.h 3.25 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   * linux/ipc/util.h
   * Copyright (C) 1999 Christoph Rohland
   *
624dffcbc   Christian Kujau   correct email add...
5
   * ipc helper functions (c) 1999 Manfred Spraul <manfred@colorfullife.com>
73ea41302   Kirill Korotaev   [PATCH] IPC names...
6
7
   * namespaces support.      2006 OpenVZ, SWsoft Inc.
   *                               Pavel Emelianov <xemul@openvz.org>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
9
10
11
12
13
14
15
16
17
18
   */
  
  #ifndef _IPC_UTIL_H
  #define _IPC_UTIL_H
  
  #define USHRT_MAX 0xffff
  #define SEQ_MULTIPLIER	(IPCMNI)
  
  void sem_init (void);
  void msg_init (void);
  void shm_init (void);
73ea41302   Kirill Korotaev   [PATCH] IPC names...
19
20
21
22
23
24
25
  int sem_init_ns(struct ipc_namespace *ns);
  int msg_init_ns(struct ipc_namespace *ns);
  int shm_init_ns(struct ipc_namespace *ns);
  
  void sem_exit_ns(struct ipc_namespace *ns);
  void msg_exit_ns(struct ipc_namespace *ns);
  void shm_exit_ns(struct ipc_namespace *ns);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
32
33
34
35
  struct ipc_id_ary {
  	int size;
  	struct kern_ipc_perm *p[0];
  };
  
  struct ipc_ids {
  	int in_use;
  	int max_id;
  	unsigned short seq;
  	unsigned short seq_max;
5f921ae96   Ingo Molnar   [PATCH] sem2mutex...
36
  	struct mutex mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
  	struct ipc_id_ary nullentry;
  	struct ipc_id_ary* entries;
  };
ae7817745   Mike Waychison   [PATCH] ipc: add ...
40
  struct seq_file;
7d69a1f4a   Cedric Le Goater   remove CONFIG_UTS...
41
42
  
  void ipc_init_ids(struct ipc_ids *ids, int size);
ae7817745   Mike Waychison   [PATCH] ipc: add ...
43
44
  #ifdef CONFIG_PROC_FS
  void __init ipc_init_proc_interface(const char *path, const char *header,
73ea41302   Kirill Korotaev   [PATCH] IPC names...
45
  		int ids, int (*show)(struct seq_file *, void *));
ae7817745   Mike Waychison   [PATCH] ipc: add ...
46
47
48
  #else
  #define ipc_init_proc_interface(path, header, ids, show) do {} while (0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49

73ea41302   Kirill Korotaev   [PATCH] IPC names...
50
51
52
  #define IPC_SEM_IDS	0
  #define IPC_MSG_IDS	1
  #define IPC_SHM_IDS	2
5f921ae96   Ingo Molnar   [PATCH] sem2mutex...
53
  /* must be called with ids->mutex acquired.*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  int ipc_findkey(struct ipc_ids* ids, key_t key);
  int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size);
  
  /* must be called with both locks acquired. */
  struct kern_ipc_perm* ipc_rmid(struct ipc_ids* ids, int id);
  
  int ipcperms (struct kern_ipc_perm *ipcp, short flg);
  
  /* for rare, potentially huge allocations.
   * both function can sleep
   */
  void* ipc_alloc(int size);
  void ipc_free(void* ptr, int size);
  
  /*
   * For allocation that need to be freed by RCU.
   * Objects are reference counted, they start with reference count 1.
   * getref increases the refcount, the putref call that reduces the recount
   * to 0 schedules the rcu destruction. Caller must guarantee locking.
   */
  void* ipc_rcu_alloc(int size);
  void ipc_rcu_getref(void *ptr);
  void ipc_rcu_putref(void *ptr);
c7e12b838   Pavel Emelianov   [PATCH] Fix ipc e...
77
78
79
80
81
82
83
84
85
86
87
  static inline void __ipc_fini_ids(struct ipc_ids *ids,
  		struct ipc_id_ary *entries)
  {
  	if (entries != &ids->nullentry)
  		ipc_rcu_putref(entries);
  }
  
  static inline void ipc_fini_ids(struct ipc_ids *ids)
  {
  	__ipc_fini_ids(ids, ids->entries);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
94
95
96
  struct kern_ipc_perm* ipc_get(struct ipc_ids* ids, int id);
  struct kern_ipc_perm* ipc_lock(struct ipc_ids* ids, int id);
  void ipc_lock_by_ptr(struct kern_ipc_perm *ipcp);
  void ipc_unlock(struct kern_ipc_perm* perm);
  int ipc_buildid(struct ipc_ids* ids, int id, int seq);
  int ipc_checkid(struct ipc_ids* ids, struct kern_ipc_perm* ipcp, int uid);
  
  void kernel_to_ipc64_perm(struct kern_ipc_perm *in, struct ipc64_perm *out);
  void ipc64_perm_to_ipc_perm(struct ipc64_perm *in, struct ipc_perm *out);
813e67836   Chris Zankel   [PATCH] xtensa: r...
97
  #if defined(__ia64__) || defined(__x86_64__) || defined(__hppa__) || defined(__XTENSA__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
99
100
101
102
103
104
105
106
107
108
    /* On IA-64, we always use the "64-bit version" of the IPC structures.  */ 
  # define ipc_parse_version(cmd)	IPC_64
  #else
  int ipc_parse_version (int *cmd);
  #endif
  
  extern void free_msg(struct msg_msg *msg);
  extern struct msg_msg *load_msg(const void __user *src, int len);
  extern int store_msg(void __user *dest, struct msg_msg *msg, int len);
  
  #endif