fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / vs_context.h
1 #ifndef _VS_CONTEXT_H
2 #define _VS_CONTEXT_H
3
4 #include "vserver/base.h"
5 #include "vserver/context.h"
6 #include "vserver/history.h"
7 #include "vserver/debug.h"
8
9
10 #define get_vx_info(i)  __get_vx_info(i,__FILE__,__LINE__,__HERE__)
11
12 static inline struct vx_info *__get_vx_info(struct vx_info *vxi,
13         const char *_file, int _line, void *_here)
14 {
15         if (!vxi)
16                 return NULL;
17
18         vxlprintk(VXD_CBIT(xid, 2), "get_vx_info(%p[#%d.%d])",
19                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
20                 _file, _line);
21         __vxh_get_vx_info(vxi, _here);
22
23         atomic_inc(&vxi->vx_usecnt);
24         return vxi;
25 }
26
27
28 extern void free_vx_info(struct vx_info *);
29
30 #define put_vx_info(i)  __put_vx_info(i,__FILE__,__LINE__,__HERE__)
31
32 static inline void __put_vx_info(struct vx_info *vxi,
33         const char *_file, int _line, void *_here)
34 {
35         if (!vxi)
36                 return;
37
38         vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])",
39                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
40                 _file, _line);
41         __vxh_put_vx_info(vxi, _here);
42
43         if (atomic_dec_and_test(&vxi->vx_usecnt))
44                 free_vx_info(vxi);
45 }
46
47
48 #define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__,__HERE__)
49
50 static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi,
51         const char *_file, int _line, void *_here)
52 {
53         if (vxi) {
54                 vxlprintk(VXD_CBIT(xid, 3),
55                         "init_vx_info(%p[#%d.%d])",
56                         vxi, vxi?vxi->vx_id:0,
57                         vxi?atomic_read(&vxi->vx_usecnt):0,
58                         _file, _line);
59                 __vxh_init_vx_info(vxi, vxp, _here);
60
61                 atomic_inc(&vxi->vx_usecnt);
62         }
63         *vxp = vxi;
64 }
65
66
67 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__,__HERE__)
68
69 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
70         const char *_file, int _line, void *_here)
71 {
72         struct vx_info *vxo;
73
74         if (!vxi)
75                 return;
76
77         vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d])",
78                 vxi, vxi?vxi->vx_id:0,
79                 vxi?atomic_read(&vxi->vx_usecnt):0,
80                 _file, _line);
81         __vxh_set_vx_info(vxi, vxp, _here);
82
83         atomic_inc(&vxi->vx_usecnt);
84         vxo = xchg(vxp, vxi);
85         BUG_ON(vxo);
86 }
87
88
89 #define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__,__HERE__)
90
91 static inline void __clr_vx_info(struct vx_info **vxp,
92         const char *_file, int _line, void *_here)
93 {
94         struct vx_info *vxo;
95
96         vxo = xchg(vxp, NULL);
97         if (!vxo)
98                 return;
99
100         vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d])",
101                 vxo, vxo?vxo->vx_id:0,
102                 vxo?atomic_read(&vxo->vx_usecnt):0,
103                 _file, _line);
104         __vxh_clr_vx_info(vxo, vxp, _here);
105
106         if (atomic_dec_and_test(&vxo->vx_usecnt))
107                 free_vx_info(vxo);
108 }
109
110
111 #define claim_vx_info(v,p) \
112         __claim_vx_info(v,p,__FILE__,__LINE__,__HERE__)
113
114 static inline void __claim_vx_info(struct vx_info *vxi,
115         struct task_struct *task,
116         const char *_file, int _line, void *_here)
117 {
118         vxlprintk(VXD_CBIT(xid, 3), "claim_vx_info(%p[#%d.%d.%d]) %p",
119                 vxi, vxi?vxi->vx_id:0,
120                 vxi?atomic_read(&vxi->vx_usecnt):0,
121                 vxi?atomic_read(&vxi->vx_tasks):0,
122                 task, _file, _line);
123         __vxh_claim_vx_info(vxi, task, _here);
124
125         atomic_inc(&vxi->vx_tasks);
126 }
127
128
129 extern void unhash_vx_info(struct vx_info *);
130
131 #define release_vx_info(v,p) \
132         __release_vx_info(v,p,__FILE__,__LINE__,__HERE__)
133
134 static inline void __release_vx_info(struct vx_info *vxi,
135         struct task_struct *task,
136         const char *_file, int _line, void *_here)
137 {
138         vxlprintk(VXD_CBIT(xid, 3), "release_vx_info(%p[#%d.%d.%d]) %p",
139                 vxi, vxi?vxi->vx_id:0,
140                 vxi?atomic_read(&vxi->vx_usecnt):0,
141                 vxi?atomic_read(&vxi->vx_tasks):0,
142                 task, _file, _line);
143         __vxh_release_vx_info(vxi, task, _here);
144
145         might_sleep();
146
147         if (atomic_dec_and_test(&vxi->vx_tasks))
148                 unhash_vx_info(vxi);
149 }
150
151
152 #define task_get_vx_info(p) \
153         __task_get_vx_info(p,__FILE__,__LINE__,__HERE__)
154
155 static inline struct vx_info *__task_get_vx_info(struct task_struct *p,
156         const char *_file, int _line, void *_here)
157 {
158         struct vx_info *vxi;
159
160         task_lock(p);
161         vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)",
162                 p, _file, _line);
163         vxi = __get_vx_info(p->vx_info, _file, _line, _here);
164         task_unlock(p);
165         return vxi;
166 }
167
168
169 static inline void __wakeup_vx_info(struct vx_info *vxi)
170 {
171         if (waitqueue_active(&vxi->vx_wait))
172                 wake_up_interruptible(&vxi->vx_wait);
173 }
174
175
176 #define enter_vx_info(v,s)      __enter_vx_info(v,s,__FILE__,__LINE__)
177
178 static inline void __enter_vx_info(struct vx_info *vxi,
179         struct vx_info_save *vxis, const char *_file, int _line)
180 {
181         vxlprintk(VXD_CBIT(xid, 5), "enter_vx_info(%p[#%d],%p) %p[#%d,%p]",
182                 vxi, vxi ? vxi->vx_id : 0, vxis, current,
183                 current->xid, current->vx_info, _file, _line);
184         vxis->vxi = xchg(&current->vx_info, vxi);
185         vxis->xid = current->xid;
186         current->xid = vxi ? vxi->vx_id : 0;
187 }
188
189 #define leave_vx_info(s)        __leave_vx_info(s,__FILE__,__LINE__)
190
191 static inline void __leave_vx_info(struct vx_info_save *vxis,
192         const char *_file, int _line)
193 {
194         vxlprintk(VXD_CBIT(xid, 5), "leave_vx_info(%p[#%d,%p]) %p[#%d,%p]",
195                 vxis, vxis->xid, vxis->vxi, current,
196                 current->xid, current->vx_info, _file, _line);
197         (void)xchg(&current->vx_info, vxis->vxi);
198         current->xid = vxis->xid;
199 }
200
201
202 static inline void __enter_vx_admin(struct vx_info_save *vxis)
203 {
204         vxis->vxi = xchg(&current->vx_info, NULL);
205         vxis->xid = xchg(&current->xid, (xid_t)0);
206 }
207
208 static inline void __leave_vx_admin(struct vx_info_save *vxis)
209 {
210         (void)xchg(&current->xid, vxis->xid);
211         (void)xchg(&current->vx_info, vxis->vxi);
212 }
213
214 extern void exit_vx_info(struct task_struct *, int);
215 extern void exit_vx_info_early(struct task_struct *, int);
216
217
218 #else
219 #warning duplicate inclusion
220 #endif