vserver 1.9.3
[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 <linux/rcupdate.h>
7 #include <linux/sched.h>
8
9 #include "vserver/context.h"
10 #include "vserver/debug.h"
11
12
13 extern int proc_pid_vx_info(struct task_struct *, char *);
14
15
16 #define get_vx_info(i)  __get_vx_info(i,__FILE__,__LINE__)
17
18 static inline struct vx_info *__get_vx_info(struct vx_info *vxi,
19         const char *_file, int _line)
20 {
21         if (!vxi)
22                 return NULL;
23         vxlprintk(VXD_CBIT(xid, 2), "get_vx_info(%p[#%d.%d])",
24                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
25                 _file, _line);
26         atomic_inc(&vxi->vx_usecnt);
27         return vxi;
28 }
29
30
31 extern void free_vx_info(struct vx_info *);
32
33 #define put_vx_info(i)  __put_vx_info(i,__FILE__,__LINE__)
34
35 static inline void __put_vx_info(struct vx_info *vxi, const char *_file, int _line)
36 {
37         if (!vxi)
38                 return;
39         vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])",
40                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
41                 _file, _line);
42         if (atomic_dec_and_test(&vxi->vx_usecnt))
43                 free_vx_info(vxi);
44 }
45
46 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__)
47
48 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
49         const char *_file, int _line)
50 {
51         struct vx_info *vxo;
52
53         if (!vxi)
54                 return;
55
56         vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d.%d])",
57                 vxi, vxi?vxi->vx_id:0,
58                 vxi?atomic_read(&vxi->vx_usecnt):0,
59                 vxi?atomic_read(&vxi->vx_refcnt):0,
60                 _file, _line);
61
62         atomic_inc(&vxi->vx_refcnt);
63         vxo = xchg(vxp, __get_vx_info(vxi, _file, _line));
64         BUG_ON(vxo);
65 }
66
67 #define clr_vx_info(p)  __clr_vx_info(p,__FILE__,__LINE__)
68
69 static inline void __clr_vx_info(struct vx_info **vxp,
70         const char *_file, int _line)
71 {
72         struct vx_info *vxo;
73
74         vxo = xchg(vxp, NULL);
75         if (!vxo)
76                 return;
77
78         vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d.%d])",
79                 vxo, vxo?vxo->vx_id:0,
80                 vxo?atomic_read(&vxo->vx_usecnt):0,
81                 vxo?atomic_read(&vxo->vx_refcnt):0,
82                 _file, _line);
83
84         if (atomic_dec_and_test(&vxo->vx_refcnt))
85                 unhash_vx_info(vxo);
86         __put_vx_info(vxo, _file, _line);
87 }
88
89
90 #define task_get_vx_info(i)     __task_get_vx_info(i,__FILE__,__LINE__)
91
92 static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p,
93         const char *_file, int _line)
94 {
95         struct vx_info *vxi;
96
97         task_lock(p);
98         vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)",
99                 p, _file, _line);
100         vxi = __get_vx_info(p->vx_info, _file, _line);
101         task_unlock(p);
102         return vxi;
103 }
104
105
106 #define vx_verify_info(p,i)     \
107         __vx_verify_info((p)->vx_info,i,__FILE__,__LINE__)
108
109 static __inline__ void __vx_verify_info(
110         struct vx_info *vxa, struct vx_info *vxb,
111         const char *_file, int _line)
112 {
113         if (vxa == vxb)
114                 return;
115         printk(KERN_ERR "vx bad assumption (%p==%p) at %s:%d\n",
116                 vxa, vxb, _file, _line);
117 }
118
119
120 #else
121 #warning duplicate inclusion
122 #endif