Skip to content

Commit

Permalink
Add option to mlock qemu and guest memory
Browse files Browse the repository at this point in the history
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: Satoru Moriya <[email protected]>
Reviewed-by: Paolo Bonzini <[email protected]>
Reviewed-by: Marcelo Tosatti <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
Message-id: [email protected]
Signed-off-by: Anthony Liguori <[email protected]>
  • Loading branch information
Satoru Moriya authored and Anthony Liguori committed Apr 22, 2013
1 parent 2b31677 commit 888a6bc
Show file tree
Hide file tree
Showing 5 changed files with 65 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 @@ -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)
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 @@ -106,4 +106,9 @@ static inline bool is_daemonized(void)
return false;
}

static inline int os_mlock(void)
{
return -ENOSYS;
}

#endif
12 changes: 12 additions & 0 deletions os-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
13 changes: 13 additions & 0 deletions qemu-options.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
34 changes: 34 additions & 0 deletions vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 */

Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 888a6bc

Please sign in to comment.