1 /* Copyright 2005 Princeton University
3 Redistribution and use in source and binary forms, with or without
4 modification, are permitted provided that the following conditions
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above
11 copyright notice, this list of conditions and the following
12 disclaimer in the documentation and/or other materials provided
13 with the distribution.
15 * Neither the name of the copyright holder nor the names of its
16 contributors may be used to endorse or promote products derived
17 from this software without specific prior written permission.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PRINCETON
23 UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
26 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
29 WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
43 #include <sys/ioctl.h>
44 #include <sys/types.h>
51 #include "vserver-internal.h"
52 #include "sched_cmd.h"
59 vserver_create(PyObject *self, PyObject *args)
63 if (!PyArg_ParseTuple(args, "I", &ctx))
66 xid = vc_ctx_create(ctx);
68 printf("vserver_create xid = %d\n",xid);
70 if (xid == VC_NOCTX && errno != EEXIST)
71 return PyErr_SetFromErrno(PyExc_OSError);
79 vserver_flags(PyObject *self, PyObject *args)
81 struct vc_ctx_caps caps;
82 struct vc_ctx_flags flags;
88 caps.ccaps = ~vc_get_insecureccaps();
90 caps.bcaps = ~vc_get_insecurebcaps();
93 flags.flagword = VC_VXF_STATE_SETUP| VC_VXF_INFO_LOCK;
94 flags.mask = VC_VXF_STATE_SETUP | VC_VXF_INFO_LOCK;
96 if (!PyArg_ParseTuple(args, "I", &ctx))
100 xid = vc_get_task_xid(0);
101 printf("vserver_flags xid = %d, ctx = %d\n",xid,ctx);
104 if (vc_set_ccaps(ctx, &caps) == -1)
105 return PyErr_SetFromErrno(PyExc_OSError);
108 xid = vc_get_task_xid(0);
109 printf("vserver_flags xid = %d, ctx = %d\n",xid,ctx);
112 if (vc_set_cflags(ctx, &flags) == -1)
113 return PyErr_SetFromErrno(PyExc_OSError);
116 xid = vc_get_task_xid(0);
117 printf("vserver_flags xid = %d, ctx = %d\n",xid,ctx);
128 vserver_enter(PyObject *self, PyObject *args)
131 if (!PyArg_ParseTuple(args, "I", &ctx))
134 xid = vc_get_task_xid(0);
136 printf("vserver_enter xid = %d\n",xid);
141 return PyErr_SetFromErrno(PyExc_OSError);
142 } else if (vc_ctx_migrate(ctx) == -1)
143 return PyErr_SetFromErrno(PyExc_OSError);
150 vserver_set_rlimit(PyObject *self, PyObject *args) {
151 struct vc_rlimit limits;
156 limits.min = VC_LIM_KEEP;
157 limits.soft = VC_LIM_KEEP;
158 limits.hard = VC_LIM_KEEP;
160 if (!PyArg_ParseTuple(args, "IiL", &xid, &resource, &limits.hard))
164 if (vc_set_rlimit(xid, resource, &limits))
165 ret = PyErr_SetFromErrno(PyExc_OSError);
166 else if (vc_get_rlimit(xid, resource, &limits)==-1)
167 ret = PyErr_SetFromErrno(PyExc_OSError);
169 ret = Py_BuildValue("L",limits.hard);
175 vserver_get_rlimit(PyObject *self, PyObject *args) {
176 struct vc_rlimit limits;
181 limits.min = VC_LIM_KEEP;
182 limits.soft = VC_LIM_KEEP;
183 limits.hard = VC_LIM_KEEP;
185 if (!PyArg_ParseTuple(args, "Ii", &xid, &resource))
189 if (vc_get_rlimit(xid, resource, &limits)==-1)
190 ret = PyErr_SetFromErrno(PyExc_OSError);
192 ret = Py_BuildValue("L",limits.hard);
201 vserver_setsched(PyObject *self, PyObject *args)
204 struct vc_set_sched sched;
205 struct vc_ctx_flags flags;
206 unsigned cpuguaranteed = 0;
208 sched.set_mask = (VC_VXSM_FILL_RATE |
213 if (!PyArg_ParseTuple(args, "I|I|I|I|I|I|I", &xid,
222 flags.flagword = VC_VXF_INFO_LOCK;
223 flags.mask = VC_VXF_INFO_LOCK;
224 flags.flagword |= VC_VXF_SCHED_HARD;
225 flags.mask |= VC_VXF_SCHED_HARD;
226 #define VC_VXF_SCHED_SHARE 0x00000800ull
227 if (cpuguaranteed==0) {
228 flags.flagword |= VC_VXF_SCHED_SHARE;
229 flags.mask |= VC_VXF_SCHED_SHARE;
232 if (vc_set_cflags(xid, &flags) == -1)
233 return PyErr_SetFromErrno(PyExc_OSError);
235 if (vc_set_sched(xid, &sched) == -1)
236 return PyErr_SetFromErrno(PyExc_OSError);
245 /* inode vserver commands */
246 #define VCMD_add_dlimit VC_CMD(DLIMIT, 1, 0)
247 #define VCMD_rem_dlimit VC_CMD(DLIMIT, 2, 0)
248 #define VCMD_set_dlimit VC_CMD(DLIMIT, 5, 0)
249 #define VCMD_get_dlimit VC_CMD(DLIMIT, 6, 0)
251 #define CDLIM_UNSET (0ULL)
252 #define CDLIM_INFINITY (~0ULL)
253 #define CDLIM_KEEP (~1ULL)
256 vserver_get_dlimit(PyObject *self, PyObject *args)
261 struct vcmd_ctx_dlimit_v0 data;
264 if (!PyArg_ParseTuple(args, "si", &path,&xid))
267 memset(&data, 0, sizeof(data));
270 r = vserver(VCMD_get_dlimit, xid, &data);
272 res = Py_BuildValue("(i,i,i,i,i)",
279 res = PyErr_SetFromErrno(PyExc_OSError);
287 vserver_set_dlimit(PyObject *self, PyObject *args)
291 struct vcmd_ctx_dlimit_base_v0 init;
292 struct vcmd_ctx_dlimit_v0 data;
295 memset(&data,0,sizeof(data));
296 if (!PyArg_ParseTuple(args, "siiiiii", &path,
308 memset(&init, 0, sizeof(init));
312 r = vserver(VCMD_rem_dlimit, xid, &init);
314 r = vserver(VCMD_add_dlimit, xid, &init);
316 r = vserver(VCMD_set_dlimit, xid, &data);
321 static PyMethodDef methods[] = {
322 { "create", vserver_create, METH_VARARGS,
323 "Create a new vserver context" },
324 { "flags", vserver_flags, METH_VARARGS,
325 "Set the default flags and caps" },
326 { "enter", vserver_enter, METH_VARARGS,
327 "Enter the vserver context" },
328 { "setsched", vserver_setsched, METH_VARARGS,
329 "Change vserver scheduling attributes for given vserver context" },
330 { "setdlimit", vserver_set_dlimit, METH_VARARGS,
331 "Set disk limits for given vserver context" },
332 { "getdlimit", vserver_get_dlimit, METH_VARARGS,
333 "Get disk limits for given vserver context" },
334 { "setrlimit", vserver_set_rlimit, METH_VARARGS,
335 "Set resource limits for given resource of a vserver context" },
336 { "getrlimit", vserver_get_rlimit, METH_VARARGS,
337 "Get resource limits for given resource of a vserver context" },
338 { NULL, NULL, 0, NULL }
342 initvserverimpl(void)
344 Py_InitModule("vserverimpl", methods);