vserver 2.0-rc4
[linux-2.6.git] / include / linux / vs_context.h
1 #ifndef _VX_VS_CONTEXT_H
2 #define _VX_VS_CONTEXT_H
3
4
5 #include <linux/kernel.h>
6 #include "vserver/debug.h"
7
8
9 #define get_vx_info(i)  __get_vx_info(i,__FILE__,__LINE__)
10
11 static inline struct vx_info *__get_vx_info(struct vx_info *vxi,
12         const char *_file, int _line)
13 {
14         if (!vxi)
15                 return NULL;
16
17         vxlprintk(VXD_CBIT(xid, 2), "get_vx_info(%p[#%d.%d])",
18                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
19                 _file, _line);
20         vxh_get_vx_info(vxi);
21
22         atomic_inc(&vxi->vx_usecnt);
23         return vxi;
24 }
25
26
27 extern void free_vx_info(struct vx_info *);
28
29 #define put_vx_info(i)  __put_vx_info(i,__FILE__,__LINE__)
30
31 static inline void __put_vx_info(struct vx_info *vxi,
32         const char *_file, int _line)
33 {
34         if (!vxi)
35                 return;
36
37         vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])",
38                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
39                 _file, _line);
40         vxh_put_vx_info(vxi);
41
42         if (atomic_dec_and_test(&vxi->vx_usecnt))
43                 free_vx_info(vxi);
44 }
45
46
47 #define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__)
48
49 static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi,
50         const char *_file, int _line)
51 {
52         if (vxi) {
53                 vxlprintk(VXD_CBIT(xid, 3),
54                         "init_vx_info(%p[#%d.%d])",
55                         vxi, vxi?vxi->vx_id:0,
56                         vxi?atomic_read(&vxi->vx_usecnt):0,
57                         _file, _line);
58                 vxh_init_vx_info(vxi, vxp);
59
60                 atomic_inc(&vxi->vx_usecnt);
61         }
62         *vxp = vxi;
63 }
64
65
66 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__)
67
68 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
69         const char *_file, int _line)
70 {
71         struct vx_info *vxo;
72
73         if (!vxi)
74                 return;
75
76         vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d])",
77                 vxi, vxi?vxi->vx_id:0,
78                 vxi?atomic_read(&vxi->vx_usecnt):0,
79                 _file, _line);
80         vxh_set_vx_info(vxi, vxp);
81
82         atomic_inc(&vxi->vx_usecnt);
83         vxo = xchg(vxp, vxi);
84         BUG_ON(vxo);
85 }
86
87
88 #define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__)
89
90 static inline void __clr_vx_info(struct vx_info **vxp,
91         const char *_file, int _line)
92 {
93         struct vx_info *vxo;
94
95         vxo = xchg(vxp, NULL);
96         if (!vxo)
97                 return;
98
99         vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d])",
100                 vxo, vxo?vxo->vx_id:0,
101                 vxo?atomic_read(&vxo->vx_usecnt):0,
102                 _file, _line);
103         vxh_clr_vx_info(vxo, vxp);
104
105         if (atomic_dec_and_test(&vxo->vx_usecnt))
106                 free_vx_info(vxo);
107 }
108
109
110 #define claim_vx_info(v,p) __claim_vx_info(v,p,__FILE__,__LINE__)
111
112 static inline void __claim_vx_info(struct vx_info *vxi,
113         struct task_struct *task, const char *_file, int _line)
114 {
115         vxlprintk(VXD_CBIT(xid, 3), "claim_vx_info(%p[#%d.%d.%d]) %p",
116                 vxi, vxi?vxi->vx_id:0,
117                 vxi?atomic_read(&vxi->vx_usecnt):0,
118                 vxi?atomic_read(&vxi->vx_tasks):0,
119                 task, _file, _line);
120         vxh_claim_vx_info(vxi, task);
121
122         atomic_inc(&vxi->vx_tasks);
123 }
124
125
126 extern void unhash_vx_info(struct vx_info *);
127
128 #define release_vx_info(v,p) __release_vx_info(v,p,__FILE__,__LINE__)
129
130 static inline void __release_vx_info(struct vx_info *vxi,
131         struct task_struct *task, const char *_file, int _line)
132 {
133         vxlprintk(VXD_CBIT(xid, 3), "release_vx_info(%p[#%d.%d.%d]) %p",
134                 vxi, vxi?vxi->vx_id:0,
135                 vxi?atomic_read(&vxi->vx_usecnt):0,
136                 vxi?atomic_read(&vxi->vx_tasks):0,
137                 task, _file, _line);
138         vxh_release_vx_info(vxi, task);
139
140         might_sleep();
141
142         if (atomic_dec_and_test(&vxi->vx_tasks))
143                 unhash_vx_info(vxi);
144 }
145
146
147 #define task_get_vx_info(p)     __task_get_vx_info(p,__FILE__,__LINE__)
148
149 static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p,
150         const char *_file, int _line)
151 {
152         struct vx_info *vxi;
153
154         task_lock(p);
155         vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)",
156                 p, _file, _line);
157         vxi = __get_vx_info(p->vx_info, _file, _line);
158         task_unlock(p);
159         return vxi;
160 }
161
162
163 static inline void __wakeup_vx_info(struct vx_info *vxi)
164 {
165         if (waitqueue_active(&vxi->vx_wait))
166                 wake_up_interruptible(&vxi->vx_wait);
167 }
168
169 #else
170 #warning duplicate inclusion
171 #endif