This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / kernel / vserver / context.c
index a1860ef..533e104 100644 (file)
 #include <linux/namespace.h>
 #include <linux/rcupdate.h>
 
-#define CKRM_VSERVER_INTEGRATION
-#ifdef CKRM_VSERVER_INTEGRATION
-#include <linux/ckrm.h>
-#endif //CKRM_VSERVER_INTEGRATION
-
 #include <asm/errno.h>
 
 
@@ -43,7 +38,7 @@ static struct vx_info *__alloc_vx_info(xid_t xid)
 {
        struct vx_info *new = NULL;
        
-       vxdprintk(VXD_CBIT(xid, 0), "alloc_vx_info(%d)*", xid);
+       vxdprintk("alloc_vx_info(%d)\n", xid);
 
        /* would this benefit from a slab cache? */
        new = kmalloc(sizeof(struct vx_info), GFP_KERNEL);
@@ -67,8 +62,7 @@ static struct vx_info *__alloc_vx_info(xid_t xid)
        new->vx_bcaps = CAP_INIT_EFF_SET;
        new->vx_ccaps = 0;
 
-       vxdprintk(VXD_CBIT(xid, 0),
-               "alloc_vx_info(%d) = %p", xid, new);
+       vxdprintk("alloc_vx_info(%d) = %p\n", xid, new);
        return new;
 }
 
