Commit 888a6bc6 authored by Satoru Moriya's avatar Satoru Moriya Committed by Anthony Liguori

Add option to mlock qemu and guest memory

In certain scenario, latency induced by paging is significant and
memory locking is needed. Also, in the scenario with untrusted
guests, latency improvement due to mlock is desired.

This patch introduces a following new option to mlock guest and
qemu memory:

-realtime mlock=on|off
Signed-off-by: default avatarSatoru Moriya <satoru.moriya@hds.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-id: 1366382526-26146-1-git-send-email-pbonzini@redhat.com
Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parent 2b316774
......@@ -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)
......
......@@ -106,4 +106,9 @@ static inline bool is_daemonized(void)
return false;
}
static inline int os_mlock(void)
{
return -ENOSYS;
}
#endif
......@@ -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;
}
......@@ -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
......
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment