This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / linux / vs_network.h
1 #ifndef _NX_VS_NETWORK_H
2 #define _NX_VS_NETWORK_H
3
4
5 // #define NX_DEBUG
6
7 #include <linux/kernel.h>
8 #include <linux/rcupdate.h>
9 #include <linux/sched.h>
10
11 #include "vserver/network.h"
12
13 #if defined(NX_DEBUG)
14 #define nxdprintk(x...) printk("nxd: " x)
15 #else
16 #define nxdprintk(x...)
17 #endif
18
19
20 extern int proc_pid_nx_info(struct task_struct *, char *);
21
22
23 #define get_nx_info(i)  __get_nx_info(i,__FILE__,__LINE__)
24
25 static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
26         const char *_file, int _line)
27 {
28         if (!nxi)
29                 return NULL;
30         nxdprintk("get_nx_info(%p[#%d.%d])\t%s:%d\n",
31                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
32                 _file, _line);
33         atomic_inc(&nxi->nx_usecnt);
34         return nxi;
35 }
36
37
38 #define free_nx_info(nxi)       \
39         call_rcu(&nxi->nx_rcu, rcu_free_nx_info, nxi);
40
41 #define put_nx_info(i)  __put_nx_info(i,__FILE__,__LINE__)
42
43 static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _line)
44 {
45         if (!nxi)
46                 return;
47         nxdprintk("put_nx_info(%p[#%d.%d])\t%s:%d\n",
48                 nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
49                 _file, _line);
50         if (atomic_dec_and_test(&nxi->nx_usecnt))
51                 free_nx_info(nxi);
52 }
53
54
55 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
56
57 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
58         const char *_file, int _line)
59 {
60         BUG_ON(*nxp);
61         if (!nxi)
62                 return;
63         nxdprintk("set_nx_info(%p[#%d.%d.%d])\t%s:%d\n",
64                 nxi, nxi?nxi->nx_id:0,
65                 nxi?atomic_read(&nxi->nx_usecnt):0,
66                 nxi?atomic_read(&nxi->nx_refcnt):0,
67                 _file, _line);
68         atomic_inc(&nxi->nx_refcnt);
69         *nxp = __get_nx_info(nxi, _file, _line);
70 }
71
72 #define clr_nx_info(p)  __clr_nx_info(p,__FILE__,__LINE__)
73
74 static inline void __clr_nx_info(struct nx_info **nxp,
75         const char *_file, int _line)
76 {
77         struct nx_info *nxo = *nxp;
78
79         if (!nxo)
80                 return;
81         nxdprintk("clr_nx_info(%p[#%d.%d.%d])\t%s:%d\n",
82                 nxo, nxo?nxo->nx_id:0,
83                 nxo?atomic_read(&nxo->nx_usecnt):0,
84                 nxo?atomic_read(&nxo->nx_refcnt):0,
85                 _file, _line);
86         *nxp = NULL;
87         wmb();
88         if (nxo && atomic_dec_and_test(&nxo->nx_refcnt))
89                 unhash_nx_info(nxo);
90         __put_nx_info(nxo, _file, _line);
91 }
92
93
94 #define task_get_nx_info(i)     __task_get_nx_info(i,__FILE__,__LINE__)
95
96 static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
97         const char *_file, int _line)
98 {
99         struct nx_info *nxi;
100         
101         task_lock(p);
102         nxi = __get_nx_info(p->nx_info, _file, _line);
103         task_unlock(p);
104         return nxi;
105 }
106
107 #define nx_verify_info(p,i)     \
108         __nx_verify_info((p)->nx_info,i,__FILE__,__LINE__)
109
110 static __inline__ void __nx_verify_info(
111         struct nx_info *ipa, struct nx_info *ipb,
112         const char *_file, int _line)
113 {
114         if (ipa == ipb)
115                 return;
116         printk(KERN_ERR "ip bad assumption (%p==%p) at %s:%d\n",
117                 ipa, ipb, _file, _line);
118 }
119
120
121 #define nx_task_nid(t)  ((t)->nid)
122
123 #define nx_current_nid() nx_task_nid(current)
124
125 #define nx_check(c,m)   __nx_check(nx_current_nid(),c,m)
126
127 #define nx_weak_check(c,m)      ((m) ? nx_check(c,m) : 1)
128
129 #undef nxdprintk
130 #define nxdprintk(x...)
131
132
133 #define __nx_flags(v,m,f)       (((v) & (m)) ^ (f))
134
135 #define __nx_task_flags(t,m,f) \
136         (((t) && ((t)->nx_info)) ? \
137                 __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0)
138
139 #define nx_current_flags() \
140         ((current->nx_info) ? current->nx_info->nx_flags : 0)
141
142 #define nx_flags(m,f)   __nx_flags(nx_current_flags(),(m),(f))
143
144
145 #define nx_current_ncaps() \
146         ((current->nx_info) ? current->nx_info->nx_ncaps : 0)
147
148 #define nx_ncaps(c)     (nx_current_ncaps() & (c))
149
150
151
152 #else
153 #warning duplicate inclusion
154 #endif