X-Git-Url: http://git.onelab.eu/?p=linux-2.6.git;a=blobdiff_plain;f=kernel%2Fvserver%2Fcontext.c;h=533e104396b0d4c035f38d7a5eb9a5b94ea76339;hp=8b3cee7cc0630da8b2bd621668d6ca0396da1a6c;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hpb=c449269f45c2cdf53af08c8d0af37472f66539d9 diff --git a/kernel/vserver/context.c b/kernel/vserver/context.c index 8b3cee7cc..533e10439 100644 --- a/kernel/vserver/context.c +++ b/kernel/vserver/context.c @@ -18,9 +18,10 @@ #include #include -#include +#include #include -#include +#include +#include #include #include #include @@ -147,7 +148,7 @@ static inline struct vx_info *__lookup_vx_info(xid_t xid) struct hlist_head *head = &vx_info_hash[__hashval(xid)]; struct hlist_node *pos; - hlist_for_each(pos, head) { + hlist_for_each_rcu(pos, head) { struct vx_info *vxi = hlist_entry(pos, struct vx_info, vx_hlist); @@ -244,6 +245,8 @@ void rcu_free_vx_info(void *obj) struct vx_info *vxi = obj; int usecnt, refcnt; + BUG_ON(!vxi); + usecnt = atomic_read(&vxi->vx_usecnt); BUG_ON(usecnt < 0); @@ -440,15 +443,22 @@ int vx_migrate_task(struct task_struct *p, struct vx_info *vxi) vxi->vx_id, atomic_read(&vxi->vx_usecnt)); if (!(ret = vx_migrate_user(p, vxi))) { + int openfd, nofiles; + task_lock(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.res[RLIMIT_NPROC]); + atomic_dec(&old_vxi->limit.rcur[RLIMIT_NPROC]); + 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.res[RLIMIT_NPROC]); - atomic_add(vx_nofiles_task(p), &vxi->limit.res[RLIMIT_NOFILE]); - atomic_add(vx_openfd_task(p), &vxi->limit.res[RLIMIT_OPENFD]); + atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); + atomic_add(nofiles, &vxi->limit.rcur[RLIMIT_NOFILE]); + atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]); /* should be handled in set_vx_info !! */ if (old_vxi) clr_vx_info(&p->vx_info); @@ -457,7 +467,8 @@ int vx_migrate_task(struct task_struct *p, struct vx_info *vxi) vx_mask_bcaps(p); task_unlock(p); - put_vx_info(old_vxi); + /* obsoleted by clr/set */ + // put_vx_info(old_vxi); } out: put_vx_info(old_vxi); @@ -685,4 +696,5 @@ int vc_set_ccaps(uint32_t id, void __user *data) EXPORT_SYMBOL_GPL(rcu_free_vx_info); EXPORT_SYMBOL_GPL(vx_info_hash_lock); +EXPORT_SYMBOL_GPL(unhash_vx_info);