fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / vs_context.h
index bc8e9b4..fe3d6db 100644 (file)
@@ -1,15 +1,16 @@
-#ifndef _VX_VS_CONTEXT_H
-#define _VX_VS_CONTEXT_H
+#ifndef _VS_CONTEXT_H
+#define _VS_CONTEXT_H
 
-
-#include <linux/kernel.h>
+#include "vserver/base.h"
+#include "vserver/context.h"
+#include "vserver/history.h"
 #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 +18,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 +27,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 +56,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 +64,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 +78,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 +101,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 +128,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,17 +149,18 @@ 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;
 }
@@ -166,6 +172,49 @@ static inline void __wakeup_vx_info(struct vx_info *vxi)
                wake_up_interruptible(&vxi->vx_wait);
 }
 
+
+#define enter_vx_info(v,s)     __enter_vx_info(v,s,__FILE__,__LINE__)
+
+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(&current->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)
+{
+       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(&current->vx_info, vxis->vxi);
+       current->xid = vxis->xid;
+}
+
+
+static inline void __enter_vx_admin(struct vx_info_save *vxis)
+{
+       vxis->vxi = xchg(&current->vx_info, NULL);
+       vxis->xid = xchg(&current->xid, (xid_t)0);
+}
+
+static inline void __leave_vx_admin(struct vx_info_save *vxis)
+{
+       (void)xchg(&current->xid, vxis->xid);
+       (void)xchg(&current->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