VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[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 #define free_vx_info(i) \
32         call_rcu(&i->vx_rcu, rcu_free_vx_info);
33
34 #define put_vx_info(i)  __put_vx_info(i,__FILE__,__LINE__)
35
36 static inline void __put_vx_info(struct vx_info *vxi, const char *_file, int _line)
37 {
38         if (!vxi)
39                 return;
40         vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])",
41                 vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0,
42                 _file, _line);
43         if (atomic_dec_and_test(&vxi->vx_usecnt))
44                 free_vx_info(vxi);
45 }
46
47 #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__)
48
49 static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi,
50         const char *_file, int _line)
51 {
52         BUG_ON(*vxp);
53         if (!vxi)
54                 return;
55         vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d.%d])",
56                 vxi, vxi?vxi->vx_id:0,
57                 vxi?atomic_read(&vxi->vx_usecnt):0,
58                 vxi?atomic_read(&vxi->vx_refcnt):0,
59                 _file, _line);
60         atomic_inc(&vxi->vx_refcnt);
61         *vxp = __get_vx_info(vxi, _file, _line);
62 }
63
64 #define clr_vx_info(p)  __clr_vx_info(p,__FILE__,__LINE__)
65
66 static inline void __clr_vx_info(struct vx_info **vxp,
67         const char *_file, int _line)
68 {
69         struct vx_info *vxo = *vxp;
70
71         if (!vxo)
72                 return;
73         vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d.%d])",
74                 vxo, vxo?vxo->vx_id:0,
75                 vxo?atomic_read(&vxo->vx_usecnt):0,
76                 vxo?atomic_read(&vxo->vx_refcnt):0,
77                 _file, _line);
78         *vxp = NULL;
79         wmb();
80         if (vxo && atomic_dec_and_test(&vxo->vx_refcnt))
81                 unhash_vx_info(vxo);
82         __put_vx_info(vxo, _file, _line);
83 }
84
85
86 #define task_get_vx_info(i)     __task_get_vx_info(i,__FILE__,__LINE__)
87
88 static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p,
89         const char *_file, int _line)
90 {
91         struct vx_info *vxi;
92         
93         task_lock(p);
94         vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)",
95                 p, _file, _line);
96         vxi = __get_vx_info(p->vx_info, _file, _line);
97         task_unlock(p);
98         return vxi;
99 }
100
101
102 #define vx_verify_info(p,i)     \
103         __vx_verify_info((p)->vx_info,i,__FILE__,__LINE__)
104
105 static __inline__ void __vx_verify_info(
106         struct vx_info *vxa, struct vx_info *vxb,
107         const char *_file, int _line)
108 {
109         if (vxa == vxb)
110                 return;
111         printk(KERN_ERR "vx bad assumption (%p==%p) at %s:%d\n",
112                 vxa, vxb, _file, _line);
113 }
114
115
116 #else
117 #warning duplicate inclusion
118 #endif