X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fvinline.h;h=ce2bf36c1e56251052c7d2ccc6eb914d5d727997;hb=d46bc780027c5439db9f72d42c0732775b53925a;hp=07bb3698a597c299f1cd18f2f02fd98ed357e116;hpb=b76fcd5f0c655b6e3e9bf534594357025421c66a;p=linux-2.6.git diff --git a/include/linux/vinline.h b/include/linux/vinline.h index 07bb3698a..ce2bf36c1 100644 --- a/include/linux/vinline.h +++ b/include/linux/vinline.h @@ -5,6 +5,7 @@ // #define VX_DEBUG #include +#include #include #include "vserver/context.h" @@ -19,39 +20,38 @@ -void free_vx_info(struct vx_info *); - extern int proc_pid_vx_info(struct task_struct *, char *); #define get_vx_info(i) __get_vx_info(i,__FILE__,__LINE__) -static __inline__ struct vx_info *__get_vx_info(struct vx_info *vxi, +static inline struct vx_info *__get_vx_info(struct vx_info *vxi, const char *_file, int _line) { if (!vxi) return NULL; vxdprintk("get_vx_info(%p[#%d.%d])\t%s:%d\n", - vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_refcount):0, + vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - atomic_inc(&vxi->vx_refcount); + atomic_inc(&vxi->vx_usecnt); return vxi; } + +#define free_vx_info(vxi) \ + call_rcu(&vxi->vx_rcu, rcu_free_vx_info, vxi); + #define put_vx_info(i) __put_vx_info(i,__FILE__,__LINE__) -static __inline__ void __put_vx_info(struct vx_info *vxi, const char *_file, int _line) +static inline void __put_vx_info(struct vx_info *vxi, const char *_file, int _line) { if (!vxi) return; vxdprintk("put_vx_info(%p[#%d.%d])\t%s:%d\n", - vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_refcount):0, + vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - if (atomic_dec_and_lock(&vxi->vx_refcount, &vxlist_lock)) { - list_del(&vxi->vx_list); - spin_unlock(&vxlist_lock); + if (atomic_dec_and_test(&vxi->vx_usecnt)) free_vx_info(vxi); - } } #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__) @@ -62,9 +62,12 @@ static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi, BUG_ON(*vxp); if (!vxi) return; - vxdprintk("set_vx_info(%p[#%d.%d])\t%s:%d\n", - vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_refcount):0, + vxdprintk("set_vx_info(%p[#%d.%d.%d])\t%s:%d\n", + vxi, vxi?vxi->vx_id:0, + vxi?atomic_read(&vxi->vx_usecnt):0, + vxi?atomic_read(&vxi->vx_refcnt):0, _file, _line); + atomic_inc(&vxi->vx_refcnt); *vxp = __get_vx_info(vxi, _file, _line); } @@ -75,11 +78,17 @@ static inline void __clr_vx_info(struct vx_info **vxp, { struct vx_info *vxo = *vxp; - vxdprintk("clr_vx_info(%p[#%d.%d])\t%s:%d\n", - vxo, vxo?vxo->vx_id:0, vxo?atomic_read(&vxo->vx_refcount):0, + if (!vxo) + return; + vxdprintk("clr_vx_info(%p[#%d.%d.%d])\t%s:%d\n", + vxo, vxo?vxo->vx_id:0, + vxo?atomic_read(&vxo->vx_usecnt):0, + vxo?atomic_read(&vxo->vx_refcnt):0, _file, _line); *vxp = NULL; wmb(); + if (vxo && atomic_dec_and_test(&vxo->vx_refcnt)) + unhash_vx_info(vxo); __put_vx_info(vxo, _file, _line); }