X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fvs_network.h;h=4bbf9236833285ea2117ed7db3511b66224cbf14;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=915ad174fcfcca2171ff5407b8bc101ae0d0f1a5;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/include/linux/vs_network.h b/include/linux/vs_network.h index 915ad174f..4bbf92368 100644 --- a/include/linux/vs_network.h +++ b/include/linux/vs_network.h @@ -27,7 +27,7 @@ static inline struct nx_info *__get_nx_info(struct nx_info *nxi, } -#define free_nx_info(i) \ +#define free_nx_info(i) \ call_rcu(&i->nx_rcu, rcu_free_nx_info); #define put_nx_info(i) __put_nx_info(i,__FILE__,__LINE__) @@ -43,41 +43,45 @@ static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _li free_nx_info(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, const char *_file, int _line) { - BUG_ON(*nxp); + struct nx_info *nxo; + if (!nxi) return; + vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%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); - *nxp = __get_nx_info(nxi, _file, _line); + nxo = xchg(nxp, __get_nx_info(nxi, _file, _line)); + BUG_ON(nxo); } -#define clr_nx_info(p) __clr_nx_info(p,__FILE__,__LINE__) +#define clr_nx_info(p) __clr_nx_info(p,__FILE__,__LINE__) static inline void __clr_nx_info(struct nx_info **nxp, const char *_file, int _line) { - struct nx_info *nxo = *nxp; + struct nx_info *nxo; + nxo = xchg(nxp, NULL); if (!nxo) return; + vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d.%d])", nxo, nxo?nxo->nx_id:0, nxo?atomic_read(&nxo->nx_usecnt):0, nxo?atomic_read(&nxo->nx_refcnt):0, _file, _line); - *nxp = NULL; - wmb(); - if (nxo && atomic_dec_and_test(&nxo->nx_refcnt)) + + if (atomic_dec_and_test(&nxo->nx_refcnt)) unhash_nx_info(nxo); __put_nx_info(nxo, _file, _line); } @@ -89,7 +93,7 @@ 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); nxi = __get_nx_info(p->nx_info, _file, _line); vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)", @@ -123,7 +127,7 @@ static __inline__ void __nx_verify_info( #define __nx_flags(v,m,f) (((v) & (m)) ^ (f)) -#define __nx_task_flags(t,m,f) \ +#define __nx_task_flags(t,m,f) \ (((t) && ((t)->nx_info)) ? \ __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0) @@ -139,6 +143,21 @@ static __inline__ void __nx_verify_info( #define nx_ncaps(c) (nx_current_ncaps() & (c)) +static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr) +{ + int n,i; + + if (!nxi) + return 1; + + n = nxi->nbipv4; + for (i=0; iipv4[i] == addr) + return 1; + } + return 0; +} + #else #warning duplicate inclusion