-#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;
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;
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),
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);
}
}
-#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;
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;
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);
}
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();
}
-#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;
}
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(¤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)
+{
+ 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