From: Daniil Tatianin <d-tatianin@yandex-team.ru>
This will be used in the following commits to make it possible to only
lock memory on fault instead of right away.
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
Link: https://lore.kernel.org/r/20250123131944.391886-2-d-tatianin@yandex-team.ru
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/system/os-posix.h | 2 +-
include/system/os-win32.h | 3 ++-
migration/postcopy-ram.c | 2 +-
os-posix.c | 10 ++++++++--
system/vl.c | 2 +-
5 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/include/system/os-posix.h b/include/system/os-posix.h
index b881ac6c6f..ce5b3bccf8 100644
--- a/include/system/os-posix.h
+++ b/include/system/os-posix.h
@@ -53,7 +53,7 @@ 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);
+int os_mlock(bool on_fault);
/**
* qemu_alloc_stack:
diff --git a/include/system/os-win32.h b/include/system/os-win32.h
index b82a5d3ad9..cd61d69e10 100644
--- a/include/system/os-win32.h
+++ b/include/system/os-win32.h
@@ -123,8 +123,9 @@ static inline bool is_daemonized(void)
return false;
}
-static inline int os_mlock(void)
+static inline int os_mlock(bool on_fault)
{
+ (void)on_fault;
return -ENOSYS;
}
diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
index 6a6da6ba7f..fc4d8a10df 100644
--- a/migration/postcopy-ram.c
+++ b/migration/postcopy-ram.c
@@ -652,7 +652,7 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
}
if (enable_mlock) {
- if (os_mlock() < 0) {
+ if (os_mlock(false) < 0) {
error_report("mlock: %s", strerror(errno));
/*
* It doesn't feel right to fail at this point, we have a valid
diff --git a/os-posix.c b/os-posix.c
index 9cce55ff2f..48afb2990d 100644
--- a/os-posix.c
+++ b/os-posix.c
@@ -327,18 +327,24 @@ void os_set_line_buffering(void)
setvbuf(stdout, NULL, _IOLBF, 0);
}
-int os_mlock(void)
+int os_mlock(bool on_fault)
{
#ifdef HAVE_MLOCKALL
int ret = 0;
+ int flags = MCL_CURRENT | MCL_FUTURE;
- ret = mlockall(MCL_CURRENT | MCL_FUTURE);
+ if (on_fault) {
+ flags |= MCL_ONFAULT;
+ }
+
+ ret = mlockall(flags);
if (ret < 0) {
error_report("mlockall: %s", strerror(errno));
}
return ret;
#else
+ (void)on_fault;
return -ENOSYS;
#endif
}
diff --git a/system/vl.c b/system/vl.c
index 9c6942c6cf..e94fc7ea35 100644
--- a/system/vl.c
+++ b/system/vl.c
@@ -797,7 +797,7 @@ static QemuOptsList qemu_run_with_opts = {
static void realtime_init(void)
{
if (enable_mlock) {
- if (os_mlock() < 0) {
+ if (os_mlock(false) < 0) {
error_report("locking memory failed");
exit(1);
}
--
2.47.0
On Tue, Feb 11, 2025 at 5:52 PM Peter Xu <peterx@redhat.com> wrote:
>
> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>
> This will be used in the following commits to make it possible to only
> lock memory on fault instead of right away.
Hi Peter and Daniil,
Please take a look at this CI failure:
https://gitlab.com/qemu-project/qemu/-/jobs/9117106042#L3603
Thanks,
Stefan
>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> Reviewed-by: Peter Xu <peterx@redhat.com>
> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
> Link: https://lore.kernel.org/r/20250123131944.391886-2-d-tatianin@yandex-team.ru
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> include/system/os-posix.h | 2 +-
> include/system/os-win32.h | 3 ++-
> migration/postcopy-ram.c | 2 +-
> os-posix.c | 10 ++++++++--
> system/vl.c | 2 +-
> 5 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/include/system/os-posix.h b/include/system/os-posix.h
> index b881ac6c6f..ce5b3bccf8 100644
> --- a/include/system/os-posix.h
> +++ b/include/system/os-posix.h
> @@ -53,7 +53,7 @@ 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);
> +int os_mlock(bool on_fault);
>
> /**
> * qemu_alloc_stack:
> diff --git a/include/system/os-win32.h b/include/system/os-win32.h
> index b82a5d3ad9..cd61d69e10 100644
> --- a/include/system/os-win32.h
> +++ b/include/system/os-win32.h
> @@ -123,8 +123,9 @@ static inline bool is_daemonized(void)
> return false;
> }
>
> -static inline int os_mlock(void)
> +static inline int os_mlock(bool on_fault)
> {
> + (void)on_fault;
> return -ENOSYS;
> }
>
> diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
> index 6a6da6ba7f..fc4d8a10df 100644
> --- a/migration/postcopy-ram.c
> +++ b/migration/postcopy-ram.c
> @@ -652,7 +652,7 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
> }
>
> if (enable_mlock) {
> - if (os_mlock() < 0) {
> + if (os_mlock(false) < 0) {
> error_report("mlock: %s", strerror(errno));
> /*
> * It doesn't feel right to fail at this point, we have a valid
> diff --git a/os-posix.c b/os-posix.c
> index 9cce55ff2f..48afb2990d 100644
> --- a/os-posix.c
> +++ b/os-posix.c
> @@ -327,18 +327,24 @@ void os_set_line_buffering(void)
> setvbuf(stdout, NULL, _IOLBF, 0);
> }
>
> -int os_mlock(void)
> +int os_mlock(bool on_fault)
> {
> #ifdef HAVE_MLOCKALL
> int ret = 0;
> + int flags = MCL_CURRENT | MCL_FUTURE;
>
> - ret = mlockall(MCL_CURRENT | MCL_FUTURE);
> + if (on_fault) {
> + flags |= MCL_ONFAULT;
> + }
> +
> + ret = mlockall(flags);
> if (ret < 0) {
> error_report("mlockall: %s", strerror(errno));
> }
>
> return ret;
> #else
> + (void)on_fault;
> return -ENOSYS;
> #endif
> }
> diff --git a/system/vl.c b/system/vl.c
> index 9c6942c6cf..e94fc7ea35 100644
> --- a/system/vl.c
> +++ b/system/vl.c
> @@ -797,7 +797,7 @@ static QemuOptsList qemu_run_with_opts = {
> static void realtime_init(void)
> {
> if (enable_mlock) {
> - if (os_mlock() < 0) {
> + if (os_mlock(false) < 0) {
> error_report("locking memory failed");
> exit(1);
> }
> --
> 2.47.0
>
>
On 2/12/25 5:13 PM, Stefan Hajnoczi wrote:
> On Tue, Feb 11, 2025 at 5:52 PM Peter Xu <peterx@redhat.com> wrote:
>> From: Daniil Tatianin <d-tatianin@yandex-team.ru>
>>
>> This will be used in the following commits to make it possible to only
>> lock memory on fault instead of right away.
> Hi Peter and Daniil,
> Please take a look at this CI failure:
> https://gitlab.com/qemu-project/qemu/-/jobs/9117106042#L3603
>
> Thanks,
> Stefan
Looks like MCL_ONFAULT is linux-only, I guess I'll have to have add
something similar to HAVE_MLOCKALL and put this under an ifdef.
Thank you
>> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>> Reviewed-by: Peter Xu <peterx@redhat.com>
>> Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
>> Link: https://lore.kernel.org/r/20250123131944.391886-2-d-tatianin@yandex-team.ru
>> Signed-off-by: Peter Xu <peterx@redhat.com>
>> ---
>> include/system/os-posix.h | 2 +-
>> include/system/os-win32.h | 3 ++-
>> migration/postcopy-ram.c | 2 +-
>> os-posix.c | 10 ++++++++--
>> system/vl.c | 2 +-
>> 5 files changed, 13 insertions(+), 6 deletions(-)
>>
>> diff --git a/include/system/os-posix.h b/include/system/os-posix.h
>> index b881ac6c6f..ce5b3bccf8 100644
>> --- a/include/system/os-posix.h
>> +++ b/include/system/os-posix.h
>> @@ -53,7 +53,7 @@ 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);
>> +int os_mlock(bool on_fault);
>>
>> /**
>> * qemu_alloc_stack:
>> diff --git a/include/system/os-win32.h b/include/system/os-win32.h
>> index b82a5d3ad9..cd61d69e10 100644
>> --- a/include/system/os-win32.h
>> +++ b/include/system/os-win32.h
>> @@ -123,8 +123,9 @@ static inline bool is_daemonized(void)
>> return false;
>> }
>>
>> -static inline int os_mlock(void)
>> +static inline int os_mlock(bool on_fault)
>> {
>> + (void)on_fault;
>> return -ENOSYS;
>> }
>>
>> diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
>> index 6a6da6ba7f..fc4d8a10df 100644
>> --- a/migration/postcopy-ram.c
>> +++ b/migration/postcopy-ram.c
>> @@ -652,7 +652,7 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
>> }
>>
>> if (enable_mlock) {
>> - if (os_mlock() < 0) {
>> + if (os_mlock(false) < 0) {
>> error_report("mlock: %s", strerror(errno));
>> /*
>> * It doesn't feel right to fail at this point, we have a valid
>> diff --git a/os-posix.c b/os-posix.c
>> index 9cce55ff2f..48afb2990d 100644
>> --- a/os-posix.c
>> +++ b/os-posix.c
>> @@ -327,18 +327,24 @@ void os_set_line_buffering(void)
>> setvbuf(stdout, NULL, _IOLBF, 0);
>> }
>>
>> -int os_mlock(void)
>> +int os_mlock(bool on_fault)
>> {
>> #ifdef HAVE_MLOCKALL
>> int ret = 0;
>> + int flags = MCL_CURRENT | MCL_FUTURE;
>>
>> - ret = mlockall(MCL_CURRENT | MCL_FUTURE);
>> + if (on_fault) {
>> + flags |= MCL_ONFAULT;
>> + }
>> +
>> + ret = mlockall(flags);
>> if (ret < 0) {
>> error_report("mlockall: %s", strerror(errno));
>> }
>>
>> return ret;
>> #else
>> + (void)on_fault;
>> return -ENOSYS;
>> #endif
>> }
>> diff --git a/system/vl.c b/system/vl.c
>> index 9c6942c6cf..e94fc7ea35 100644
>> --- a/system/vl.c
>> +++ b/system/vl.c
>> @@ -797,7 +797,7 @@ static QemuOptsList qemu_run_with_opts = {
>> static void realtime_init(void)
>> {
>> if (enable_mlock) {
>> - if (os_mlock() < 0) {
>> + if (os_mlock(false) < 0) {
>> error_report("locking memory failed");
>> exit(1);
>> }
>> --
>> 2.47.0
>>
>>
© 2016 - 2026 Red Hat, Inc.