X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Flimit.c;h=0527afc672b4c90d6d27f6e4b733d20855c622cc;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=5bd2fdcb917d78dedf5f550ef12f8fd6e806d69c;hpb=b76fcd5f0c655b6e3e9bf534594357025421c66a;p=linux-2.6.git diff --git a/kernel/vserver/limit.c b/kernel/vserver/limit.c index 5bd2fdcb9..0527afc67 100644 --- a/kernel/vserver/limit.c +++ b/kernel/vserver/limit.c @@ -3,32 +3,59 @@ * * Virtual Server: Context Limits * - * Copyright (C) 2004 Herbert Pötzl + * Copyright (C) 2004-2005 Herbert Pötzl * * V0.01 broken out from vcontext V0.05 * */ #include +#include +#include +#include #include -#include #include -#include +#include #include #include +const char *vlimit_name[NUM_LIMITS] = { + [RLIMIT_CPU] = "CPU", + [RLIMIT_RSS] = "RSS", + [RLIMIT_NPROC] = "NPROC", + [RLIMIT_NOFILE] = "NOFILE", + [RLIMIT_MEMLOCK] = "VML", + [RLIMIT_AS] = "VM", + [RLIMIT_LOCKS] = "LOCKS", + [RLIMIT_SIGPENDING] = "SIGP", + [RLIMIT_MSGQUEUE] = "MSGQ", + + [VLIMIT_NSOCK] = "NSOCK", + [VLIMIT_OPENFD] = "OPENFD", + [VLIMIT_ANON] = "ANON", + [VLIMIT_SHMEM] = "SHMEM", +}; + +EXPORT_SYMBOL_GPL(vlimit_name); + + static int is_valid_rlimit(int id) { int valid = 0; switch (id) { - case RLIMIT_NPROC: - case RLIMIT_AS: case RLIMIT_RSS: - case RLIMIT_MEMLOCK: + case RLIMIT_NPROC: case RLIMIT_NOFILE: + case RLIMIT_MEMLOCK: + case RLIMIT_AS: + + case VLIMIT_NSOCK: + case VLIMIT_OPENFD: + case VLIMIT_ANON: + case VLIMIT_SHMEM: valid = 1; break; } @@ -42,7 +69,7 @@ static inline uint64_t vc_get_rlim(struct vx_info *vxi, int id) limit = vxi->limit.rlim[id]; if (limit == RLIM_INFINITY) return CRLIM_INFINITY; - return limit; + return limit; } int vc_get_rlimit(uint32_t id, void __user *data) @@ -54,8 +81,8 @@ int vc_get_rlimit(uint32_t id, void __user *data) return -EFAULT; if (!is_valid_rlimit(vc_data.id)) return -ENOTSUPP; - - vxi = find_vx_info(id); + + vxi = locate_vx_info(id); if (!vxi) return -ESRCH; @@ -81,13 +108,12 @@ int vc_set_rlimit(uint32_t id, void __user *data) if (!is_valid_rlimit(vc_data.id)) return -ENOTSUPP; - vxi = find_vx_info(id); + vxi = locate_vx_info(id); if (!vxi) return -ESRCH; if (vc_data.maximum != CRLIM_KEEP) vxi->limit.rlim[vc_data.id] = vc_data.maximum; - printk("setting [%d] = %d\n", vc_data.id, (int)vc_data.maximum); put_vx_info(vxi); return 0; @@ -101,17 +127,20 @@ int vc_get_rlimit_mask(uint32_t id, void __user *data) , /* softlimit */ 0 , /* maximum */ + (1 << RLIMIT_RSS) | (1 << RLIMIT_NPROC) | (1 << RLIMIT_NOFILE) | (1 << RLIMIT_MEMLOCK) | + (1 << RLIMIT_LOCKS) | (1 << RLIMIT_AS) | - (1 << RLIMIT_RSS) + (1 << VLIMIT_ANON) | + 0 }; if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE)) return -EPERM; if (copy_to_user(data, &mask, sizeof(mask))) - return -EFAULT; + return -EFAULT; return 0; } @@ -124,25 +153,25 @@ void vx_vsi_meminfo(struct sysinfo *val) v = vxi->limit.rlim[RLIMIT_RSS]; if (v != RLIM_INFINITY) val->totalram = min(val->totalram, v); - v = atomic_read(&vxi->limit.res[RLIMIT_RSS]); + v = atomic_read(&vxi->limit.rcur[RLIMIT_RSS]); val->freeram = (v < val->totalram) ? val->totalram - v : 0; val->bufferram = 0; - val->totalhigh = 0; - val->freehigh = 0; + val->totalhigh = 0; + val->freehigh = 0; return; } void vx_vsi_swapinfo(struct sysinfo *val) { struct vx_info *vxi = current->vx_info; - unsigned long w,v; + unsigned long v, w; v = vxi->limit.rlim[RLIMIT_RSS]; w = vxi->limit.rlim[RLIMIT_AS]; if (w != RLIM_INFINITY) val->totalswap = min(val->totalswap, w - ((v != RLIM_INFINITY) ? v : 0)); - w = atomic_read(&vxi->limit.res[RLIMIT_AS]); + w = atomic_read(&vxi->limit.rcur[RLIMIT_AS]); val->freeswap = (w < val->totalswap) ? val->totalswap - w : 0; return; }