@@ -78,8 +72,7 @@ static struct vx_info *__alloc_vx_info(xid_t xid)
 
 static void __dealloc_vx_info(struct vx_info *vxi)
 {
-       vxdprintk(VXD_CBIT(xid, 0),
-               "dealloc_vx_info(%p)", vxi);
+       vxdprintk("dealloc_vx_info(%p)\n", vxi);
 
        vxi->vx_hlist.next = LIST_POISON1;
        vxi->vx_id = -1;
@@ -126,8 +119,7 @@ static inline void __hash_vx_info(struct vx_info *vxi)
 {
        struct hlist_head *head;
        
-       vxdprintk(VXD_CBIT(xid, 4),
-               "__hash_vx_info: %p[#%d]", vxi, vxi->vx_id);
+       vxdprintk("__hash_vx_info: %p[#%d]\n", vxi, vxi->vx_id);
        get_vx_info(vxi);
        head = &vx_info_hash[__hashval(vxi->vx_id)];
        hlist_add_head_rcu(&vxi->vx_hlist, head);
@@ -140,8 +132,7 @@ static inline void __hash_vx_info(struct vx_info *vxi)
 
 static inline void __unhash_vx_info(struct vx_info *vxi)
 {
-       vxdprintk(VXD_CBIT(xid, 4),
-               "__unhash_vx_info: %p[#%d]", vxi, vxi->vx_id);
+       vxdprintk("__unhash_vx_info: %p[#%d]\n", vxi, vxi->vx_id);
        hlist_del_rcu(&vxi->vx_hlist);
        put_vx_info(vxi);
 }
@@ -182,11 +173,8 @@ static inline xid_t __vx_dynamic_id(void)
        do {
                if (++seq > MAX_S_CONTEXT)
                        seq = MIN_D_CONTEXT;
-               if (!__lookup_vx_info(seq)) {
-                       vxdprintk(VXD_CBIT(xid, 4),
-                               "__vx_dynamic_id: [#%d]", seq);
+               if (!__lookup_vx_info(seq))
                        return seq;
-               }
        } while (barrier != seq);
        return 0;
 }
@@ -200,7 +188,7 @@ static struct vx_info * __loc_vx_info(int id, int *err)
 {
        struct vx_info *new, *vxi = NULL;
        
-       vxdprintk(VXD_CBIT(xid, 1), "loc_vx_info(%d)*", id);
+       vxdprintk("loc_vx_info(%d)\n", id);
 
        if (!(new = __alloc_vx_info(id))) {
                *err = -ENOMEM;
@@ -222,13 +210,11 @@ static struct vx_info * __loc_vx_info(int id, int *err)
        else if ((vxi = __lookup_vx_info(id))) {
                /* context in setup is not available */
                if (vxi->vx_flags & VXF_STATE_SETUP) {
-                       vxdprintk(VXD_CBIT(xid, 0),
-                               "loc_vx_info(%d) = %p (not available)", id, vxi);
+                       vxdprintk("loc_vx_info(%d) = %p (not available)\n", id, vxi);
                        vxi = NULL;
                        *err = -EBUSY;
                } else {
-                       vxdprintk(VXD_CBIT(xid, 0),
-                               "loc_vx_info(%d) = %p (found)", id, vxi);
+                       vxdprintk("loc_vx_info(%d) = %p (found)\n", id, vxi);
                        get_vx_info(vxi);
                        *err = 0;
                }
@@ -236,8 +222,7 @@ static struct vx_info * __loc_vx_info(int id, int *err)
        }
 
        /* new context requested */
-       vxdprintk(VXD_CBIT(xid, 0),
-               "loc_vx_info(%d) = %p (new)", id, new);
+       vxdprintk("loc_vx_info(%d) = %p (new)\n", id, new);
        __hash_vx_info(get_vx_info(new));
        vxi = new, new = NULL;
        *err = 1;
@@ -255,12 +240,12 @@ out_unlock:
 
 
 
-void rcu_free_vx_info(struct rcu_head *head)
+void rcu_free_vx_info(void *obj)
 {
-       struct vx_info *vxi = container_of(head, struct vx_info, vx_rcu);
+       struct vx_info *vxi = obj;
        int usecnt, refcnt;
 
-       BUG_ON(!vxi || !head);
+       BUG_ON(!vxi);
 
        usecnt = atomic_read(&vxi->vx_usecnt);
        BUG_ON(usecnt < 0);
@@ -268,8 +253,6 @@ void rcu_free_vx_info(struct rcu_head *head)
        refcnt = atomic_read(&vxi->vx_refcnt);
        BUG_ON(refcnt < 0);
 
-       vxdprintk(VXD_CBIT(xid, 3),
-               "rcu_free_vx_info(%p): uc=%d", vxi, usecnt);
        if (!usecnt)
                __dealloc_vx_info(vxi);
        else
@@ -402,23 +385,25 @@ void vx_mask_bcaps(struct task_struct *p)
 static inline int vx_nofiles_task(struct task_struct *tsk)
 {
        struct files_struct *files = tsk->files;
-       const unsigned long *obptr;
+       const unsigned long *obptr, *cbptr;
        int count, total;
 
        spin_lock(&files->file_lock);
        obptr = files->open_fds->fds_bits;
+       cbptr = files->close_on_exec->fds_bits;
        count = files->max_fds / (sizeof(unsigned long) * 8);
        for (total = 0; count > 0; count--) {
                if (*obptr)
                        total += hweight_long(*obptr);
                obptr++;
+       /*      if (*cbptr)
+                       total += hweight_long(*cbptr);
+               cbptr++; */
        }
        spin_unlock(&files->file_lock);
        return total;
 }
 
-#if 0
-
 static inline int vx_openfd_task(struct task_struct *tsk)
 {
        struct files_struct *files = tsk->files;
@@ -437,8 +422,6 @@ static inline int vx_openfd_task(struct task_struct *tsk)
        return total;
 }
 
-#endif
-
 /*
  *     migrate task to new context
  *     gets vxi, puts old_vxi on change
@@ -456,32 +439,26 @@ int vx_migrate_task(struct task_struct *p, struct vx_info *vxi)
        if (old_vxi == vxi)
                goto out;
 
-       vxdprintk(VXD_CBIT(xid, 5),
-               "vx_migrate_task(%p,%p[#%d.%d])", p, vxi,
+       vxdprintk("vx_migrate_task(%p,%p[#%d.%d)\n", p, vxi,
                vxi->vx_id, atomic_read(&vxi->vx_usecnt));
 
        if (!(ret = vx_migrate_user(p, vxi))) {
-               int nofiles;
+               int openfd, nofiles;
 
                task_lock(p);
-               // openfd = vx_openfd_task(p);
+               openfd = vx_openfd_task(p);
                nofiles = vx_nofiles_task(p);
 
                if (old_vxi) {
                        atomic_dec(&old_vxi->cacct.nr_threads);
                        atomic_dec(&old_vxi->limit.rcur[RLIMIT_NPROC]);
-                       atomic_sub(nofiles, &old_vxi->limit.rcur[RLIMIT_NOFILE]);
-                       // atomic_sub(openfd, &old_vxi->limit.rcur[RLIMIT_OPENFD]);
+                       atomic_sub(nofiles, &vxi->limit.rcur[RLIMIT_NOFILE]);
+                       atomic_sub(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]);
                }               
                atomic_inc(&vxi->cacct.nr_threads);
                atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]);
                atomic_add(nofiles, &vxi->limit.rcur[RLIMIT_NOFILE]);
-               // atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]);
-
-               vxdprintk(VXD_CBIT(xid, 5),
-                       "moved task %p into vxi:%p[#%d]",
-                       p, vxi, vxi->vx_id);
-
+               atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]);
                /* should be handled in set_vx_info !! */
                if (old_vxi)
                        clr_vx_info(&p->vx_info);
@@ -494,15 +471,6 @@ int vx_migrate_task(struct task_struct *p, struct vx_info *vxi)
                // put_vx_info(old_vxi);
        }
 out:
-
-
-#ifdef CKRM_VSERVER_INTEGRATION
-       do {
-         ckrm_cb_xid(p);
-       } while (0);
-#endif //CKRM_VSERVER_INTEGRATION
-
-
        put_vx_info(old_vxi);
        return ret;
 }