From patchwork Tue Mar 26 15:05:39 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Satoru Moriya X-Patchwork-Id: 231252 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 676972C0091 for ; Wed, 27 Mar 2013 02:06:26 +1100 (EST) Received: from localhost ([::1]:49403 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKVSB-0005Er-3k for incoming@patchwork.ozlabs.org; Tue, 26 Mar 2013 11:06:23 -0400 Received: from eggs.gnu.org ([208.118.235.92]:55853) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKVRs-0005Ed-Vq for qemu-devel@nongnu.org; Tue, 26 Mar 2013 11:06:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UKVRn-0006kb-W0 for qemu-devel@nongnu.org; Tue, 26 Mar 2013 11:06:04 -0400 Received: from usindpps05.hds.com ([207.126.252.18]:41390) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKVRn-0006kC-Kr for qemu-devel@nongnu.org; Tue, 26 Mar 2013 11:05:59 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hds.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=mail1; bh=rrL3o+OSSW/vwut6VZhN1EsNS+wRDYE/WSks/sov4JI=; b=Zu9M9sJ5zXmmDWXrgq15wpG2DLjKY3SApWXbrWzitXTub3A4JqTgtLK4AeX1myNBBbN2 nd/L8aDXKx0KZdW9qSWdfgK5Za25omc4FTuM2mDSIFnVGCQYpzj14xdMkLNpGhNvzCMH Da4YlfC+B5wEC06Dz9zj1YuKCJTTH4FdBqBvcDNcXEC1uD832ZTpyTVGrVxN3aSu9P9b rnuqMx/PdH/7mFE6n/pvFD458CCmRxmx3b61QM/rA9d0WXbX1l+LW3Pl9c3+i0zmjrwv ykuay3jJmM37c6N48yDnFSjqsko+8fyou+sgy/BCR3GzfT8ikRrIEqry67eMU3Cyyjfr fg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=hdsstg.com; h=from : to : cc : subject : date : message-id : content-type : content-transfer-encoding : mime-version; s=mail1; bh=rrL3o+OSSW/vwut6VZhN1EsNS+wRDYE/WSks/sov4JI=; b=klerJMbOGT8Q29Bq0KTXVlg+TN8KqXdN412c7F1ZC1shViCh/yK5vw0T8RyFaqFRyq7W MPxfR+ZCA+HRCy0Kk8LxszMMS3THc83QEDhp+DcPpToNNLarchU0bC8JsLrehjIx75yf 3+/HzHhBIltYsyYDNCPQhMuLJE0uz50XM+HmxbuJoWCYvePiYDk5vm6oKfhMHPRVOLar DOLfx8z+gIYHu+zD4NMz921d/e44VTqerb1DeSk3W4PJRJPT9C90mHXL/MjRa3ei/8By 1bjmZgQTuQHZZP8hSsxZx3CvTeId3facejpfAnQ5VyCNZMVp5LKR9Bu5rM71sJhVgdqW Xw== Received: from usindmail01.hds.com (usindmail03 [207.126.252.22]) by usindpps05.hds.com (8.14.4/8.14.4) with ESMTP id r2QF5hES022991; Tue, 26 Mar 2013 11:05:43 -0400 Received: from USINDEHT102.corp.hds.com (usindnetf5d-vlan47float.corp.hds.com [10.74.73.11]) by usindmail01.hds.com (8.14.1/8.14.1) with ESMTP id r2QF5eD2032686; Tue, 26 Mar 2013 11:05:41 -0400 (EDT) Received: from USINDEM103.corp.hds.com ([fe80::3ccb:1c2:3efb:4f2c]) by USINDEHT102.corp.hds.com ([fe80::e15c:8ff4:b462:8142%12]) with mapi id 14.03.0123.003; Tue, 26 Mar 2013 11:05:39 -0400 From: Satoru Moriya To: "qemu-devel@nongnu.org" Thread-Topic: [PATCH v4] Add option to mlock qemu and guest memory Thread-Index: Ac4qM2BHsopYZy1KQ3WzkEnnqZWUuQ== Date: Tue, 26 Mar 2013 15:05:39 +0000 Message-ID: <8631DC5930FA9E468F04F3FD3A5D00721AFE9AE6@USINDEM103.corp.hds.com> Accept-Language: ja-JP, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.74.73.11] MIME-Version: 1.0 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 mx ip4:207.126.244.0/26 ip4:207.126.252.0/25 include:mktomail.com ~all X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.10.8626, 1.0.431, 0.0.0000 definitions=2013-03-26_04:2013-03-26, 2013-03-26, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_policy_notspam policy=outbound_policy score=0 spamscore=0 ipscore=0 suspectscore=1 phishscore=0 bulkscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=6.0.2-1211240000 definitions=main-1303260127 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x X-Received-From: 207.126.252.18 Cc: Anthony Liguori , "satoru.moriya.br@hitachi.com" , Jan Kiszka , "mtosatti@redhat.com" , "dle-develop@lists.sourceforge.net" , Tomoki Sekiyama , Paolo Bonzini , Seiji Aguchi Subject: [Qemu-devel] [PATCH v4] Add option to mlock qemu and guest memory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 Reviewed-by: Paolo Bonzini Reviewed-by: Marcelo Tosatti --- ChangeLog: v4 - Update commit message v3 - Modify os_mlock() to return error code - Update configure_realtime() to handle return value from os_mlock() - Change the variable name from is_mlock to enable_mlock in configure_realtime() - Rebase qemu version 1.4.50 v2 - Change option name from -mlock to -realtime mlock=on|off - Rebase qemu version 1.3.91 - Update patch description include/sysemu/os-posix.h | 1 + include/sysemu/os-win32.h | 5 +++++ os-posix.c | 12 ++++++++++++ qemu-options.hx | 13 +++++++++++++ vl.c | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+) -- 1.7.11.7 diff --git a/include/sysemu/os-posix.h b/include/sysemu/os-posix.h index 7f198e4..25d0b2a 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 71f5fa0..bf8523a 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 5c64518..d39261d 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 06dd565..1ec9541 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2569,6 +2569,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 aeed7f4..71bbcf1 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 */ @@ -2909,6 +2935,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(); @@ -3878,6 +3905,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); }