diff --git a/include/sysemu/os-posix.h b/include/sysemu/os-posix.h index 7f198e475c..25d0b2a73f 100644 --- a/include/sysemu/os-posix.h +++ b/include/sysemu/os-posix.h @@ -31,6 +31,7 @@ void os_set_proc_name(const char *s); void os_setup_signal_handling(void); void os_daemonize(void); void os_setup_post(void); +int os_mlock(void); typedef struct timeval qemu_timeval; #define qemu_gettimeofday(tp) gettimeofday(tp, NULL) diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h index 71f5fa0a91..bf8523ada1 100644 --- a/include/sysemu/os-win32.h +++ b/include/sysemu/os-win32.h @@ -106,4 +106,9 @@ static inline bool is_daemonized(void) return false; } +static inline int os_mlock(void) +{ + return -ENOSYS; +} + #endif diff --git a/os-posix.c b/os-posix.c index 5c64518902..d39261d849 100644 --- a/os-posix.c +++ b/os-posix.c @@ -363,3 +363,15 @@ bool is_daemonized(void) { return daemonize; } + +int os_mlock(void) +{ + int ret = 0; + + ret = mlockall(MCL_CURRENT | MCL_FUTURE); + if (ret < 0) { + perror("mlockall"); + } + + return ret; +} diff --git a/qemu-options.hx b/qemu-options.hx index 5c115d1cf9..e86cc2439d 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2583,6 +2583,19 @@ STEXI Do not start CPU at startup (you must type 'c' in the monitor). ETEXI +DEF("realtime", HAS_ARG, QEMU_OPTION_realtime, + "-realtime [mlock=on|off]\n" + " run qemu with realtime features\n" + " mlock=on|off controls mlock support (default: on)\n", + QEMU_ARCH_ALL) +STEXI +@item -realtime mlock=on|off +@findex -realtime +Run qemu with realtime features. +mlocking qemu and guest memory can be enabled via @option{mlock=on} +(enabled by default). +ETEXI + DEF("gdb", HAS_ARG, QEMU_OPTION_gdb, \ "-gdb dev wait for gdb connection on 'dev'\n", QEMU_ARCH_ALL) STEXI diff --git a/vl.c b/vl.c index 2ef00d893a..6caa5f4272 100644 --- a/vl.c +++ b/vl.c @@ -521,6 +521,18 @@ static QemuOptsList qemu_tpmdev_opts = { }, }; +static QemuOptsList qemu_realtime_opts = { + .name = "realtime", + .head = QTAILQ_HEAD_INITIALIZER(qemu_realtime_opts.head), + .desc = { + { + .name = "mlock", + .type = QEMU_OPT_BOOL, + }, + { /* end of list */ } + }, +}; + const char *qemu_get_vm_name(void) { return qemu_name; @@ -1420,6 +1432,20 @@ static void smp_parse(const char *optarg) max_cpus = smp_cpus; } +static void configure_realtime(QemuOpts *opts) +{ + bool enable_mlock; + + enable_mlock = qemu_opt_get_bool(opts, "mlock", true); + + if (enable_mlock) { + if (os_mlock() < 0) { + fprintf(stderr, "qemu: locking memory failed\n"); + exit(1); + } + } +} + /***********************************************************/ /* USB devices */ @@ -2862,6 +2888,7 @@ int main(int argc, char **argv, char **envp) qemu_add_opts(&qemu_add_fd_opts); qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_tpmdev_opts); + qemu_add_opts(&qemu_realtime_opts); runstate_init(); @@ -3835,6 +3862,13 @@ int main(int argc, char **argv, char **envp) exit(1); } break; + case QEMU_OPTION_realtime: + opts = qemu_opts_parse(qemu_find_opts("realtime"), optarg, 0); + if (!opts) { + exit(1); + } + configure_realtime(opts); + break; default: os_parse_cmd_args(popt->index, optarg); }