os: add an ability to lock memory on_fault

This will be used in the following commits to make it possible to only
lock memory on fault instead of right away.

Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Link: https://lore.kernel.org/r/20250212143920.1269754-2-d-tatianin@yandex-team.ru
[peterx: fail os_mlock(on_fault=1) when not supported]
[peterx: use G_GNUC_UNUSED instead of "(void)on_fault", per Dan]
Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
Daniil Tatianin 2025-02-12 17:39:17 +03:00 committed by Peter Xu
parent 30943e496f
commit e76fadf93e
6 changed files with 23 additions and 6 deletions

View File

@ -53,7 +53,7 @@ bool os_set_runas(const char *user_id);
void os_set_chroot(const char *path); void os_set_chroot(const char *path);
void os_setup_limits(void); void os_setup_limits(void);
void os_setup_post(void); void os_setup_post(void);
int os_mlock(void); int os_mlock(bool on_fault);
/** /**
* qemu_alloc_stack: * qemu_alloc_stack:

View File

@ -123,7 +123,7 @@ static inline bool is_daemonized(void)
return false; return false;
} }
static inline int os_mlock(void) static inline int os_mlock(bool on_fault G_GNUC_UNUSED)
{ {
return -ENOSYS; return -ENOSYS;
} }

View File

@ -2885,6 +2885,12 @@ config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
return mlockall(MCL_FUTURE); return mlockall(MCL_FUTURE);
}''')) }'''))
config_host_data.set('HAVE_MLOCK_ONFAULT', cc.links(gnu_source_prefix + '''
#include <sys/mman.h>
int main(void) {
return mlockall(MCL_FUTURE | MCL_ONFAULT);
}'''))
have_l2tpv3 = false have_l2tpv3 = false
if get_option('l2tpv3').allowed() and have_system if get_option('l2tpv3').allowed() and have_system
have_l2tpv3 = cc.has_type('struct mmsghdr', have_l2tpv3 = cc.has_type('struct mmsghdr',

View File

@ -652,7 +652,7 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
} }
if (enable_mlock) { if (enable_mlock) {
if (os_mlock() < 0) { if (os_mlock(false) < 0) {
error_report("mlock: %s", strerror(errno)); error_report("mlock: %s", strerror(errno));
/* /*
* It doesn't feel right to fail at this point, we have a valid * It doesn't feel right to fail at this point, we have a valid

View File

@ -327,18 +327,29 @@ void os_set_line_buffering(void)
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);
} }
int os_mlock(void) int os_mlock(bool on_fault)
{ {
#ifdef HAVE_MLOCKALL #ifdef HAVE_MLOCKALL
int ret = 0; int ret = 0;
int flags = MCL_CURRENT | MCL_FUTURE;
ret = mlockall(MCL_CURRENT | MCL_FUTURE); if (on_fault) {
#ifdef HAVE_MLOCK_ONFAULT
flags |= MCL_ONFAULT;
#else
error_report("mlockall: on_fault not supported");
return -EINVAL;
#endif
}
ret = mlockall(flags);
if (ret < 0) { if (ret < 0) {
error_report("mlockall: %s", strerror(errno)); error_report("mlockall: %s", strerror(errno));
} }
return ret; return ret;
#else #else
(void)on_fault;
return -ENOSYS; return -ENOSYS;
#endif #endif
} }

View File

@ -797,7 +797,7 @@ static QemuOptsList qemu_run_with_opts = {
static void realtime_init(void) static void realtime_init(void)
{ {
if (enable_mlock) { if (enable_mlock) {
if (os_mlock() < 0) { if (os_mlock(false) < 0) {
error_report("locking memory failed"); error_report("locking memory failed");
exit(1); exit(1);
} }