From d8db0f9690bea084b18d3c83bdde1234f86f9c21 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 22 Dec 2011 12:22:31 +0100 Subject: [PATCH] qemu: Support for overriding NOFILE limit This patch adds max_files option to qemu.conf which can be used to override system default limit on number of opened files that are allowed for qemu user. --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf | 9 ++++++--- src/qemu/qemu_conf.c | 4 ++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_process.c | 16 ++++++++++++++-- src/qemu/test_libvirtd_qemu.aug | 4 ++++ 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index ad34e42daa..078e9c41a7 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -50,6 +50,7 @@ module Libvirtd_qemu = | bool_entry "allow_disk_format_probing" | bool_entry "set_process_name" | int_entry "max_processes" + | int_entry "max_files" | str_entry "lock_manager" | int_entry "max_queued" | int_entry "keepalive_interval" diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index c3f264f4ec..4ec5e6c0ff 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -299,11 +299,14 @@ # 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. +# If max_processes is set to a positive integer, libvirt will use +# it to set the maximum number of processes that can be run by qemu +# user. This can be used to override default value set by host OS. +# The same applies to max_files which sets the limit on the maximum +# number of opened files. # # max_processes = 0 +# max_files = 0 # To enable 'Sanlock' project based locking of the file # content (to prevent two VMs writing to the same diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 3766119388..bc0a646b6c 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -443,6 +443,10 @@ int qemudLoadDriverConfig(struct qemud_driver *driver, CHECK_TYPE("max_processes", VIR_CONF_LONG); if (p) driver->maxProcesses = p->l; + p = virConfGetValue(conf, "max_files"); + CHECK_TYPE("max_files", VIR_CONF_LONG); + if (p) driver->maxFiles = p->l; + p = virConfGetValue (conf, "lock_manager"); CHECK_TYPE ("lock_manager", VIR_CONF_STRING); if (p && p->str) { diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 8161269fa7..f5a0f6065f 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -105,6 +105,7 @@ struct qemud_driver { unsigned int setProcessName : 1; int maxProcesses; + int maxFiles; int max_queued; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9123f4c85e..105b895f51 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2166,9 +2166,9 @@ qemuProcessPrepareChardevDevice(virDomainDefPtr def ATTRIBUTE_UNUSED, static int qemuProcessLimits(struct qemud_driver *driver) { - if (driver->maxProcesses > 0) { - struct rlimit rlim; + struct rlimit rlim; + if (driver->maxProcesses > 0) { rlim.rlim_cur = rlim.rlim_max = driver->maxProcesses; if (setrlimit(RLIMIT_NPROC, &rlim) < 0) { virReportSystemError(errno, @@ -2178,6 +2178,18 @@ qemuProcessLimits(struct qemud_driver *driver) } } + if (driver->maxFiles > 0) { + /* Max number of opened files is one greater than + * actual limit. See man setrlimit */ + rlim.rlim_cur = rlim.rlim_max = driver->maxFiles + 1; + if (setrlimit(RLIMIT_NOFILE, &rlim) < 0) { + virReportSystemError(errno, + _("cannot set max opened files to %d"), + driver->maxFiles); + return -1; + } + } + return 0; } diff --git a/src/qemu/test_libvirtd_qemu.aug b/src/qemu/test_libvirtd_qemu.aug index f7476ae5d5..f8419367a1 100644 --- a/src/qemu/test_libvirtd_qemu.aug +++ b/src/qemu/test_libvirtd_qemu.aug @@ -114,6 +114,8 @@ vnc_auto_unix_socket = 1 max_processes = 12345 +max_files = 67890 + lock_manager = \"fcntl\" keepalive_interval = 1 @@ -242,6 +244,8 @@ keepalive_count = 42 { "#empty" } { "max_processes" = "12345" } { "#empty" } +{ "max_files" = "67890" } +{ "#empty" } { "lock_manager" = "fcntl" } { "#empty" } { "keepalive_interval" = "1" } -- 2.39.5