X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Fcontext.c;h=533e104396b0d4c035f38d7a5eb9a5b94ea76339;hb=89d192394c0ea1b5d433957770a47418e56acf92;hp=a1860ef93536adc5433124688aba59478234a0a5;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/kernel/vserver/context.c b/kernel/vserver/context.c index a1860ef93..533e10439 100644 --- a/kernel/vserver/context.c +++ b/kernel/vserver/context.c @@ -26,11 +26,6 @@ #include #include -#define CKRM_VSERVER_INTEGRATION -#ifdef CKRM_VSERVER_INTEGRATION -#include -#endif //CKRM_VSERVER_INTEGRATION - #include @@ -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; }