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