*
* 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 <linux/config.h>
-#include <linux/vserver/limit.h>
-#include <linux/vserver/context.h>
-#include <linux/vserver/switch.h>
-#include <linux/vs_base.h>
+#include <linux/module.h>
#include <linux/vs_context.h>
#include <linux/vs_limit.h>
+#include <linux/vserver/limit.h>
+#include <linux/vserver/switch.h>
+#include <linux/vserver/limit_cmd.h>
#include <asm/errno.h>
#include <asm/uaccess.h>
+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;
}
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)
return -EFAULT;
if (!is_valid_rlimit(vc_data.id))
return -ENOTSUPP;
-
+
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;
, /* 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;
}
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];