X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fvs_context.h;h=fe3d6db64441941239706a8d7ae5eecf37264d42;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=9d119cdc24fcc293294813d85b7c6368df574e70;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/include/linux/vs_context.h b/include/linux/vs_context.h index 9d119cdc2..fe3d6db64 100644 --- a/include/linux/vs_context.h +++ b/include/linux/vs_context.h @@ -1,28 +1,25 @@ -#ifndef _VX_VS_CONTEXT_H -#define _VX_VS_CONTEXT_H - - -#include -#include -#include +#ifndef _VS_CONTEXT_H +#define _VS_CONTEXT_H +#include "vserver/base.h" #include "vserver/context.h" +#include "vserver/history.h" #include "vserver/debug.h" -extern int proc_pid_vx_info(struct task_struct *, char *); - - -#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; + 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, _here); + atomic_inc(&vxi->vx_usecnt); return vxi; } @@ -30,44 +27,69 @@ 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, _here); + 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__) + +#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, void *_here) +{ + if (vxi) { + vxlprintk(VXD_CBIT(xid, 3), + "init_vx_info(%p[#%d.%d])", + vxi, vxi?vxi->vx_id:0, + vxi?atomic_read(&vxi->vx_usecnt):0, + _file, _line); + __vxh_init_vx_info(vxi, vxp, _here); + + atomic_inc(&vxi->vx_usecnt); + } + *vxp = vxi; +} + + +#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; if (!vxi) return; - vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d.%d])", + vxlprintk(VXD_CBIT(xid, 3), "set_vx_info(%p[#%d.%d])", vxi, vxi?vxi->vx_id:0, vxi?atomic_read(&vxi->vx_usecnt):0, - vxi?atomic_read(&vxi->vx_refcnt):0, _file, _line); + __vxh_set_vx_info(vxi, vxp, _here); - atomic_inc(&vxi->vx_refcnt); - 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; @@ -75,48 +97,124 @@ static inline void __clr_vx_info(struct vx_info **vxp, if (!vxo) return; - vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d.%d])", + vxlprintk(VXD_CBIT(xid, 3), "clr_vx_info(%p[#%d.%d])", vxo, vxo?vxo->vx_id:0, vxo?atomic_read(&vxo->vx_usecnt):0, - vxo?atomic_read(&vxo->vx_refcnt):0, _file, _line); + __vxh_clr_vx_info(vxo, vxp, _here); - if (atomic_dec_and_test(&vxo->vx_refcnt)) - unhash_vx_info(vxo); - __put_vx_info(vxo, _file, _line); + if (atomic_dec_and_test(&vxo->vx_usecnt)) + free_vx_info(vxo); } -#define task_get_vx_info(i) __task_get_vx_info(i,__FILE__,__LINE__) +#define claim_vx_info(v,p) \ + __claim_vx_info(v,p,__FILE__,__LINE__,__HERE__) -static __inline__ struct vx_info *__task_get_vx_info(struct task_struct *p, - const char *_file, int _line) +static inline void __claim_vx_info(struct vx_info *vxi, + 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, _here); + + atomic_inc(&vxi->vx_tasks); +} + + +extern void unhash_vx_info(struct vx_info *); + +#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, 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, _here); + + might_sleep(); + + if (atomic_dec_and_test(&vxi->vx_tasks)) + unhash_vx_info(vxi); +} + + +#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, 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; } -#define vx_verify_info(p,i) \ - __vx_verify_info((p)->vx_info,i,__FILE__,__LINE__) +static inline void __wakeup_vx_info(struct vx_info *vxi) +{ + if (waitqueue_active(&vxi->vx_wait)) + wake_up_interruptible(&vxi->vx_wait); +} + + +#define enter_vx_info(v,s) __enter_vx_info(v,s,__FILE__,__LINE__) -static __inline__ void __vx_verify_info( - struct vx_info *vxa, struct vx_info *vxb, +static inline void __enter_vx_info(struct vx_info *vxi, + struct vx_info_save *vxis, const char *_file, int _line) +{ + vxlprintk(VXD_CBIT(xid, 5), "enter_vx_info(%p[#%d],%p) %p[#%d,%p]", + vxi, vxi ? vxi->vx_id : 0, vxis, current, + current->xid, current->vx_info, _file, _line); + vxis->vxi = xchg(¤t->vx_info, vxi); + vxis->xid = current->xid; + current->xid = vxi ? vxi->vx_id : 0; +} + +#define leave_vx_info(s) __leave_vx_info(s,__FILE__,__LINE__) + +static inline void __leave_vx_info(struct vx_info_save *vxis, const char *_file, int _line) { - if (vxa == vxb) - return; - printk(KERN_ERR "vx bad assumption (%p==%p) at %s:%d\n", - vxa, vxb, _file, _line); + vxlprintk(VXD_CBIT(xid, 5), "leave_vx_info(%p[#%d,%p]) %p[#%d,%p]", + vxis, vxis->xid, vxis->vxi, current, + current->xid, current->vx_info, _file, _line); + (void)xchg(¤t->vx_info, vxis->vxi); + current->xid = vxis->xid; } +static inline void __enter_vx_admin(struct vx_info_save *vxis) +{ + vxis->vxi = xchg(¤t->vx_info, NULL); + vxis->xid = xchg(¤t->xid, (xid_t)0); +} + +static inline void __leave_vx_admin(struct vx_info_save *vxis) +{ + (void)xchg(¤t->xid, vxis->xid); + (void)xchg(¤t->vx_info, vxis->vxi); +} + +extern void exit_vx_info(struct task_struct *, int); +extern void exit_vx_info_early(struct task_struct *, int); + + #else #warning duplicate inclusion #endif