Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / include / linux / vserver / debug.h
1 #ifndef _VX_DEBUG_H
2 #define _VX_DEBUG_H
3
4
5 #define VXD_CBIT(n,m)   (vx_debug_ ## n & (1 << (m)))
6 #define VXD_CMIN(n,m)   (vx_debug_ ## n > (m))
7 #define VXD_MASK(n,m)   (vx_debug_ ## n & (m))
8
9 #define VXD_QPOS(v,p)   (((uint32_t)(v) >> ((p)*8)) & 0xFF)
10 #define VXD_QUAD(v)     VXD_QPOS(v,0), VXD_QPOS(v,1),           \
11                         VXD_QPOS(v,2), VXD_QPOS(v,3)
12 #define VXF_QUAD        "%u.%u.%u.%u"
13
14 #define VXD_DEV(d)      (d), (d)->bd_inode->i_ino,              \
15                         imajor((d)->bd_inode), iminor((d)->bd_inode)
16 #define VXF_DEV         "%p[%lu,%d:%d]"
17
18
19 #define __FUNC__        __func__
20
21
22 #ifdef  CONFIG_VSERVER_DEBUG
23
24 extern unsigned int vx_debug_switch;
25 extern unsigned int vx_debug_xid;
26 extern unsigned int vx_debug_nid;
27 extern unsigned int vx_debug_net;
28 extern unsigned int vx_debug_limit;
29 extern unsigned int vx_debug_cres;
30 extern unsigned int vx_debug_dlim;
31 extern unsigned int vx_debug_cvirt;
32 extern unsigned int vx_debug_misc;
33
34
35 #define VX_LOGLEVEL     "vxD: "
36 #define VX_WARNLEVEL    KERN_WARNING "vxW: "
37
38 #define vxdprintk(c,f,x...)                                     \
39         do {                                                    \
40                 if (c)                                          \
41                         printk(VX_LOGLEVEL f "\n" , ##x);       \
42         } while (0)
43
44 #define vxlprintk(c,f,x...)                                     \
45         do {                                                    \
46                 if (c)                                          \
47                         printk(VX_LOGLEVEL f " @%s:%d\n", x);   \
48         } while (0)
49
50 #define vxfprintk(c,f,x...)                                     \
51         do {                                                    \
52                 if (c)                                          \
53                         printk(VX_LOGLEVEL f " %s@%s:%d\n", x); \
54         } while (0)
55
56
57 #define vxwprintk(c,f,x...)                                     \
58         do {                                                    \
59                 if (c)                                          \
60                         printk(VX_WARNLEVEL f "\n" , ##x);      \
61         } while (0)
62
63 #define vxd_path(d,m)                                           \
64         ({ static char _buffer[PATH_MAX];                       \
65            d_path((d), (m), _buffer, sizeof(_buffer)); })
66
67 #define vxd_cond_path(n)                                        \
68         ((n) ? vxd_path((n)->dentry, (n)->mnt) : "<null>" )
69
70 #else   /* CONFIG_VSERVER_DEBUG */
71
72 #define vx_debug_switch 0
73 #define vx_debug_xid    0
74 #define vx_debug_nid    0
75 #define vx_debug_net    0
76 #define vx_debug_limit  0
77 #define vx_debug_cres   0
78 #define vx_debug_dlim   0
79 #define vx_debug_cvirt  0
80
81 #define vxdprintk(x...) do { } while (0)
82 #define vxlprintk(x...) do { } while (0)
83 #define vxfprintk(x...) do { } while (0)
84 #define vxwprintk(x...) do { } while (0)
85
86 #define vxd_path        "<none>"
87 #define vxd_cond_path   vxd_path
88
89 #endif  /* CONFIG_VSERVER_DEBUG */
90
91
92 /* history stuff */
93
94 #ifdef  CONFIG_VSERVER_HISTORY
95
96
97 extern unsigned volatile int vxh_active;
98
99 struct _vxhe_vxi {
100         struct vx_info *ptr;
101         unsigned xid;
102         unsigned usecnt;
103         unsigned tasks;
104 };
105
106 struct _vxhe_set_clr {
107         void *data;
108 };
109
110 struct _vxhe_loc_lookup {
111         unsigned arg;
112 };
113
114 enum {
115         VXH_UNUSED=0,
116         VXH_THROW_OOPS=1,
117
118         VXH_GET_VX_INFO,
119         VXH_PUT_VX_INFO,
120         VXH_INIT_VX_INFO,
121         VXH_SET_VX_INFO,
122         VXH_CLR_VX_INFO,
123         VXH_CLAIM_VX_INFO,
124         VXH_RELEASE_VX_INFO,
125         VXH_ALLOC_VX_INFO,
126         VXH_DEALLOC_VX_INFO,
127         VXH_HASH_VX_INFO,
128         VXH_UNHASH_VX_INFO,
129         VXH_LOC_VX_INFO,
130         VXH_LOOKUP_VX_INFO,
131         VXH_CREATE_VX_INFO,
132 };
133
134 struct _vx_hist_entry {
135         void *loc;
136         unsigned short seq;
137         unsigned short type;
138         struct _vxhe_vxi vxi;
139         union {
140                 struct _vxhe_set_clr sc;
141                 struct _vxhe_loc_lookup ll;
142         };
143 };
144
145 struct _vx_hist_entry *vxh_advance(void *loc);
146
147
148 static inline
149 void    __vxh_copy_vxi(struct _vx_hist_entry *entry, struct vx_info *vxi)
150 {
151         entry->vxi.ptr = vxi;
152         if (vxi) {
153                 entry->vxi.usecnt = atomic_read(&vxi->vx_usecnt);
154                 entry->vxi.tasks = atomic_read(&vxi->vx_tasks);
155                 entry->vxi.xid = vxi->vx_id;
156         }
157 }
158
159
160 #define __HERE__        current_text_addr()
161
162 #define __VXH_BODY(__type, __data, __here)      \
163         struct _vx_hist_entry *entry;           \
164                                                 \
165         preempt_disable();                      \
166         entry = vxh_advance(__here);            \
167         __data;                                 \
168         entry->type = __type;                   \
169         preempt_enable();
170
171
172         /* pass vxi only */
173
174 #define __VXH_SMPL                              \
175         __vxh_copy_vxi(entry, vxi)
176
177 static inline
178 void    __vxh_smpl(struct vx_info *vxi, int __type, void *__here)
179 {
180         __VXH_BODY(__type, __VXH_SMPL, __here)
181 }
182
183         /* pass vxi and data (void *) */
184
185 #define __VXH_DATA                              \
186         __vxh_copy_vxi(entry, vxi);             \
187         entry->sc.data = data
188
189 static inline
190 void    __vxh_data(struct vx_info *vxi, void *data,
191                         int __type, void *__here)
192 {
193         __VXH_BODY(__type, __VXH_DATA, __here)
194 }
195
196         /* pass vxi and arg (long) */
197
198 #define __VXH_LONG                              \
199         __vxh_copy_vxi(entry, vxi);             \
200         entry->ll.arg = arg
201
202 static inline
203 void    __vxh_long(struct vx_info *vxi, long arg,
204                         int __type, void *__here)
205 {
206         __VXH_BODY(__type, __VXH_LONG, __here)
207 }
208
209
210 static inline
211 void    __vxh_throw_oops(void *__here)
212 {
213         __VXH_BODY(VXH_THROW_OOPS, {}, __here);
214         /* prevent further acquisition */
215         vxh_active = 0;
216 }
217
218
219 #define vxh_throw_oops()        __vxh_throw_oops(__HERE__);
220
221 #define __vxh_get_vx_info(v,h)  __vxh_smpl(v, VXH_GET_VX_INFO, h);
222 #define __vxh_put_vx_info(v,h)  __vxh_smpl(v, VXH_PUT_VX_INFO, h);
223
224 #define __vxh_init_vx_info(v,d,h) \
225         __vxh_data(v,d, VXH_INIT_VX_INFO, h);
226 #define __vxh_set_vx_info(v,d,h) \
227         __vxh_data(v,d, VXH_SET_VX_INFO, h);
228 #define __vxh_clr_vx_info(v,d,h) \
229         __vxh_data(v,d, VXH_CLR_VX_INFO, h);
230
231 #define __vxh_claim_vx_info(v,d,h) \
232         __vxh_data(v,d, VXH_CLAIM_VX_INFO, h);
233 #define __vxh_release_vx_info(v,d,h) \
234         __vxh_data(v,d, VXH_RELEASE_VX_INFO, h);
235
236 #define vxh_alloc_vx_info(v) \
237         __vxh_smpl(v, VXH_ALLOC_VX_INFO, __HERE__);
238 #define vxh_dealloc_vx_info(v) \
239         __vxh_smpl(v, VXH_DEALLOC_VX_INFO, __HERE__);
240
241 #define vxh_hash_vx_info(v) \
242         __vxh_smpl(v, VXH_HASH_VX_INFO, __HERE__);
243 #define vxh_unhash_vx_info(v) \
244         __vxh_smpl(v, VXH_UNHASH_VX_INFO, __HERE__);
245
246 #define vxh_loc_vx_info(v,l) \
247         __vxh_long(v,l, VXH_LOC_VX_INFO, __HERE__);
248 #define vxh_lookup_vx_info(v,l) \
249         __vxh_long(v,l, VXH_LOOKUP_VX_INFO, __HERE__);
250 #define vxh_create_vx_info(v,l) \
251         __vxh_long(v,l, VXH_CREATE_VX_INFO, __HERE__);
252
253 extern void vxh_dump_history(void);
254
255
256 #else  /* CONFIG_VSERVER_HISTORY */
257
258 #define __HERE__        0
259
260 #define vxh_throw_oops()                do { } while (0)
261
262 #define __vxh_get_vx_info(v,h)          do { } while (0)
263 #define __vxh_put_vx_info(v,h)          do { } while (0)
264
265 #define __vxh_init_vx_info(v,d,h)       do { } while (0)
266 #define __vxh_set_vx_info(v,d,h)        do { } while (0)
267 #define __vxh_clr_vx_info(v,d,h)        do { } while (0)
268
269 #define __vxh_claim_vx_info(v,d,h)      do { } while (0)
270 #define __vxh_release_vx_info(v,d,h)    do { } while (0)
271
272 #define vxh_alloc_vx_info(v)            do { } while (0)
273 #define vxh_dealloc_vx_info(v)          do { } while (0)
274
275 #define vxh_hash_vx_info(v)             do { } while (0)
276 #define vxh_unhash_vx_info(v)           do { } while (0)
277
278 #define vxh_loc_vx_info(a,v)            do { } while (0)
279 #define vxh_lookup_vx_info(a,v)         do { } while (0)
280 #define vxh_create_vx_info(a,v)         do { } while (0)
281
282 #define vxh_dump_history()              do { } while (0)
283
284
285 #endif /* CONFIG_VSERVER_HISTORY */
286
287
288 #ifdef  CONFIG_VSERVER_DEBUG
289 #define vxd_assert_lock(l)      assert_spin_locked(l)
290 #define vxd_assert(c,f,x...)    vxlprintk(!(c), \
291         "assertion [" f "] failed.", ##x, __FILE__, __LINE__)
292 #else
293 #define vxd_assert_lock(l)      do { } while (0)
294 #define vxd_assert(c,f,x...)    do { } while (0)
295 #endif
296
297
298 #endif /* _VX_DEBUG_H */