X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fvs_context.h;h=8cdeb8d3a838a3ae3878aeb2f396a200a121b514;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=ab0e56ee92bd4e071ccde6c185948358fa040243;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/include/linux/vs_context.h b/include/linux/vs_context.h index ab0e56ee9..8cdeb8d3a 100644 --- a/include/linux/vs_context.h +++ b/include/linux/vs_context.h @@ -1,15 +1,14 @@ #ifndef _VX_VS_CONTEXT_H #define _VX_VS_CONTEXT_H - #include #include "vserver/debug.h" -#define get_vx_info(i) __get_vx_info(i,__FILE__,__LINE__) +#define get_vx_info(i) __get_vx_info(i,__FILE__,__LINE__,__HERE__) static inline struct vx_info *__get_vx_info(struct vx_info *vxi, - const char *_file, int _line) + const char *_file, int _line, void *_here) { if (!vxi) return NULL; @@ -17,7 +16,7 @@ static inline struct vx_info *__get_vx_info(struct vx_info *vxi, vxlprintk(VXD_CBIT(xid, 2), "get_vx_info(%p[#%d.%d])", vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - vxh_get_vx_info(vxi); + __vxh_get_vx_info(vxi, _here); atomic_inc(&vxi->vx_usecnt); return vxi; @@ -26,26 +25,28 @@ static inline struct vx_info *__get_vx_info(struct vx_info *vxi, extern void free_vx_info(struct vx_info *); -#define put_vx_info(i) __put_vx_info(i,__FILE__,__LINE__) +#define put_vx_info(i) __put_vx_info(i,__FILE__,__LINE__,__HERE__) -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, void *_here) { if (!vxi) return; + vxlprintk(VXD_CBIT(xid, 2), "put_vx_info(%p[#%d.%d])", vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - vxh_put_vx_info(vxi); + __vxh_put_vx_info(vxi, _here); if (atomic_dec_and_test(&vxi->vx_usecnt)) free_vx_info(vxi); } -#define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__) +#define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__,__HERE__) static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi, - const char *_file, int _line) + const char *_file, int _line, void *_here) { if (vxi) { vxlprintk(VXD_CBIT(xid, 3), @@ -53,7 +54,7 @@ static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi, vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - vxh_init_vx_info(vxi, vxp); + __vxh_init_vx_info(vxi, vxp, _here); atomic_inc(&vxi->vx_usecnt); } @@ -61,10 +62,10 @@ static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi, } -#define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__) +#define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__,__HERE__) static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi, - const char *_file, int _line) + const char *_file, int _line, void *_here) { struct vx_info *vxo; @@ -75,19 +76,18 @@ static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi, vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, _file, _line); - vxh_set_vx_info(vxi, vxp); + __vxh_set_vx_info(vxi, vxp, _here); - // vxo = xchg(vxp, __get_vx_info(vxi, _file, _line)); atomic_inc(&vxi->vx_usecnt); vxo = xchg(vxp, vxi); BUG_ON(vxo); } -#define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__) +#define clr_vx_info(p) __clr_vx_info(p,__FILE__,__LINE__,__HERE__) static inline void __clr_vx_info(struct vx_info **vxp, - const char *_file, int _line) + const char *_file, int _line, void *_here) { struct vx_info *vxo; @@ -99,25 +99,26 @@ static inline void __clr_vx_info(struct vx_info **vxp, vxo, vxo?vxo->vx_id:0, vxo?atomic_read(&vxo->vx_usecnt):0, _file, _line); - vxh_clr_vx_info(vxo, vxp); + __vxh_clr_vx_info(vxo, vxp, _here); - // __put_vx_info(vxo, _file, _line); if (atomic_dec_and_test(&vxo->vx_usecnt)) free_vx_info(vxo); } -#define claim_vx_info(v,p) __claim_vx_info(v,p,__FILE__,__LINE__) +#define claim_vx_info(v,p) \ + __claim_vx_info(v,p,__FILE__,__LINE__,__HERE__) static inline void __claim_vx_info(struct vx_info *vxi, - struct task_struct *task, const char *_file, int _line) + struct task_struct *task, + const char *_file, int _line, void *_here) { vxlprintk(VXD_CBIT(xid, 3), "claim_vx_info(%p[#%d.%d.%d]) %p", vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, vxi?atomic_read(&vxi->vx_tasks):0, task, _file, _line); - vxh_claim_vx_info(vxi, task); + __vxh_claim_vx_info(vxi, task, _here); atomic_inc(&vxi->vx_tasks); } @@ -125,17 +126,19 @@ static inline void __claim_vx_info(struct vx_info *vxi, extern void unhash_vx_info(struct vx_info *); -#define release_vx_info(v,p) __release_vx_info(v,p,__FILE__,__LINE__) +#define release_vx_info(v,p) \ + __release_vx_info(v,p,__FILE__,__LINE__,__HERE__) static inline void __release_vx_info(struct vx_info *vxi, - struct task_struct *task, const char *_file, int _line) + struct task_struct *task, + const char *_file, int _line, void *_here) { vxlprintk(VXD_CBIT(xid, 3), "release_vx_info(%p[#%d.%d.%d]) %p", vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, vxi?atomic_read(&vxi->vx_tasks):0, task, _file, _line); - vxh_release_vx_info(vxi, task); + __vxh_release_vx_info(vxi, task, _here); might_sleep(); @@ -144,22 +147,52 @@ static inline void __release_vx_info(struct vx_info *vxi, } -#define task_get_vx_info(p) __task_get_vx_info(p,__FILE__,__LINE__) +#define task_get_vx_info(p) \ + __task_get_vx_info(p,__FILE__,__LINE__,__HERE__) -static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p, - const char *_file, int _line) +static inline struct vx_info *__task_get_vx_info(struct task_struct *p, + const char *_file, int _line, void *_here) { struct vx_info *vxi; task_lock(p); vxlprintk(VXD_CBIT(xid, 5), "task_get_vx_info(%p)", p, _file, _line); - vxi = __get_vx_info(p->vx_info, _file, _line); + vxi = __get_vx_info(p->vx_info, _file, _line, _here); task_unlock(p); return vxi; } +static inline void __wakeup_vx_info(struct vx_info *vxi) +{ + if (waitqueue_active(&vxi->vx_wait)) + wake_up_interruptible(&vxi->vx_wait); +} + +extern void exit_vx_info(struct task_struct *, int); + +static inline +struct task_struct *vx_child_reaper(struct task_struct *p) +{ + struct vx_info *vxi = p->vx_info; + struct task_struct *reaper = child_reaper; + + if (!vxi) + goto out; + + BUG_ON(!p->vx_info->vx_reaper); + + /* child reaper for the guest reaper */ + if (vxi->vx_reaper == p) + goto out; + + reaper = vxi->vx_reaper; +out: + return reaper; +} + + #else #warning duplicate inclusion #endif