4 #include "vserver/base.h"
5 #include "vserver/context.h"
6 #include "vserver/history.h"
7 #include "vserver/debug.h"
10 #define get_vx_info(i) __get_vx_info(i,__FILE__,__LINE__,__HERE__)
12 static inline struct vx_info *__get_vx_info(struct vx_info *vxi,
13 const char *_file, int _line, void *_here)
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,
21 __vxh_get_vx_info(vxi, _here);
23 atomic_inc(&vxi->vx_usecnt);
28 extern void free_vx_info(struct vx_info *);
30 #define put_vx_info(i) __put_vx_info(i,__FILE__,__LINE__,__HERE__)
32 static inline void __put_vx_info(struct vx_info *vxi,
33 const char *_file, int _line, void *_here)
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,
41 __vxh_put_vx_info(vxi, _here);
43 if (atomic_dec_and_test(&vxi->vx_usecnt))
48 #define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__,__HERE__)
50 static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi,
51 const char *_file, int _line, void *_here)
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,
59 __vxh_init_vx_info(vxi, vxp, _here);
61 atomic_inc(&vxi->vx_usecnt);
67 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__,__HERE__)
69 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
70 const char *_file, int _line, void *_here)
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,
81 __vxh_set_vx_info(vxi, vxp, _here);
83 atomic_inc(&vxi->vx_usecnt);
89 #define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__,__HERE__)
91 static inline void __clr_vx_info(struct vx_info **vxp,
92 const char *_file, int _line, void *_here)
96 vxo = xchg(vxp, NULL);
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,
104 __vxh_clr_vx_info(vxo, vxp, _here);
106 if (atomic_dec_and_test(&vxo->vx_usecnt))
111 #define claim_vx_info(v,p) \
112 __claim_vx_info(v,p,__FILE__,__LINE__,__HERE__)
114 static inline void __claim_vx_info(struct vx_info *vxi,
115 struct task_struct *task,
116 const char *_file, int _line, void *_here)
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,
123 __vxh_claim_vx_info(vxi, task, _here);
125 atomic_inc(&vxi->vx_tasks);
129 extern void unhash_vx_info(struct vx_info *);
131 #define release_vx_info(v,p) \
132 __release_vx_info(v,p,__FILE__,__LINE__,__HERE__)
134 static inline void __release_vx_info(struct vx_info *vxi,
135 struct task_struct *task,
136 const char *_file, int _line, void *_here)
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,
143 __vxh_release_vx_info(vxi, task, _here);
147 if (atomic_dec_and_test(&vxi->vx_tasks))
152 #define task_get_vx_info(p) \
153 __task_get_vx_info(p,__FILE__,__LINE__,__HERE__)
155 static inline struct vx_info *__task_get_vx_info(struct task_struct *p,
156 const char *_file, int _line, void *_here)
161 vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)",
163 vxi = __get_vx_info(p->vx_info, _file, _line, _here);
169 static inline void __wakeup_vx_info(struct vx_info *vxi)
171 if (waitqueue_active(&vxi->vx_wait))
172 wake_up_interruptible(&vxi->vx_wait);
176 #define enter_vx_info(v,s) __enter_vx_info(v,s,__FILE__,__LINE__)
178 static inline void __enter_vx_info(struct vx_info *vxi,
179 struct vx_info_save *vxis, const char *_file, int _line)
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(¤t->vx_info, vxi);
185 vxis->xid = current->xid;
186 current->xid = vxi ? vxi->vx_id : 0;
189 #define leave_vx_info(s) __leave_vx_info(s,__FILE__,__LINE__)
191 static inline void __leave_vx_info(struct vx_info_save *vxis,
192 const char *_file, int _line)
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(¤t->vx_info, vxis->vxi);
198 current->xid = vxis->xid;
202 static inline void __enter_vx_admin(struct vx_info_save *vxis)
204 vxis->vxi = xchg(¤t->vx_info, NULL);
205 vxis->xid = xchg(¤t->xid, (xid_t)0);
208 static inline void __leave_vx_admin(struct vx_info_save *vxis)
210 (void)xchg(¤t->xid, vxis->xid);
211 (void)xchg(¤t->vx_info, vxis->vxi);
214 extern void exit_vx_info(struct task_struct *, int);
215 extern void exit_vx_info_early(struct task_struct *, int);
219 #warning duplicate inclusion