From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768576218800.2337610724267; Mon, 23 Oct 2017 07:22:56 -0700 (PDT) Received: from localhost ([::1]:39020 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dcx-0004AO-Ab for importer@patchew.org; Mon, 23 Oct 2017 10:22:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dYg-0000tR-0K for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dYe-0000Qy-Qo for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60386) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dYe-0000QU-JK for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:24 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99CDFC07013B for ; Mon, 23 Oct 2017 14:18:23 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id E7CB778DFB; Mon, 23 Oct 2017 14:18:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 99CDFC07013B Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:07 +0100 Message-Id: <20171023141815.17709-2-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 23 Oct 2017 14:18:23 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 1/9] memfd: split qemu_memfd_alloc() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add a function to only create a memfd, without mmap. The function is used in the following memory backend. Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- include/qemu/memfd.h | 1 + util/memfd.c | 61 +++++++++++++++++++++++++++++++-----------------= ---- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h index 745a8c501e..41c24d807c 100644 --- a/include/qemu/memfd.h +++ b/include/qemu/memfd.h @@ -16,6 +16,7 @@ #define F_SEAL_WRITE 0x0008 /* prevent writes */ #endif =20 +int qemu_memfd_create(const char *name, size_t size, unsigned int seals); void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, int *fd); void qemu_memfd_free(void *ptr, size_t size, int fd); diff --git a/util/memfd.c b/util/memfd.c index 4571d1aba8..e9c1a0e700 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -55,6 +55,38 @@ static int memfd_create(const char *name, unsigned int f= lags) #define MFD_ALLOW_SEALING 0x0002U #endif =20 +int qemu_memfd_create(const char *name, size_t size, unsigned int seals) +{ + int mfd =3D -1; + +#ifdef CONFIG_LINUX + unsigned int flags =3D MFD_CLOEXEC; + + if (seals) { + flags |=3D MFD_ALLOW_SEALING; + } + + mfd =3D memfd_create(name, flags); + if (mfd < 0) { + return -1; + } + + if (ftruncate(mfd, size) =3D=3D -1) { + perror("ftruncate"); + close(mfd); + return -1; + } + + if (seals && fcntl(mfd, F_ADD_SEALS, seals) =3D=3D -1) { + perror("fcntl"); + close(mfd); + return -1; + } +#endif + + return mfd; +} + /* * This is a best-effort helper for shared memory allocation, with * optional sealing. The helper will do his best to allocate using @@ -65,35 +97,14 @@ void *qemu_memfd_alloc(const char *name, size_t size, u= nsigned int seals, int *fd) { void *ptr; - int mfd =3D -1; - - *fd =3D -1; - -#ifdef CONFIG_LINUX - if (seals) { - mfd =3D memfd_create(name, MFD_ALLOW_SEALING | MFD_CLOEXEC); - } + int mfd =3D qemu_memfd_create(name, size, seals); =20 + /* some systems have memfd without sealing */ if (mfd =3D=3D -1) { - /* some systems have memfd without sealing */ - mfd =3D memfd_create(name, MFD_CLOEXEC); - seals =3D 0; + mfd =3D qemu_memfd_create(name, size, 0); } -#endif - - if (mfd !=3D -1) { - if (ftruncate(mfd, size) =3D=3D -1) { - perror("ftruncate"); - close(mfd); - return NULL; - } =20 - if (seals && fcntl(mfd, F_ADD_SEALS, seals) =3D=3D -1) { - perror("fcntl"); - close(mfd); - return NULL; - } - } else { + if (mfd =3D=3D -1) { const char *tmpdir =3D g_get_tmp_dir(); gchar *fname; =20 --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768591442682.2407257396891; Mon, 23 Oct 2017 07:23:11 -0700 (PDT) Received: from localhost ([::1]:39021 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6ddD-0004Mx-IB for importer@patchew.org; Mon, 23 Oct 2017 10:23:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40172) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dYm-0000wW-Hr for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dYj-0000Sr-77 for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50950) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dYj-0000SW-0n for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:29 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 22D03356CB for ; Mon, 23 Oct 2017 14:18:28 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8289A83843; Mon, 23 Oct 2017 14:18:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 22D03356CB Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:08 +0100 Message-Id: <20171023141815.17709-3-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 23 Oct 2017 14:18:28 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 2/9] memfd: remove needless include X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- util/memfd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/util/memfd.c b/util/memfd.c index e9c1a0e700..b5b7a41347 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -27,8 +27,6 @@ =20 #include "qemu/osdep.h" =20 -#include - #include "qemu/memfd.h" =20 #ifdef CONFIG_MEMFD --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768454365682.3653395538121; Mon, 23 Oct 2017 07:20:54 -0700 (PDT) Received: from localhost ([::1]:39010 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6day-0002G4-D8 for importer@patchew.org; Mon, 23 Oct 2017 10:20:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40239) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dYx-00012b-Dk for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dYr-0000WY-8Z for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:20190) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dYq-0000WD-Vl for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:37 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17FE5C047B8C for ; Mon, 23 Oct 2017 14:18:36 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1816879C5C; Mon, 23 Oct 2017 14:18:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 17FE5C047B8C Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:09 +0100 Message-Id: <20171023141815.17709-4-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 23 Oct 2017 14:18:36 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 3/9] memfd: add error argument, instead of perror() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, "Michael S. Tsirkin" , ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This will allow callers to silence error report when the call is allowed to failed. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/qemu/memfd.h | 5 +++-- hw/virtio/vhost.c | 8 +++++++- util/memfd.c | 57 +++++++++++++++++++++++++++---------------------= ---- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h index 41c24d807c..b9d09873b5 100644 --- a/include/qemu/memfd.h +++ b/include/qemu/memfd.h @@ -16,9 +16,10 @@ #define F_SEAL_WRITE 0x0008 /* prevent writes */ #endif =20 -int qemu_memfd_create(const char *name, size_t size, unsigned int seals); +int qemu_memfd_create(const char *name, size_t size, unsigned int seals, + Error **errp); void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, - int *fd); + int *fd, Error **errp); void qemu_memfd_free(void *ptr, size_t size, int fd); bool qemu_memfd_check(void); =20 diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index ddc42f0f93..63ec0e8315 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -329,6 +329,7 @@ static uint64_t vhost_get_log_size(struct vhost_dev *de= v) =20 static struct vhost_log *vhost_log_alloc(uint64_t size, bool share) { + Error *err =3D NULL; struct vhost_log *log; uint64_t logsize =3D size * sizeof(*(log->log)); int fd =3D -1; @@ -337,7 +338,12 @@ static struct vhost_log *vhost_log_alloc(uint64_t size= , bool share) if (share) { log->log =3D qemu_memfd_alloc("vhost-log", logsize, F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_S= EAL, - &fd); + &fd, &err); + if (err) { + error_report_err(err); + g_free(log); + return NULL; + } memset(log->log, 0, logsize); } else { log->log =3D g_malloc0(logsize); diff --git a/util/memfd.c b/util/memfd.c index b5b7a41347..f890976a0e 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -27,6 +27,7 @@ =20 #include "qemu/osdep.h" =20 +#include "qapi/error.h" #include "qemu/memfd.h" =20 #ifdef CONFIG_MEMFD @@ -53,11 +54,11 @@ static int memfd_create(const char *name, unsigned int = flags) #define MFD_ALLOW_SEALING 0x0002U #endif =20 -int qemu_memfd_create(const char *name, size_t size, unsigned int seals) +int qemu_memfd_create(const char *name, size_t size, + unsigned int seals, Error **errp) { - int mfd =3D -1; - #ifdef CONFIG_LINUX + int mfd =3D -1; unsigned int flags =3D MFD_CLOEXEC; =20 if (seals) { @@ -66,23 +67,26 @@ int qemu_memfd_create(const char *name, size_t size, un= signed int seals) =20 mfd =3D memfd_create(name, flags); if (mfd < 0) { - return -1; + goto err; } =20 if (ftruncate(mfd, size) =3D=3D -1) { - perror("ftruncate"); - close(mfd); - return -1; + goto err; } =20 if (seals && fcntl(mfd, F_ADD_SEALS, seals) =3D=3D -1) { - perror("fcntl"); - close(mfd); - return -1; + goto err; } -#endif =20 return mfd; + +err: + if (mfd >=3D 0) { + close(mfd); + } +#endif + error_setg_errno(errp, errno, "failed to create memfd"); + return -1; } =20 /* @@ -92,14 +96,14 @@ int qemu_memfd_create(const char *name, size_t size, un= signed int seals) * sealing. */ void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, - int *fd) + int *fd, Error **errp) { void *ptr; - int mfd =3D qemu_memfd_create(name, size, seals); + int mfd =3D qemu_memfd_create(name, size, seals, NULL); =20 /* some systems have memfd without sealing */ if (mfd =3D=3D -1) { - mfd =3D qemu_memfd_create(name, size, 0); + mfd =3D qemu_memfd_create(name, size, 0, NULL); } =20 if (mfd =3D=3D -1) { @@ -111,27 +115,26 @@ void *qemu_memfd_alloc(const char *name, size_t size,= unsigned int seals, unlink(fname); g_free(fname); =20 - if (mfd =3D=3D -1) { - perror("mkstemp"); - return NULL; - } - - if (ftruncate(mfd, size) =3D=3D -1) { - perror("ftruncate"); - close(mfd); - return NULL; + if (mfd =3D=3D -1 || + ftruncate(mfd, size) =3D=3D -1) { + goto err; } } =20 ptr =3D mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0); if (ptr =3D=3D MAP_FAILED) { - perror("mmap"); - close(mfd); - return NULL; + goto err; } =20 *fd =3D mfd; return ptr; + +err: + error_setg_errno(errp, errno, "failed to allocate shared memory"); + if (mfd >=3D 0) { + close(mfd); + } + return NULL; } =20 void qemu_memfd_free(void *ptr, size_t size, int fd) @@ -159,7 +162,7 @@ bool qemu_memfd_check(void) int fd; void *ptr; =20 - ptr =3D qemu_memfd_alloc("test", 4096, 0, &fd); + ptr =3D qemu_memfd_alloc("test", 4096, 0, &fd, NULL); memfd_check =3D ptr ? MEMFD_OK : MEMFD_KO; qemu_memfd_free(ptr, 4096, fd); } --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 150876845205597.00871890607573; Mon, 23 Oct 2017 07:20:52 -0700 (PDT) Received: from localhost ([::1]:39008 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dav-0002DE-ON for importer@patchew.org; Mon, 23 Oct 2017 10:20:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40245) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dYy-00013F-BF for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dYu-0000Xo-A1 for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51928) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dYu-0000XR-19 for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:40 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3145F356CA for ; Mon, 23 Oct 2017 14:18:39 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 174F75D6B2; Mon, 23 Oct 2017 14:18:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3145F356CA Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:10 +0100 Message-Id: <20171023141815.17709-5-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 23 Oct 2017 14:18:39 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 4/9] memfd: add hugetlb support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Linux commit 749df87bd7bee5a79cef073f5d032ddb2b211de8 (v4.14-rc1) added a new flag MFD_HUGETLB to memfd_create() that specify the file to be created resides in the hugetlbfs filesystem. This is the generic hugetlbfs filesystem not associated with any specific mount point. hugetlbfs does not support sealing operations, therefore specifying MFD_ALLOW_SEALING with MFD_HUGETLB will result in EINVAL. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/qemu/memfd.h | 4 ++-- util/memfd.c | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h index b9d09873b5..1d3ecc7458 100644 --- a/include/qemu/memfd.h +++ b/include/qemu/memfd.h @@ -16,8 +16,8 @@ #define F_SEAL_WRITE 0x0008 /* prevent writes */ #endif =20 -int qemu_memfd_create(const char *name, size_t size, unsigned int seals, - Error **errp); +int qemu_memfd_create(const char *name, size_t size, bool hugetlb, + unsigned int seals, Error **errp); void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, int *fd, Error **errp); void qemu_memfd_free(void *ptr, size_t size, int fd); diff --git a/util/memfd.c b/util/memfd.c index f890976a0e..98294e84de 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -54,7 +54,11 @@ static int memfd_create(const char *name, unsigned int f= lags) #define MFD_ALLOW_SEALING 0x0002U #endif =20 -int qemu_memfd_create(const char *name, size_t size, +#ifndef MFD_HUGETLB +#define MFD_HUGETLB 0x0004U +#endif + +int qemu_memfd_create(const char *name, size_t size, bool hugetlb, unsigned int seals, Error **errp) { #ifdef CONFIG_LINUX @@ -64,6 +68,9 @@ int qemu_memfd_create(const char *name, size_t size, if (seals) { flags |=3D MFD_ALLOW_SEALING; } + if (hugetlb) { + flags |=3D MFD_HUGETLB; + } =20 mfd =3D memfd_create(name, flags); if (mfd < 0) { @@ -99,11 +106,11 @@ void *qemu_memfd_alloc(const char *name, size_t size, = unsigned int seals, int *fd, Error **errp) { void *ptr; - int mfd =3D qemu_memfd_create(name, size, seals, NULL); + int mfd =3D qemu_memfd_create(name, size, false, seals, NULL); =20 /* some systems have memfd without sealing */ if (mfd =3D=3D -1) { - mfd =3D qemu_memfd_create(name, size, 0, NULL); + mfd =3D qemu_memfd_create(name, size, false, 0, NULL); } =20 if (mfd =3D=3D -1) { --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768619612307.132707927104; Mon, 23 Oct 2017 07:23:39 -0700 (PDT) Received: from localhost ([::1]:39022 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6ddb-0004gQ-O6 for importer@patchew.org; Mon, 23 Oct 2017 10:23:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40274) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dZ0-00015J-UE for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dYz-0000ac-Ty for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53898) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dYz-0000aE-Lg for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:45 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C1F12C0587CD for ; Mon, 23 Oct 2017 14:18:44 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1CA7360E3B; Mon, 23 Oct 2017 14:18:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C1F12C0587CD Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:11 +0100 Message-Id: <20171023141815.17709-6-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 23 Oct 2017 14:18:44 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 5/9] memfd: add hugetlbsize argument X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Learn to specificy hugetlb size as qemu_memfd_create() argument. Signed-off-by: Marc-Andr=C3=A9 Lureau --- include/qemu/memfd.h | 2 +- util/memfd.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h index 1d3ecc7458..de10198ed6 100644 --- a/include/qemu/memfd.h +++ b/include/qemu/memfd.h @@ -17,7 +17,7 @@ #endif =20 int qemu_memfd_create(const char *name, size_t size, bool hugetlb, - unsigned int seals, Error **errp); + uint64_t hugetlbsize, unsigned int seals, Error **er= rp); void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, int *fd, Error **errp); void qemu_memfd_free(void *ptr, size_t size, int fd); diff --git a/util/memfd.c b/util/memfd.c index 98294e84de..0144acd476 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -29,6 +29,7 @@ =20 #include "qapi/error.h" #include "qemu/memfd.h" +#include "qemu/host-utils.h" =20 #ifdef CONFIG_MEMFD #include @@ -58,9 +59,22 @@ static int memfd_create(const char *name, unsigned int f= lags) #define MFD_HUGETLB 0x0004U #endif =20 +#ifndef MFD_HUGE_SHIFT +#define MFD_HUGE_SHIFT 26 +#endif + int qemu_memfd_create(const char *name, size_t size, bool hugetlb, - unsigned int seals, Error **errp) + uint64_t hugetlbsize, unsigned int seals, Error **er= rp) { + int htsize =3D hugetlbsize ? ctz64(hugetlbsize) : 0; + + if (htsize && 1 << htsize !=3D hugetlbsize) { + error_setg(errp, "Hugepage size must be a power of 2"); + return -1; + } + + htsize =3D htsize << MFD_HUGE_SHIFT; + #ifdef CONFIG_LINUX int mfd =3D -1; unsigned int flags =3D MFD_CLOEXEC; @@ -70,8 +84,8 @@ int qemu_memfd_create(const char *name, size_t size, bool= hugetlb, } if (hugetlb) { flags |=3D MFD_HUGETLB; + flags |=3D htsize; } - mfd =3D memfd_create(name, flags); if (mfd < 0) { goto err; @@ -106,11 +120,11 @@ void *qemu_memfd_alloc(const char *name, size_t size,= unsigned int seals, int *fd, Error **errp) { void *ptr; - int mfd =3D qemu_memfd_create(name, size, false, seals, NULL); + int mfd =3D qemu_memfd_create(name, size, false, 0, seals, NULL); =20 /* some systems have memfd without sealing */ if (mfd =3D=3D -1) { - mfd =3D qemu_memfd_create(name, size, false, 0, NULL); + mfd =3D qemu_memfd_create(name, size, false, 0, 0, NULL); } =20 if (mfd =3D=3D -1) { --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768631060685.0896933328308; Mon, 23 Oct 2017 07:23:51 -0700 (PDT) Received: from localhost ([::1]:39024 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6ddg-0004lS-2P for importer@patchew.org; Mon, 23 Oct 2017 10:23:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40315) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dZ5-00016l-1H for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dZ3-0000cu-Hi for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49996) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dZ3-0000cE-8Q for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:49 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66ED961D1F for ; Mon, 23 Oct 2017 14:18:48 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id BDDB15D96F; Mon, 23 Oct 2017 14:18:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 66ED961D1F Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:12 +0100 Message-Id: <20171023141815.17709-7-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 23 Oct 2017 14:18:48 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 6/9] Add memfd based hostmem X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, Igor Mammedov , ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add a new memory backend, similar to hostmem-file, except that it doesn't need to create files. It also enforces memory sealing. This backend is mainly useful for sharing the memory with other processes. Note that Linux supports transparent huge-pages of shmem/memfd memory since 4.8. It is relatively easier to set up THP than a dedicate hugepage mount point by using "madvise" in /sys/kernel/mm/transparent_hugepage/shmem_enabled. Since 4.14, memfd allows to set hugetlb requirement explicitly. Usage: -object memory-backend-memfd,id=3Dmem1,size=3D1G Signed-off-by: Marc-Andr=C3=A9 Lureau --- backends/hostmem-memfd.c | 168 +++++++++++++++++++++++++++++++++++++++++++= ++++ backends/Makefile.objs | 2 + qemu-options.hx | 23 +++++++ 3 files changed, 193 insertions(+) create mode 100644 backends/hostmem-memfd.c diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c new file mode 100644 index 0000000000..28f15638c8 --- /dev/null +++ b/backends/hostmem-memfd.c @@ -0,0 +1,168 @@ +/* + * QEMU host memfd memory backend + * + * Copyright (C) 2016 Red Hat Inc + * + * Authors: + * Marc-Andr=C3=A9 Lureau + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "sysemu/hostmem.h" +#include "sysemu/sysemu.h" +#include "qom/object_interfaces.h" +#include "qemu/memfd.h" +#include "qapi/error.h" + +#define TYPE_MEMORY_BACKEND_MEMFD "memory-backend-memfd" + +#define MEMORY_BACKEND_MEMFD(obj) \ + OBJECT_CHECK(HostMemoryBackendMemfd, (obj), TYPE_MEMORY_BACKEND_MEMFD) + +typedef struct HostMemoryBackendMemfd HostMemoryBackendMemfd; + +struct HostMemoryBackendMemfd { + HostMemoryBackend parent_obj; + + bool hugetlb; + uint64_t hugetlbsize; + bool seal; +}; + +static void +memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) +{ + HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(backend); + int fd; + + if (!backend->size) { + error_setg(errp, "can't create backend with size 0"); + return; + } + + if (host_memory_backend_mr_inited(backend)) { + return; + } + + backend->force_prealloc =3D mem_prealloc; + fd =3D qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, + m->hugetlb, m->hugetlbsize, m->seal ? + F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, + errp); + if (fd =3D=3D -1) { + return; + } + + memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), + object_get_canonical_path(OBJECT(backen= d)), + backend->size, true, fd, errp); +} + +static bool +memfd_backend_get_hugetlb(Object *o, Error **errp) +{ + return MEMORY_BACKEND_MEMFD(o)->hugetlb; +} + +static void +memfd_backend_set_hugetlb(Object *o, bool value, Error **errp) +{ + MEMORY_BACKEND_MEMFD(o)->hugetlb =3D value; +} + +static void +memfd_backend_set_hugetlbsize(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(obj); + Error *local_err =3D NULL; + uint64_t value; + + if (host_memory_backend_mr_inited(MEMORY_BACKEND(obj))) { + error_setg(&local_err, "cannot change property value"); + goto out; + } + + visit_type_size(v, name, &value, &local_err); + if (local_err) { + goto out; + } + if (!value) { + error_setg(&local_err, "Property '%s.%s' doesn't take value '%" + PRIu64 "'", object_get_typename(obj), name, value); + goto out; + } + m->hugetlbsize =3D value; +out: + error_propagate(errp, local_err); +} + +static void +memfd_backend_get_hugetlbsize(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(obj); + uint64_t value =3D m->hugetlbsize; + + visit_type_size(v, name, &value, errp); +} + +static bool +memfd_backend_get_seal(Object *o, Error **errp) +{ + return MEMORY_BACKEND_MEMFD(o)->seal; +} + +static void +memfd_backend_set_seal(Object *o, bool value, Error **errp) +{ + MEMORY_BACKEND_MEMFD(o)->seal =3D value; +} + +static void +memfd_backend_instance_init(Object *obj) +{ + HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(obj); + + /* default to sealed file */ + m->seal =3D true; +} + +static void +memfd_backend_class_init(ObjectClass *oc, void *data) +{ + HostMemoryBackendClass *bc =3D MEMORY_BACKEND_CLASS(oc); + + bc->alloc =3D memfd_backend_memory_alloc; + + object_class_property_add_bool(oc, "hugetlb", + memfd_backend_get_hugetlb, + memfd_backend_set_hugetlb, + &error_abort); + object_class_property_add(oc, "hugetlbsize", "int", + memfd_backend_get_hugetlbsize, + memfd_backend_set_hugetlbsize, + NULL, NULL, &error_abort); + object_class_property_add_bool(oc, "seal", + memfd_backend_get_seal, + memfd_backend_set_seal, + &error_abort); +} + +static const TypeInfo memfd_backend_info =3D { + .name =3D TYPE_MEMORY_BACKEND_MEMFD, + .parent =3D TYPE_MEMORY_BACKEND, + .instance_init =3D memfd_backend_instance_init, + .class_init =3D memfd_backend_class_init, + .instance_size =3D sizeof(HostMemoryBackendMemfd), +}; + +static void register_types(void) +{ + type_register_static(&memfd_backend_info); +} + +type_init(register_types); diff --git a/backends/Makefile.objs b/backends/Makefile.objs index 0400799efd..67eeeba5fc 100644 --- a/backends/Makefile.objs +++ b/backends/Makefile.objs @@ -8,3 +8,5 @@ common-obj-$(CONFIG_LINUX) +=3D hostmem-file.o =20 common-obj-y +=3D cryptodev.o common-obj-y +=3D cryptodev-builtin.o + +common-obj-$(CONFIG_LINUX) +=3D hostmem-memfd.o diff --git a/qemu-options.hx b/qemu-options.hx index 3728e9b4dd..3d4dc7880c 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -4208,6 +4208,29 @@ that @option{discard-data} is only an optimization, = and QEMU might not discard file contents if it aborts unexpectedly or is terminated using SIGKILL. =20 +@item -object memory-backend-memfd,id=3D@var{id},size=3D@var{size},seal=3D= @var{on|off},hugetlb=3D@var{on|off},hugetlbsize=3D@var{size} + +Creates an anonymous memory file backend object, which allows QEMU to +share the memory with an external process in some cases (e.g. when +using vhost-user). The memory is allocated with memfd and optional +sealing. (Linux only) + +The @option{id} parameter is a unique ID that will be used to +reference this memory region when configuring the @option{-numa} +argument. The @option{size} option provides the size of the memory +region, and accepts common suffixes, eg @option{500M}. The +@option{seal} option creates a sealed-file, that will block further +resizing the memory ('on' by default). + +The @option{hugetlb} option specify the file to be created resides in +the hugetlbfs filesystem. Used in conjunction with the +@option{hugetlb} option, the @option{hugetlbsize} option specify the +hugetlb page size on systems that support multiple hugetlb page sizes +(it must be a power of 2 value supported by the system). + +@option{hugetlb} option is currently incompatible with @option{seal} +option. + @item -object rng-random,id=3D@var{id},filename=3D@var{/dev/random} =20 Creates a random number generator backend which obtains entropy from --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768736495435.0902416123522; Mon, 23 Oct 2017 07:25:36 -0700 (PDT) Received: from localhost ([::1]:39030 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dfG-0006CG-LZ for importer@patchew.org; Mon, 23 Oct 2017 10:25:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40363) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dZ8-0001AZ-UD for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dZ4-0000dt-T8 for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35300) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dZ4-0000dD-KE for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:50 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B5F08883A4 for ; Mon, 23 Oct 2017 14:18:49 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5157260BEC; Mon, 23 Oct 2017 14:18:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B5F08883A4 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:13 +0100 Message-Id: <20171023141815.17709-8-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 23 Oct 2017 14:18:49 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 7/9] tests: keep compiling failing vhost-user tests X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Let's protect the failing tests under a QTEST_VHOST_USER_FIXME environment variable, so we keep compiling the tests and we can easily run them. Signed-off-by: Marc-Andr=C3=A9 Lureau --- tests/vhost-user-test.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index 4b98018478..7fc6f85888 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -31,8 +31,6 @@ #include #include =20 -#define VHOST_USER_NET_TESTS_WORKING 0 /* broken as of 2.10.0 */ - /* GLIB version compatibility flags */ #if !GLIB_CHECK_VERSION(2, 26, 0) #define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT(1000000)) @@ -719,7 +717,7 @@ static void wait_for_rings_started(TestServer *s, size_= t count) g_mutex_unlock(&s->data_mutex); } =20 -#if VHOST_USER_NET_TESTS_WORKING && defined(CONFIG_HAS_GLIB_SUBPROCESS_TES= TS) +#if defined(CONFIG_HAS_GLIB_SUBPROCESS_TESTS) static inline void test_server_connect(TestServer *server) { test_server_create_chr(server, ",reconnect=3D1"); @@ -965,16 +963,19 @@ int main(int argc, char **argv) qtest_add_func("/vhost-user/migrate", test_migrate); qtest_add_func("/vhost-user/multiqueue", test_multiqueue); =20 -#if VHOST_USER_NET_TESTS_WORKING && defined(CONFIG_HAS_GLIB_SUBPROCESS_TES= TS) - qtest_add_func("/vhost-user/reconnect/subprocess", - test_reconnect_subprocess); - qtest_add_func("/vhost-user/reconnect", test_reconnect); - qtest_add_func("/vhost-user/connect-fail/subprocess", - test_connect_fail_subprocess); - qtest_add_func("/vhost-user/connect-fail", test_connect_fail); - qtest_add_func("/vhost-user/flags-mismatch/subprocess", - test_flags_mismatch_subprocess); - qtest_add_func("/vhost-user/flags-mismatch", test_flags_mismatch); +#if defined(CONFIG_HAS_GLIB_SUBPROCESS_TESTS) + /* keeps failing on build-system since Aug 15 2017 */ + if (getenv("QTEST_VHOST_USER_FIXME")) { + qtest_add_func("/vhost-user/reconnect/subprocess", + test_reconnect_subprocess); + qtest_add_func("/vhost-user/reconnect", test_reconnect); + qtest_add_func("/vhost-user/connect-fail/subprocess", + test_connect_fail_subprocess); + qtest_add_func("/vhost-user/connect-fail", test_connect_fail); + qtest_add_func("/vhost-user/flags-mismatch/subprocess", + test_flags_mismatch_subprocess); + qtest_add_func("/vhost-user/flags-mismatch", test_flags_mismatch); + } #endif =20 ret =3D g_test_run(); --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768839328754.1237489971326; Mon, 23 Oct 2017 07:27:19 -0700 (PDT) Received: from localhost ([::1]:39042 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dh4-0007gj-Gk for importer@patchew.org; Mon, 23 Oct 2017 10:27:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40339) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dZ7-00018x-7c for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dZ6-0000eY-6r for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55968) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dZ5-0000e8-Uv for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:52 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1DA0F745 for ; Mon, 23 Oct 2017 14:18:51 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D2385DA68; Mon, 23 Oct 2017 14:18:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1DA0F745 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:14 +0100 Message-Id: <20171023141815.17709-9-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 23 Oct 2017 14:18:51 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 8/9] vhost-user-test: make read-guest-mem setup its own qemu X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Marc-Andr=C3=A9 Lureau --- tests/vhost-user-test.c | 66 ++++++++++++++++++++++++++-------------------= ---- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index 7fc6f85888..2da6b6d61f 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -49,6 +49,14 @@ #define QEMU_CMD QEMU_CMD_MEM QEMU_CMD_CHR \ QEMU_CMD_NETDEV QEMU_CMD_NET =20 +#define GET_QEMU_CMD(s) \ + g_strdup_printf(QEMU_CMD, 512, 512, (root), (s)->chr_name, \ + (s)->socket_path, "", (s)->chr_name) + +#define GET_QEMU_CMDE(s, mem, chr_opts, extra, ...) \ + g_strdup_printf(QEMU_CMD extra, (mem), (mem), (root), (s)->chr_name, \ + (s)->socket_path, (chr_opts), (s)->chr_name, ##__VA_AR= GS__) + #define HUGETLBFS_MAGIC 0x958458f6 =20 /*********** FROM hw/virtio/vhost-user.c *********************************= ****/ @@ -156,6 +164,10 @@ typedef struct TestServer { int queues; } TestServer; =20 +static TestServer *test_server_new(const gchar *name); +static void test_server_free(TestServer *server); +static void test_server_listen(TestServer *server); + static const char *tmpfs; static const char *root; =20 @@ -205,9 +217,8 @@ static void wait_for_fds(TestServer *s) g_mutex_unlock(&s->data_mutex); } =20 -static void read_guest_mem(const void *data) +static void read_guest_mem_server(TestServer *s) { - TestServer *s =3D (void *)data; uint32_t *guest_mem; int i, j; size_t size; @@ -248,6 +259,26 @@ static void read_guest_mem(const void *data) g_mutex_unlock(&s->data_mutex); } =20 +static void read_guest_mem(void) +{ + TestServer *s; + char *qemu_cmd; + + s =3D test_server_new("test"); + test_server_listen(s); + + qemu_cmd =3D GET_QEMU_CMD(s); + + qtest_start(qemu_cmd); + g_free(qemu_cmd); + init_virtio_dev(s); + + read_guest_mem_server(s); + + qtest_end(); + test_server_free(s); +} + static void *thread_function(void *data) { GMainLoop *loop =3D data; @@ -472,14 +503,6 @@ static void test_server_listen(TestServer *server) test_server_create_chr(server, ",server,nowait"); } =20 -#define GET_QEMU_CMD(s) \ - g_strdup_printf(QEMU_CMD, 512, 512, (root), (s)->chr_name, \ - (s)->socket_path, "", (s)->chr_name) - -#define GET_QEMU_CMDE(s, mem, chr_opts, extra, ...) \ - g_strdup_printf(QEMU_CMD extra, (mem), (mem), (root), (s)->chr_name, \ - (s)->socket_path, (chr_opts), (s)->chr_name, ##__VA_AR= GS__) - static gboolean _test_server_free(TestServer *server) { int i; @@ -686,7 +709,7 @@ static void test_migrate(void) global_qtest =3D to; qmp_eventwait("RESUME"); =20 - read_guest_mem(dest); + read_guest_mem_server(dest); =20 g_source_destroy(source); g_source_unref(source); @@ -918,10 +941,7 @@ static void test_multiqueue(void) =20 int main(int argc, char **argv) { - QTestState *s =3D NULL; - TestServer *server =3D NULL; const char *hugefs; - char *qemu_cmd =3D NULL; int ret; char template[] =3D "/tmp/vhost-test-XXXXXX"; GMainLoop *loop; @@ -946,20 +966,11 @@ int main(int argc, char **argv) root =3D tmpfs; } =20 - server =3D test_server_new("test"); - test_server_listen(server); - loop =3D g_main_loop_new(NULL, FALSE); /* run the main loop thread so the chardev may operate */ thread =3D g_thread_new(NULL, thread_function, loop); =20 - qemu_cmd =3D GET_QEMU_CMD(server); - - s =3D qtest_start(qemu_cmd); - g_free(qemu_cmd); - init_virtio_dev(server); - - qtest_add_data_func("/vhost-user/read-guest-mem", server, read_guest_m= em); + qtest_add_func("/vhost-user/read-guest-mem", read_guest_mem); qtest_add_func("/vhost-user/migrate", test_migrate); qtest_add_func("/vhost-user/multiqueue", test_multiqueue); =20 @@ -980,13 +991,6 @@ int main(int argc, char **argv) =20 ret =3D g_test_run(); =20 - if (s) { - qtest_quit(s); - } - - /* cleanup */ - test_server_free(server); - /* finish the helper thread and dispatch pending sources */ g_main_loop_quit(loop); g_thread_join(thread); --=20 2.15.0.rc0.40.gaefcc5f6f From nobody Sun Apr 28 21:54:58 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1508768735614243.126670210234; Mon, 23 Oct 2017 07:25:35 -0700 (PDT) Received: from localhost ([::1]:39032 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dfP-0006Jz-QY for importer@patchew.org; Mon, 23 Oct 2017 10:25:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40361) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e6dZ8-0001AT-QJ for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e6dZ7-0000f6-IK for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62401) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1e6dZ7-0000ej-A3 for qemu-devel@nongnu.org; Mon, 23 Oct 2017 10:18:53 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7605B61BB4 for ; Mon, 23 Oct 2017 14:18:52 +0000 (UTC) Received: from localhost (unknown [10.41.1.168]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0E1085D755; Mon, 23 Oct 2017 14:18:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7605B61BB4 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=marcandre.lureau@redhat.com From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Mon, 23 Oct 2017 15:18:15 +0100 Message-Id: <20171023141815.17709-10-marcandre.lureau@redhat.com> In-Reply-To: <20171023141815.17709-1-marcandre.lureau@redhat.com> References: <20171023141815.17709-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 23 Oct 2017 14:18:52 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 9/9] tests: use memfd in vhost-user-test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, ehabkost@redhat.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This will exercise the memfd memory backend and should generally be better for testing than memory-backend-file (thanks to anonymous files and sealing). If memfd is available, it is preferred. However, in order to check that file & memfd backends both work correctly, the read-guest-mem test is checked explicitly for each. Signed-off-by: Marc-Andr=C3=A9 Lureau --- tests/vhost-user-test.c | 89 ++++++++++++++++++++++++++++++++++-----------= ---- 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index 2da6b6d61f..ee5b528bea 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -17,6 +17,7 @@ #include "qemu/range.h" #include "qemu/sockets.h" #include "chardev/char-fe.h" +#include "qemu/memfd.h" #include "sysemu/sysemu.h" #include "libqos/libqos.h" #include "libqos/pci-pc.h" @@ -40,23 +41,14 @@ #define HAVE_MONOTONIC_TIME #endif =20 -#define QEMU_CMD_MEM " -m %d -object memory-backend-file,id=3Dmem,size= =3D%dM,"\ +#define QEMU_CMD_MEM " -m %d -object memory-backend-file,id=3Dmem,size= =3D%dM," \ "mem-path=3D%s,share=3Don -numa node,memdev=3Dmem" +#define QEMU_CMD_MEMFD " -m %d -object memory-backend-memfd,id=3Dmem,size= =3D%dM," \ + " -numa node,memdev=3Dmem" #define QEMU_CMD_CHR " -chardev socket,id=3D%s,path=3D%s%s" #define QEMU_CMD_NETDEV " -netdev vhost-user,id=3Dnet0,chardev=3D%s,vhostf= orce" #define QEMU_CMD_NET " -device virtio-net-pci,netdev=3Dnet0" =20 -#define QEMU_CMD QEMU_CMD_MEM QEMU_CMD_CHR \ - QEMU_CMD_NETDEV QEMU_CMD_NET - -#define GET_QEMU_CMD(s) \ - g_strdup_printf(QEMU_CMD, 512, 512, (root), (s)->chr_name, \ - (s)->socket_path, "", (s)->chr_name) - -#define GET_QEMU_CMDE(s, mem, chr_opts, extra, ...) \ - g_strdup_printf(QEMU_CMD extra, (mem), (mem), (root), (s)->chr_name, \ - (s)->socket_path, (chr_opts), (s)->chr_name, ##__VA_AR= GS__) - #define HUGETLBFS_MAGIC 0x958458f6 =20 /*********** FROM hw/virtio/vhost-user.c *********************************= ****/ @@ -171,6 +163,33 @@ static void test_server_listen(TestServer *server); static const char *tmpfs; static const char *root; =20 +enum test_memfd { + TEST_MEMFD_AUTO, + TEST_MEMFD_YES, + TEST_MEMFD_NO, +}; + +static char *get_qemu_cmd(TestServer *s, + int mem, enum test_memfd memfd, const char *mem_= path, + const char *chr_opts, const char *extra) +{ + if (memfd =3D=3D TEST_MEMFD_AUTO && qemu_memfd_check()) { + memfd =3D TEST_MEMFD_YES; + } + + if (memfd =3D=3D TEST_MEMFD_YES) { + return g_strdup_printf(QEMU_CMD_MEMFD QEMU_CMD_CHR + QEMU_CMD_NETDEV QEMU_CMD_NET "%s", mem, mem, + s->chr_name, s->socket_path, + chr_opts, s->chr_name, extra); + } else { + return g_strdup_printf(QEMU_CMD_MEM QEMU_CMD_CHR + QEMU_CMD_NETDEV QEMU_CMD_NET "%s", mem, mem, + mem_path, s->chr_name, s->socket_path, + chr_opts, s->chr_name, extra); + } +} + static void init_virtio_dev(TestServer *s) { QVirtioPCIDevice *dev; @@ -259,15 +278,16 @@ static void read_guest_mem_server(TestServer *s) g_mutex_unlock(&s->data_mutex); } =20 -static void read_guest_mem(void) +static void read_guest_mem(const void *arg) { + enum test_memfd memfd =3D GPOINTER_TO_INT(arg); TestServer *s; char *qemu_cmd; =20 s =3D test_server_new("test"); test_server_listen(s); =20 - qemu_cmd =3D GET_QEMU_CMD(s); + qemu_cmd =3D get_qemu_cmd(s, 512, memfd, root, "", ""); =20 qtest_start(qemu_cmd); g_free(qemu_cmd); @@ -646,7 +666,7 @@ static void test_migrate(void) char *uri =3D g_strdup_printf("%s%s", "unix:", dest->mig_path); QTestState *global =3D global_qtest, *from, *to; GSource *source; - gchar *cmd; + gchar *cmd, *tmp; QDict *rsp; guint8 *log; guint64 size; @@ -654,7 +674,7 @@ static void test_migrate(void) test_server_listen(s); test_server_listen(dest); =20 - cmd =3D GET_QEMU_CMDE(s, 2, "", ""); + cmd =3D get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, "", ""); from =3D qtest_start(cmd); g_free(cmd); =20 @@ -663,7 +683,9 @@ static void test_migrate(void) size =3D get_log_size(s); g_assert_cmpint(size, =3D=3D, (2 * 1024 * 1024) / (VHOST_LOG_PAGE * 8)= ); =20 - cmd =3D GET_QEMU_CMDE(dest, 2, "", " -incoming %s", uri); + tmp =3D g_strdup_printf(" -incoming %s", uri); + cmd =3D get_qemu_cmd(dest, 2, TEST_MEMFD_AUTO, root, "", tmp); + g_free(tmp); to =3D qtest_init(cmd); g_free(cmd); =20 @@ -774,7 +796,7 @@ static void test_reconnect_subprocess(void) char *cmd; =20 g_thread_new("connect", connect_thread, s); - cmd =3D GET_QEMU_CMDE(s, 2, ",server", ""); + cmd =3D get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", ""); qtest_start(cmd); g_free(cmd); =20 @@ -810,7 +832,7 @@ static void test_connect_fail_subprocess(void) =20 s->test_fail =3D true; g_thread_new("connect", connect_thread, s); - cmd =3D GET_QEMU_CMDE(s, 2, ",server", ""); + cmd =3D get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", ""); qtest_start(cmd); g_free(cmd); =20 @@ -838,7 +860,7 @@ static void test_flags_mismatch_subprocess(void) =20 s->test_flags =3D TEST_FLAGS_DISCONNECT; g_thread_new("connect", connect_thread, s); - cmd =3D GET_QEMU_CMDE(s, 2, ",server", ""); + cmd =3D get_qemu_cmd(s, 2, TEST_MEMFD_AUTO, root, ",server", ""); qtest_start(cmd); g_free(cmd); =20 @@ -906,11 +928,21 @@ static void test_multiqueue(void) s->queues =3D queues; test_server_listen(s); =20 - cmd =3D g_strdup_printf(QEMU_CMD_MEM QEMU_CMD_CHR QEMU_CMD_NETDEV ",qu= eues=3D%d " - "-device virtio-net-pci,netdev=3Dnet0,mq=3Don,ve= ctors=3D%d", - 512, 512, root, s->chr_name, - s->socket_path, "", s->chr_name, - queues, queues * 2 + 2); + if (qemu_memfd_check()) { + cmd =3D g_strdup_printf( + QEMU_CMD_MEMFD QEMU_CMD_CHR QEMU_CMD_NETDEV ",queues=3D%d " + "-device virtio-net-pci,netdev=3Dnet0,mq=3Don,vectors=3D%d", + 512, 512, s->chr_name, + s->socket_path, "", s->chr_name, + queues, queues * 2 + 2); + } else { + cmd =3D g_strdup_printf( + QEMU_CMD_MEM QEMU_CMD_CHR QEMU_CMD_NETDEV ",queues=3D%d " + "-device virtio-net-pci,netdev=3Dnet0,mq=3Don,vectors=3D%d", + 512, 512, root, s->chr_name, + s->socket_path, "", s->chr_name, + queues, queues * 2 + 2); + } qtest_start(cmd); g_free(cmd); =20 @@ -970,7 +1002,12 @@ int main(int argc, char **argv) /* run the main loop thread so the chardev may operate */ thread =3D g_thread_new(NULL, thread_function, loop); =20 - qtest_add_func("/vhost-user/read-guest-mem", read_guest_mem); + if (qemu_memfd_check()) { + qtest_add_data_func("/vhost-user/read-guest-mem/memfd", + GINT_TO_POINTER(TEST_MEMFD_YES), read_guest_me= m); + } + qtest_add_data_func("/vhost-user/read-guest-mem/memfile", + GINT_TO_POINTER(TEST_MEMFD_NO), read_guest_mem); qtest_add_func("/vhost-user/migrate", test_migrate); qtest_add_func("/vhost-user/multiqueue", test_multiqueue); =20 --=20 2.15.0.rc0.40.gaefcc5f6f