]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Support for overriding NPROC limit
authorJiri Denemark <jdenemar@redhat.com>
Tue, 5 Apr 2011 12:17:28 +0000 (14:17 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 6 Apr 2011 10:08:59 +0000 (12:08 +0200)
This patch adds max_processes option to qemu.conf which can be used to
override system default limit on number of processes that are allowed to
be running for qemu user.

src/qemu/libvirtd_qemu.aug
src/qemu/qemu.conf
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_process.c
src/qemu/test_libvirtd_qemu.aug

index affd74e502e8f6c01db4f0dfa3884f3ac5b6a742..ac30b8e89990e6ad1694e43f72a5e5807dc9f3cf 100644 (file)
@@ -13,11 +13,13 @@ module Libvirtd_qemu =
 
    let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
    let bool_val = store /0|1/
+   let int_val = store /[0-9]+/
    let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
    let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
 
    let str_entry       (kw:string) = [ key kw . value_sep . str_val ]
    let bool_entry      (kw:string) = [ key kw . value_sep . bool_val ]
+   let int_entry       (kw:string) = [ key kw . value_sep . int_val ]
    let str_array_entry (kw:string) = [ key kw . value_sep . str_array_val ]
 
 
@@ -45,6 +47,7 @@ module Libvirtd_qemu =
                  | bool_entry "clear_emulator_capabilities"
                  | bool_entry "allow_disk_format_probing"
                  | bool_entry "set_process_name"
+                 | int_entry "max_processes"
 
    (* Each enty in the config is one of the following three ... *)
    let entry = vnc_entry
index 364f555363dfde14e770ddeee357261f805eb605..c70050e623d27150adc174161ec95e2f04fc5fc1 100644 (file)
 # its arguments) appear in process listings.
 #
 # set_process_name = 1
+
+
+# If max_processes is set to a positive integer, libvirt will use it to set
+# maximum number of processes that can be run by qemu user. This can be used to
+# override default value set by host OS.
+#
+# max_processes = 0
index 9ba60b10b938537bbdc747ac72237b58e55826f1..bb5421b8612a1c63a398828936beabbab906b4e8 100644 (file)
@@ -424,6 +424,10 @@ int qemudLoadDriverConfig(struct qemud_driver *driver,
     CHECK_TYPE ("set_process_name", VIR_CONF_LONG);
     if (p) driver->setProcessName = p->l;
 
+    p = virConfGetValue(conf, "max_processes");
+    CHECK_TYPE("max_processes", VIR_CONF_LONG);
+    if (p) driver->maxProcesses = p->l;
+
     virConfFree (conf);
     return 0;
 }
index 7c6fde79c92996727605d36cd11fc12f6b2c7730..94918f6e214a36367eba6e86800c437a18f93c7e 100644 (file)
@@ -105,6 +105,8 @@ struct qemud_driver {
     unsigned int allowDiskFormatProbing : 1;
     unsigned int setProcessName : 1;
 
+    int maxProcesses;
+
     virCapsPtr caps;
 
     /* An array of callbacks */
index 48ecd5c3c6b0a85e5f1f07e8a6fd41d610518f6d..9ada24d6dbfa65f600390ad8bf14aa38069996d9 100644 (file)
@@ -25,6 +25,8 @@
 #include <unistd.h>
 #include <signal.h>
 #include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 #include "qemu_process.h"
 #include "qemu_domain.h"
@@ -1811,6 +1813,25 @@ qemuProcessPrepareChardevDevice(virDomainDefPtr def ATTRIBUTE_UNUSED,
 }
 
 
+static int
+qemuProcessLimits(struct qemud_driver *driver)
+{
+    if (driver->maxProcesses > 0) {
+        struct rlimit rlim;
+
+        rlim.rlim_cur = rlim.rlim_max = driver->maxProcesses;
+        if (setrlimit(RLIMIT_NPROC, &rlim) < 0) {
+            virReportSystemError(errno,
+                                 _("cannot limit number of processes to %d"),
+                                 driver->maxProcesses);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
 struct qemuProcessHookData {
     virConnectPtr conn;
     virDomainObjPtr vm;
@@ -1821,6 +1842,9 @@ static int qemuProcessHook(void *data)
 {
     struct qemuProcessHookData *h = data;
 
+    if (qemuProcessLimits(h->driver) < 0)
+        return -1;
+
     /* This must take place before exec(), so that all QEMU
      * memory allocation is on the correct NUMA node
      */
index 8e477f5928d36b90d11bd3ed02671a9496fe23bc..917bd4f3033149506b626eb44b200cdb42bfb8b2 100644 (file)
@@ -111,6 +111,8 @@ clear_emulator_capabilities = 0
 allow_disk_format_probing = 1
 
 vnc_auto_unix_socket = 1
+
+max_processes = 12345
 "
 
    test Libvirtd_qemu.lns get conf =
@@ -232,3 +234,5 @@ vnc_auto_unix_socket = 1
 { "allow_disk_format_probing" = "1" }
 { "#empty" }
 { "vnc_auto_unix_socket" = "1" }
+{ "#empty" }
+{ "max_processes" = "12345" }