Skip to content

Commit

Permalink
qemu_init: increase NOFILE soft limit on POSIX
Browse files Browse the repository at this point in the history
In many configurations, e.g. multiple vNICs with multiple queues or
with many Ceph OSDs, the default soft limit of 1024 is not enough.
QEMU is supposed to work fine with file descriptors >= 1024 and does
not use select() on POSIX. Bump the soft limit to the allowed hard
limit to avoid issues with the aforementioned configurations.

Of course the limit could be raised from the outside, but the man page
of systemd.exec states about 'LimitNOFILE=':

> Don't use.
> [...]
> Typically applications should increase their soft limit to the hard
> limit on their own, if they are OK with working with file
> descriptors above 1023,

If the soft limit is already the same as the hard limit, avoid the
superfluous setrlimit call. This can avoid a warning with a strict
seccomp filter blocking setrlimit if NOFILE was already raised before
executing QEMU.

Buglink: https://bugzilla.proxmox.com/show_bug.cgi?id=4507
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
  • Loading branch information
foxmox authored and berrange committed Feb 9, 2024
1 parent 52ed9f4 commit 03e471c
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/sysemu/os-posix.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ bool is_daemonized(void);
void os_daemonize(void);
bool os_set_runas(const char *user_id);
void os_set_chroot(const char *path);
void os_setup_limits(void);
void os_setup_post(void);
int os_mlock(void);

Expand Down
5 changes: 5 additions & 0 deletions include/sysemu/os-win32.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ static inline int os_mlock(void)
return -ENOSYS;
}

static inline void os_setup_limits(void)
{
return;
}

#define fsync _commit

#if !defined(lseek)
Expand Down
22 changes: 22 additions & 0 deletions os-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
*/

#include "qemu/osdep.h"
#include <sys/resource.h>
#include <sys/wait.h>
#include <pwd.h>
#include <grp.h>
Expand Down Expand Up @@ -256,6 +257,27 @@ void os_daemonize(void)
}
}

void os_setup_limits(void)
{
struct rlimit nofile;

if (getrlimit(RLIMIT_NOFILE, &nofile) < 0) {
warn_report("unable to query NOFILE limit: %s", strerror(errno));
return;
}

if (nofile.rlim_cur == nofile.rlim_max) {
return;
}

nofile.rlim_cur = nofile.rlim_max;

if (setrlimit(RLIMIT_NOFILE, &nofile) < 0) {
warn_report("unable to set NOFILE limit: %s", strerror(errno));
return;
}
}

void os_setup_post(void)
{
int fd = 0;
Expand Down
2 changes: 2 additions & 0 deletions system/vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2778,6 +2778,8 @@ void qemu_init(int argc, char **argv)
error_init(argv[0]);
qemu_init_exec_dir(argv[0]);

os_setup_limits();

qemu_init_arch_modules();

qemu_init_subsystems();
Expand Down

0 comments on commit 03e471c

Please sign in to comment.