fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / vs_network.h
index 4bbf923..f2cf3ab 100644 (file)
@@ -1,17 +1,12 @@
 #ifndef _NX_VS_NETWORK_H
 #define _NX_VS_NETWORK_H
 
-#include <linux/kernel.h>
-#include <linux/rcupdate.h>
-#include <linux/sched.h>
-
+#include "vserver/context.h"
 #include "vserver/network.h"
+#include "vserver/base.h"
 #include "vserver/debug.h"
 
 
-extern int proc_pid_nx_info(struct task_struct *, char *);
-
-
 #define get_nx_info(i) __get_nx_info(i,__FILE__,__LINE__)
 
 static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
@@ -19,16 +14,17 @@ static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
 {
        if (!nxi)
                return NULL;
+
        vxlprintk(VXD_CBIT(nid, 2), "get_nx_info(%p[#%d.%d])",
                nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
                _file, _line);
+
        atomic_inc(&nxi->nx_usecnt);
        return nxi;
 }
 
 
-#define free_nx_info(i) \
-       call_rcu(&i->nx_rcu, rcu_free_nx_info);
+extern void free_nx_info(struct nx_info *);
 
 #define put_nx_info(i) __put_nx_info(i,__FILE__,__LINE__)
 
@@ -36,13 +32,34 @@ static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _li
 {
        if (!nxi)
                return;
+
        vxlprintk(VXD_CBIT(nid, 2), "put_nx_info(%p[#%d.%d])",
                nxi, nxi?nxi->nx_id:0, nxi?atomic_read(&nxi->nx_usecnt):0,
                _file, _line);
+
        if (atomic_dec_and_test(&nxi->nx_usecnt))
                free_nx_info(nxi);
 }
 
+
+#define init_nx_info(p,i) __init_nx_info(p,i,__FILE__,__LINE__)
+
+static inline void __init_nx_info(struct nx_info **nxp, struct nx_info *nxi,
+               const char *_file, int _line)
+{
+       if (nxi) {
+               vxlprintk(VXD_CBIT(nid, 3),
+                       "init_nx_info(%p[#%d.%d])",
+                       nxi, nxi?nxi->nx_id:0,
+                       nxi?atomic_read(&nxi->nx_usecnt):0,
+                       _file, _line);
+
+               atomic_inc(&nxi->nx_usecnt);
+       }
+       *nxp = nxi;
+}
+
+
 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
 
 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
@@ -53,14 +70,13 @@ static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
        if (!nxi)
                return;
 
-       vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%d.%d])",
+       vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%d])",
                nxi, nxi?nxi->nx_id:0,
                nxi?atomic_read(&nxi->nx_usecnt):0,
-               nxi?atomic_read(&nxi->nx_refcnt):0,
                _file, _line);
 
-       atomic_inc(&nxi->nx_refcnt);
-       nxo = xchg(nxp, __get_nx_info(nxi, _file, _line));
+       atomic_inc(&nxi->nx_usecnt);
+       nxo = xchg(nxp, nxi);
        BUG_ON(nxo);
 }
 
@@ -75,72 +91,67 @@ static inline void __clr_nx_info(struct nx_info **nxp,
        if (!nxo)
                return;
 
-       vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d.%d])",
+       vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d])",
                nxo, nxo?nxo->nx_id:0,
                nxo?atomic_read(&nxo->nx_usecnt):0,
-               nxo?atomic_read(&nxo->nx_refcnt):0,
                _file, _line);
 
-       if (atomic_dec_and_test(&nxo->nx_refcnt))
-               unhash_nx_info(nxo);
-       __put_nx_info(nxo, _file, _line);
+       if (atomic_dec_and_test(&nxo->nx_usecnt))
+               free_nx_info(nxo);
 }
 
 
-#define task_get_nx_info(i)    __task_get_nx_info(i,__FILE__,__LINE__)
+#define claim_nx_info(v,p) __claim_nx_info(v,p,__FILE__,__LINE__)
 
