diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/fs/fcntl.c linux-2.6.11-rc2-vs1.9.4-rc3/fs/fcntl.c --- linux-2.6.11-rc2-vs1.9.4-rc2/fs/fcntl.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/fs/fcntl.c 2005-01-23 12:24:15 +0100 @@ -111,7 +111,7 @@ static int dupfd(struct file *file, unsi FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); spin_unlock(&files->file_lock); - // vx_openfd_inc(fd); + vx_openfd_inc(fd); fd_install(fd, file); } else { spin_unlock(&files->file_lock); @@ -159,10 +159,12 @@ asmlinkage long sys_dup2(unsigned int ol FD_SET(newfd, files->open_fds); FD_CLR(newfd, files->close_on_exec); spin_unlock(&files->file_lock); - // vx_openfd_inc(newfd); if (tofree) filp_close(tofree, files); + else + vx_openfd_inc(newfd); /* fd was unused */ + err = newfd; out: return err; diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/fs/open.c linux-2.6.11-rc2-vs1.9.4-rc3/fs/open.c --- linux-2.6.11-rc2-vs1.9.4-rc2/fs/open.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/fs/open.c 2005-01-22 18:36:24 +0100 @@ -878,7 +878,7 @@ repeat: FD_SET(fd, files->open_fds); FD_CLR(fd, files->close_on_exec); files->next_fd = fd + 1; - // vx_openfd_inc(fd); + vx_openfd_inc(fd); #if 1 /* Sanity check */ if (files->fd[fd] != NULL) { @@ -900,7 +900,7 @@ static inline void __put_unused_fd(struc __FD_CLR(fd, files->open_fds); if (fd < files->next_fd) files->next_fd = fd; - // vx_openfd_dec(fd); + vx_openfd_dec(fd); } void fastcall put_unused_fd(unsigned int fd) diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vs_context.h linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vs_context.h --- linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vs_context.h 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vs_context.h 2005-01-23 12:42:41 +0100 @@ -71,6 +71,7 @@ static inline void __clr_vx_info(struct { struct vx_info *vxo; + // might_sleep(); vxo = xchg(vxp, NULL); if (!vxo) return; diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vs_limit.h linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vs_limit.h --- linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vs_limit.h 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vs_limit.h 2005-01-22 19:32:35 +0100 @@ -14,7 +14,8 @@ static inline void __vx_acc_cres(struct { if (VXD_RLIMIT(res, RLIMIT_NOFILE) || VXD_RLIMIT(res, RLIMIT_NPROC) || - VXD_RLIMIT(res, VLIMIT_NSOCK)) + VXD_RLIMIT(res, VLIMIT_NSOCK) || + VXD_RLIMIT(res, VLIMIT_OPENFD)) vxlprintk(1, "vx_acc_cres[%5d,%s,%2d]: %5d%s (%p)", (vxi?vxi->vx_id:-1), vlimit_name[res], res, (vxi?atomic_read(&vxi->limit.rcur[res]):0), @@ -46,6 +47,12 @@ static inline void __vx_acc_cres(struct #define vx_files_dec(f) \ vx_acc_cres_cond((f)->f_xid,-1, (f), RLIMIT_NOFILE) +#define vx_openfd_inc(f) \ + vx_acc_cres(current->vx_info, 1, (void *)(f), VLIMIT_OPENFD) + +#define vx_openfd_dec(f) \ + vx_acc_cres(current->vx_info,-1, (void *)(f), VLIMIT_OPENFD) + #define vx_cres_avail(v,n,r) \ __vx_cres_avail((v), (r), (n), __FILE__, __LINE__) @@ -57,7 +64,8 @@ static inline int __vx_cres_avail(struct if (VXD_RLIMIT(res, RLIMIT_NOFILE) || VXD_RLIMIT(res, RLIMIT_NPROC) || - VXD_RLIMIT(res, VLIMIT_NSOCK)) + VXD_RLIMIT(res, VLIMIT_NSOCK) || + VXD_RLIMIT(res, VLIMIT_OPENFD)) vxlprintk(1, "vx_cres_avail[%5d,%s,%2d]: %5ld > %5d + %5d", (vxi?vxi->vx_id:-1), vlimit_name[res], res, (vxi?vxi->limit.rlim[res]:1), @@ -82,6 +90,9 @@ static inline int __vx_cres_avail(struct #define vx_files_avail(n) \ vx_cres_avail(current->vx_info, (n), RLIMIT_NOFILE) +#define vx_openfd_avail(n) \ + vx_cres_avail(current->vx_info, (n), VLIMIT_OPENFD) + /* socket limits */ diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vserver/limit.h linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vserver/limit.h --- linux-2.6.11-rc2-vs1.9.4-rc2/include/linux/vserver/limit.h 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/include/linux/vserver/limit.h 2005-01-22 21:13:50 +0100 @@ -13,6 +13,7 @@ void vx_vsi_swapinfo(struct sysinfo *); #define NUM_LIMITS 20 #define VLIMIT_NSOCK 16 +#define VLIMIT_OPENFD 17 extern const char *vlimit_name[NUM_LIMITS]; diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/kernel/exit.c linux-2.6.11-rc2-vs1.9.4-rc3/kernel/exit.c --- linux-2.6.11-rc2-vs1.9.4-rc2/kernel/exit.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/kernel/exit.c 2005-01-22 18:36:24 +0100 @@ -379,7 +379,7 @@ static inline void close_files(struct fi struct file * file = xchg(&files->fd[i], NULL); if (file) filp_close(file, files); - // vx_openfd_dec(i); + vx_openfd_dec(i); } i++; set >>= 1; diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/kernel/fork.c linux-2.6.11-rc2-vs1.9.4-rc3/kernel/fork.c --- linux-2.6.11-rc2-vs1.9.4-rc2/kernel/fork.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/kernel/fork.c 2005-01-23 14:36:50 +0100 @@ -637,6 +637,8 @@ static int copy_files(unsigned long clon struct file *f = *old_fds++; if (f) { get_file(f); + /* FIXME sum it first for avail check and performance */ + vx_openfd_inc(open_files - i); } else { /* * The fd may be claimed in the fd bitmap but not yet diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/context.c linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/context.c --- linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/context.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/context.c 2005-01-23 14:37:56 +0100 @@ -135,7 +135,7 @@ void __shutdown_vx_info(struct vx_info * struct namespace *namespace; struct fs_struct *fs; - might_sleep(); + // might_sleep(); namespace = xchg(&vxi->vx_namespace, NULL); if (namespace) @@ -455,27 +455,7 @@ void vx_mask_bcaps(struct task_struct *p #include -static inline int vx_nofiles_task(struct task_struct *tsk) -{ - struct files_struct *files = tsk->files; - unsigned long *obptr; - int count, total; - - spin_lock(&files->file_lock); - obptr = files->open_fds->fds_bits; - count = files->max_fds / (sizeof(unsigned long) * 8); - for (total = 0; count > 0; count--) { - if (*obptr) - total += hweight_long(*obptr); - obptr++; - } - spin_unlock(&files->file_lock); - return total; -} - -#if 0 - -static inline int vx_openfd_task(struct task_struct *tsk) +static int vx_openfd_task(struct task_struct *tsk) { struct files_struct *files = tsk->files; const unsigned long *bptr; @@ -493,8 +473,6 @@ static inline int vx_openfd_task(struct return total; } -#endif - /* * migrate task to new context * gets vxi, puts old_vxi on change @@ -517,26 +495,23 @@ int vx_migrate_task(struct task_struct * vxi->vx_id, atomic_read(&vxi->vx_usecnt)); if (!(ret = vx_migrate_user(p, vxi))) { - int nofiles; + int openfd; task_lock(p); - // openfd = vx_openfd_task(p); - nofiles = vx_nofiles_task(p); + openfd = vx_openfd_task(p); if (old_vxi) { atomic_dec(&old_vxi->cvirt.nr_threads); atomic_dec(&old_vxi->cvirt.nr_running); atomic_dec(&old_vxi->limit.rcur[RLIMIT_NPROC]); /* FIXME: what about the struct files here? */ - // atomic_sub(nofiles, &old_vxi->limit.rcur[RLIMIT_NOFILE]); - // atomic_sub(openfd, &old_vxi->limit.rcur[RLIMIT_OPENFD]); + atomic_sub(openfd, &old_vxi->limit.rcur[VLIMIT_OPENFD]); } atomic_inc(&vxi->cvirt.nr_threads); atomic_inc(&vxi->cvirt.nr_running); atomic_inc(&vxi->limit.rcur[RLIMIT_NPROC]); /* FIXME: what about the struct files here? */ - // atomic_add(nofiles, &vxi->limit.rcur[RLIMIT_NOFILE]); - // atomic_add(openfd, &vxi->limit.rcur[RLIMIT_OPENFD]); + atomic_add(openfd, &vxi->limit.rcur[VLIMIT_OPENFD]); vxdprintk(VXD_CBIT(xid, 5), "moved task %p into vxi:%p[#%d]", diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/limit.c linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/limit.c --- linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/limit.c 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/limit.c 2005-01-22 18:36:24 +0100 @@ -26,6 +26,7 @@ const char *vlimit_name[NUM_LIMITS] = { [RLIMIT_RSS] = "RSS", [RLIMIT_NPROC] = "NPROC", [RLIMIT_NOFILE] = "NOFILE", + [VLIMIT_OPENFD] = "OPENFD", [RLIMIT_MEMLOCK] = "VML", [RLIMIT_AS] = "VM", [RLIMIT_LOCKS] = "LOCKS", diff -NurpP --minimal linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/limit_proc.h linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/limit_proc.h --- linux-2.6.11-rc2-vs1.9.4-rc2/kernel/vserver/limit_proc.h 2005-01-23 12:15:14 +0100 +++ linux-2.6.11-rc2-vs1.9.4-rc3/kernel/vserver/limit_proc.h 2005-01-22 18:36:24 +0100 @@ -34,12 +34,14 @@ static inline int vx_info_proc_limit(str "RSS" VX_LIMIT_FMT "FILES" VX_LIMIT_FMT "SOCK" VX_LIMIT_FMT + "OFD" VX_LIMIT_FMT VX_LIMIT_ARG(RLIMIT_NPROC) VX_LIMIT_ARG(RLIMIT_AS) VX_LIMIT_ARG(RLIMIT_MEMLOCK) VX_LIMIT_ARG(RLIMIT_RSS) VX_LIMIT_ARG(RLIMIT_NOFILE) VX_LIMIT_ARG(VLIMIT_NSOCK) + VX_LIMIT_ARG(VLIMIT_OPENFD) ); }