2 * linux/kernel/vserver/limit.c
4 * Virtual Server: Context Limits
6 * Copyright (C) 2004 Herbert Pƶtzl
8 * V0.01 broken out from vcontext V0.05
12 #include <linux/config.h>
13 #include <linux/vserver/limit.h>
14 #include <linux/vserver/context.h>
15 #include <linux/vserver/switch.h>
16 #include <linux/vinline.h>
18 #include <asm/errno.h>
19 #include <asm/uaccess.h>
22 static int is_valid_rlimit(int id)
38 static inline uint64_t vc_get_rlim(struct vx_info *vxi, int id)
42 limit = vxi->limit.rlim[id];
43 if (limit == RLIM_INFINITY)
44 return CRLIM_INFINITY;
48 int vc_get_rlimit(uint32_t id, void __user *data)
51 struct vcmd_ctx_rlimit_v0 vc_data;
53 if (copy_from_user (&vc_data, data, sizeof(vc_data)))
55 if (!is_valid_rlimit(vc_data.id))
58 vxi = locate_vx_info(id);
62 vc_data.maximum = vc_get_rlim(vxi, vc_data.id);
63 vc_data.minimum = CRLIM_UNSET;
64 vc_data.softlimit = CRLIM_UNSET;
67 if (copy_to_user (data, &vc_data, sizeof(vc_data)))
72 int vc_set_rlimit(uint32_t id, void __user *data)
75 struct vcmd_ctx_rlimit_v0 vc_data;
77 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE))
79 if (copy_from_user (&vc_data, data, sizeof(vc_data)))
81 if (!is_valid_rlimit(vc_data.id))
84 vxi = locate_vx_info(id);
88 if (vc_data.maximum != CRLIM_KEEP)
89 vxi->limit.rlim[vc_data.id] = vc_data.maximum;
90 printk("setting [%d] = %d\n", vc_data.id, (int)vc_data.maximum);
96 int vc_get_rlimit_mask(uint32_t id, void __user *data)
98 static struct vcmd_ctx_rlimit_mask_v0 mask = {
104 (1 << RLIMIT_NPROC) |
105 (1 << RLIMIT_NOFILE) |
106 (1 << RLIMIT_MEMLOCK) |
111 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RESOURCE))
113 if (copy_to_user(data, &mask, sizeof(mask)))
119 void vx_vsi_meminfo(struct sysinfo *val)
121 struct vx_info *vxi = current->vx_info;
124 v = vxi->limit.rlim[RLIMIT_RSS];
125 if (v != RLIM_INFINITY)
126 val->totalram = min(val->totalram, v);
127 v = atomic_read(&vxi->limit.res[RLIMIT_RSS]);
128 val->freeram = (v < val->totalram) ? val->totalram - v : 0;
135 void vx_vsi_swapinfo(struct sysinfo *val)
137 struct vx_info *vxi = current->vx_info;
140 v = vxi->limit.rlim[RLIMIT_RSS];
141 w = vxi->limit.rlim[RLIMIT_AS];
142 if (w != RLIM_INFINITY)
143 val->totalswap = min(val->totalswap, w -
144 ((v != RLIM_INFINITY) ? v : 0));
145 w = atomic_read(&vxi->limit.res[RLIMIT_AS]);
146 val->freeswap = (w < val->totalswap) ? val->totalswap - w : 0;