-static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
-       const char *_file, int _line)
+static inline void __claim_nx_info(struct nx_info *nxi,
+       struct task_struct *task, const char *_file, int _line)
 {
-       struct nx_info *nxi;
-
-       task_lock(p);
-       nxi = __get_nx_info(p->nx_info, _file, _line);
-       vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
-               p, _file, _line);
-       task_unlock(p);
-       return nxi;
-}
-
-#define nx_verify_info(p,i)    \
-       __nx_verify_info((p)->nx_info,i,__FILE__,__LINE__)
+       vxlprintk(VXD_CBIT(nid, 3), "claim_nx_info(%p[#%d.%d.%d]) %p",
+               nxi, nxi?nxi->nx_id:0,
+               nxi?atomic_read(&nxi->nx_usecnt):0,
+               nxi?atomic_read(&nxi->nx_tasks):0,
+               task, _file, _line);
 
-static __inline__ void __nx_verify_info(
-       struct nx_info *ipa, struct nx_info *ipb,
-       const char *_file, int _line)
-{
-       if (ipa == ipb)
-               return;
-       printk(KERN_ERR "ip bad assumption (%p==%p) at %s:%d\n",
-               ipa, ipb, _file, _line);
+       atomic_inc(&nxi->nx_tasks);
 }
 
 
-#define nx_task_nid(t) ((t)->nid)
-
-#define nx_current_nid() nx_task_nid(current)
+extern void unhash_nx_info(struct nx_info *);
 
-#define nx_check(c,m)  __nx_check(nx_current_nid(),c,m)
+#define release_nx_info(v,p) __release_nx_info(v,p,__FILE__,__LINE__)
 
-#define nx_weak_check(c,m)     ((m) ? nx_check(c,m) : 1)
+static inline void __release_nx_info(struct nx_info *nxi,
+       struct task_struct *task, const char *_file, int _line)
+{
+       vxlprintk(VXD_CBIT(nid, 3), "release_nx_info(%p[#%d.%d.%d]) %p",
+               nxi, nxi?nxi->nx_id:0,
+               nxi?atomic_read(&nxi->nx_usecnt):0,
+               nxi?atomic_read(&nxi->nx_tasks):0,
+               task, _file, _line);
 
+       might_sleep();
 
-#define __nx_flags(v,m,f)      (((v) & (m)) ^ (f))
+       if (atomic_dec_and_test(&nxi->nx_tasks))
+               unhash_nx_info(nxi);
+}
 
-#define __nx_task_flags(t,m,f) \
-       (((t) && ((t)->nx_info)) ? \
-               __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0)
 
-#define nx_current_flags() \
-       ((current->nx_info) ? current->nx_info->nx_flags : 0)
+#define task_get_nx_info(i)    __task_get_nx_info(i,__FILE__,__LINE__)
 
-#define nx_flags(m,f)  __nx_flags(nx_current_flags(),(m),(f))
+static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
+       const char *_file, int _line)
+{
+       struct nx_info *nxi;
 
+       task_lock(p);
+       vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
+               p, _file, _line);
+       nxi = __get_nx_info(p->nx_info, _file, _line);
+       task_unlock(p);
+       return nxi;
+}
 
-#define nx_current_ncaps() \
-       ((current->nx_info) ? current->nx_info->nx_ncaps : 0)
 
-#define nx_ncaps(c)    (nx_current_ncaps() & (c))
 
 
 static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
@@ -151,6 +162,8 @@ static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
                return 1;
 
        n = nxi->nbipv4;
+       if (n && (nxi->ipv4[0] == 0))
+               return 1;
        for (i=0; i<n; i++) {
                if (nxi->ipv4[i] == addr)
                        return 1;
@@ -158,6 +171,12 @@ static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
        return 0;
 }
 
+static inline void exit_nx_info(struct task_struct *p)
+{
+       if (p->nx_info)
+               release_nx_info(p->nx_info, p);
+}
+
 
 #else
 #warning duplicate inclusion