vserver 2.0-pre4
[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, const char *_file, int _line)
32 {
33         if (!vxi)
34                 return;
35         vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])",
36                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
37                 _file, _line);
38         vxh_put_vx_info(vxi);
39
40         if (atomic_dec_and_test(&vxi->vx_usecnt))
41                 free_vx_info(vxi);
42 }
43
44
45 #define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__)
46
47 static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi,
48                 const char *_file, int _line)
49 {
50         if (vxi) {
51                 vxlprintk(VXD_CBIT(xid, 3),
52                         "init_vx_info(%p[#%d.%d])",
53                         vxi, vxi?vxi->vx_id:0,
54                         vxi?atomic_read(&vxi->vx_usecnt):0,
55                         _file, _line);
56                 vxh_init_vx_info(vxi, vxp);
57
58                 atomic_inc(&vxi->vx_usecnt);
59         }
60         *vxp = vxi;
61 }
62
63
64 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__)
65
66 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
67         const char *_file, int _line)
68 {
69         struct vx_info *vxo;
70
71         if (!vxi)
72                 return;
73
74         vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d])",
75                 vxi, vxi?vxi->vx_id:0,
76                 vxi?atomic_read(&vxi->vx_usecnt):0,
77                 _file, _line);
78         vxh_set_vx_info(vxi, vxp);
79
80         // vxo = xchg(vxp, __get_vx_info(vxi, _file, _line));
81         atomic_inc(&vxi->vx_usecnt);
82         vxo = xchg(vxp, vxi);
83         BUG_ON(vxo);
84 }
85
86
87 #define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__)
88
89 static inline void __clr_vx_info(struct vx_info **vxp,
90         const char *_file, int _line)
91 {
92         struct vx_info *vxo;
93
94         vxo = xchg(vxp, NULL);
95         if (!vxo)
96                 return;
97
98         vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d])",
99                 vxo, vxo?vxo->vx_id:0,
100                 vxo?atomic_read(&vxo->vx_usecnt):0,
101                 _file, _line);
102         vxh_clr_vx_info(vxo, vxp);
103
104         // __put_vx_info(vxo, _file, _line);
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