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