2 * linux/kernel/vserver/limit.c
4 * Virtual Server: Context Limits
6 * Copyright (C) 2004-2005 Herbert Pƶtzl
8 * V0.01 broken out from vcontext V0.05
12 #include <linux/config.h>
13 #include <linux/module.h>
14 #include <linux/vs_context.h>
15 #include <linux/vs_limit.h>
16 #include <linux/vserver/limit.h>
17 #include <linux/vserver/switch.h>
18 #include <linux/vserver/limit_cmd.h>
20 #include <asm/errno.h>
21 #include <asm/uaccess.h>
24 const char *vlimit_name[NUM_LIMITS] = {
27 [RLIMIT_NPROC] = "NPROC",
28 [RLIMIT_NOFILE] = "NOFILE",
29 [RLIMIT_MEMLOCK] = "VML",
31 [RLIMIT_LOCKS] = "LOCKS",
32 [RLIMIT_SIGPENDING] = "SIGP",
33 [RLIMIT_MSGQUEUE] = "MSGQ",
35 [VLIMIT_NSOCK] = "NSOCK",
36 [VLIMIT_OPENFD] = "OPENFD",
37 [VLIMIT_ANON] = "ANON",
38 [VLIMIT_SHMEM] = "SHMEM",
41 EXPORT_SYMBOL_GPL(vlimit_name);
44 static int is_valid_rlimit(int id)
65 static inline uint64_t vc_get_rlim(struct vx_info *vxi, int id)
69 limit = vxi->limit.rlim[id];
70 if (limit == RLIM_INFINITY)
71 return CRLIM_INFINITY;
75 int vc_get_rlimit(uint32_t id, void __user *data)
78 struct vcmd_ctx_rlimit_v0 vc_data;
80 if (copy_from_user (&vc_data, data, sizeof(vc_data)))
82 if (!is_valid_rlimit(vc_data.id))
85 vxi = locate_vx_info(id);
89 vc_data.maximum = vc_get_rlim(vxi, vc_data.id);
90 vc_data.minimum = CRLIM_UNSET;
91 vc_data.softlimit = CRLIM_UNSET;
94 if (copy_to_user (data, &vc_data, sizeof(vc_data)))
99 int vc_set_rlimit(uint32_t id, void __user *data)
102 struct vcmd_ctx_rlimit_v0 vc_data;
104 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE))
106 if (copy_from_user (&vc_data, data, sizeof(vc_data)))
108 if (!is_valid_rlimit(vc_data.id))
111 vxi = locate_vx_info(id);
115 if (vc_data.maximum != CRLIM_KEEP)
116 vxi->limit.rlim[vc_data.id] = vc_data.maximum;
122 int vc_get_rlimit_mask(uint32_t id, void __user *data)
124 static struct vcmd_ctx_rlimit_mask_v0 mask = {
131 (1 << RLIMIT_NPROC) |
132 (1 << RLIMIT_NOFILE) |
133 (1 << RLIMIT_MEMLOCK) |
134 (1 << RLIMIT_LOCKS) |
140 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE))
142 if (copy_to_user(data, &mask, sizeof(mask)))
148 void vx_vsi_meminfo(struct sysinfo *val)
150 struct vx_info *vxi = current->vx_info;
153 v = vxi->limit.rlim[RLIMIT_RSS];
154 if (v != RLIM_INFINITY)
155 val->totalram = min(val->totalram, v);
156 v = atomic_read(&vxi->limit.rcur[RLIMIT_RSS]);
157 val->freeram = (v < val->totalram) ? val->totalram - v : 0;
164 void vx_vsi_swapinfo(struct sysinfo *val)
166 struct vx_info *vxi = current->vx_info;
169 v = vxi->limit.rlim[RLIMIT_RSS];
170 w = vxi->limit.rlim[RLIMIT_AS];
171 if (w != RLIM_INFINITY)
172 val->totalswap = min(val->totalswap, w -
173 ((v != RLIM_INFINITY) ? v : 0));
174 w = atomic_read(&vxi->limit.rcur[RLIMIT_AS]);
175 val->freeswap = (w < val->totalswap) ? val->totalswap - w : 0;