32 struct _vxhe_set_clr {
36 struct _vxhe_loc_lookup {
40 struct _vx_hist_entry {
46 struct _vxhe_set_clr sc;
47 struct _vxhe_loc_lookup ll;
51 #ifdef CONFIG_VSERVER_HISTORY
53 extern unsigned volatile int vxh_active;
55 struct _vx_hist_entry *vxh_advance(void *loc);
59 void __vxh_copy_vxi(struct _vx_hist_entry *entry, struct vx_info *vxi)
63 entry->vxi.usecnt = atomic_read(&vxi->vx_usecnt);
64 entry->vxi.tasks = atomic_read(&vxi->vx_tasks);
65 entry->vxi.xid = vxi->vx_id;
70 #define __HERE__ current_text_addr()
72 #define __VXH_BODY(__type, __data, __here) \
73 struct _vx_hist_entry *entry; \
76 entry = vxh_advance(__here); \
78 entry->type = __type; \
85 __vxh_copy_vxi(entry, vxi)
88 void __vxh_smpl(struct vx_info *vxi, int __type, void *__here)
90 __VXH_BODY(__type, __VXH_SMPL, __here)
93 /* pass vxi and data (void *) */
96 __vxh_copy_vxi(entry, vxi); \
100 void __vxh_data(struct vx_info *vxi, void *data,
101 int __type, void *__here)
103 __VXH_BODY(__type, __VXH_DATA, __here)
106 /* pass vxi and arg (long) */
109 __vxh_copy_vxi(entry, vxi); \
113 void __vxh_long(struct vx_info *vxi, long arg,
114 int __type, void *__here)
116 __VXH_BODY(__type, __VXH_LONG, __here)
121 void __vxh_throw_oops(void *__here)
123 __VXH_BODY(VXH_THROW_OOPS, {}, __here);
124 /* prevent further acquisition */
129 #define vxh_throw_oops() __vxh_throw_oops(__HERE__);
131 #define __vxh_get_vx_info(v,h) __vxh_smpl(v, VXH_GET_VX_INFO, h);
132 #define __vxh_put_vx_info(v,h) __vxh_smpl(v, VXH_PUT_VX_INFO, h);
134 #define __vxh_init_vx_info(v,d,h) \
135 __vxh_data(v,d, VXH_INIT_VX_INFO, h);
136 #define __vxh_set_vx_info(v,d,h) \
137 __vxh_data(v,d, VXH_SET_VX_INFO, h);
138 #define __vxh_clr_vx_info(v,d,h) \
139 __vxh_data(v,d, VXH_CLR_VX_INFO, h);
141 #define __vxh_claim_vx_info(v,d,h) \
142 __vxh_data(v,d, VXH_CLAIM_VX_INFO, h);
143 #define __vxh_release_vx_info(v,d,h) \
144 __vxh_data(v,d, VXH_RELEASE_VX_INFO, h);
146 #define vxh_alloc_vx_info(v) \
147 __vxh_smpl(v, VXH_ALLOC_VX_INFO, __HERE__);
148 #define vxh_dealloc_vx_info(v) \
149 __vxh_smpl(v, VXH_DEALLOC_VX_INFO, __HERE__);
151 #define vxh_hash_vx_info(v) \
152 __vxh_smpl(v, VXH_HASH_VX_INFO, __HERE__);
153 #define vxh_unhash_vx_info(v) \
154 __vxh_smpl(v, VXH_UNHASH_VX_INFO, __HERE__);
156 #define vxh_loc_vx_info(v,l) \
157 __vxh_long(v,l, VXH_LOC_VX_INFO, __HERE__);
158 #define vxh_lookup_vx_info(v,l) \
159 __vxh_long(v,l, VXH_LOOKUP_VX_INFO, __HERE__);
160 #define vxh_create_vx_info(v,l) \
161 __vxh_long(v,l, VXH_CREATE_VX_INFO, __HERE__);
163 extern void vxh_dump_history(void);
166 #else /* CONFIG_VSERVER_HISTORY */
170 #define vxh_throw_oops() do { } while (0)
172 #define __vxh_get_vx_info(v,h) do { } while (0)
173 #define __vxh_put_vx_info(v,h) do { } while (0)
175 #define __vxh_init_vx_info(v,d,h) do { } while (0)
176 #define __vxh_set_vx_info(v,d,h) do { } while (0)
177 #define __vxh_clr_vx_info(v,d,h) do { } while (0)
179 #define __vxh_claim_vx_info(v,d,h) do { } while (0)
180 #define __vxh_release_vx_info(v,d,h) do { } while (0)
182 #define vxh_alloc_vx_info(v) do { } while (0)
183 #define vxh_dealloc_vx_info(v) do { } while (0)
185 #define vxh_hash_vx_info(v) do { } while (0)
186 #define vxh_unhash_vx_info(v) do { } while (0)
188 #define vxh_loc_vx_info(a,v) do { } while (0)
189 #define vxh_lookup_vx_info(a,v) do { } while (0)
190 #define vxh_create_vx_info(a,v) do { } while (0)
192 #define vxh_dump_history() do { } while (0)
195 #endif /* CONFIG_VSERVER_HISTORY */
197 #endif /* _VX_HISTORY_H */