From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216114; cv=none; d=zohomail.com; s=zohoarc; b=bwev7NpTYP0LpCEcKpXvaW1qsAe2H8fxks4LNhxca7IZFvBnhrKuj31gM5AKtP3LseCr581Be+5fWDOhOxaH6YqtfveU1DEkjKTptr291t/bQtKWc0Uv2wZfp5jLFcw2AHfajXxWrqpYuRauJH+qXwRr3y+YMey0S3SAG0jhvR8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216114; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0RRZHJ9qaTOxtBmiPk4Hdrj+ORcKtQnnSAofGrYFBoQ=; b=Wj/9y7sTGnt99CwcBZPCbyMe6VM935h9KJUh+cE5EAUmnTeJWz2yLUJ4DDx9d7TbFWjmBgKkQN1Za7RNL9cYmFoH30f2qffYXaEF11HC+7b/Wenwv8h9qh3eyfS91mnjhp6Y/rysMOono7v9Fp5f4d1MMSd8n1relkJ+mNjx3Wg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216114564474.34845473224107; Mon, 8 Mar 2021 07:08:34 -0800 (PST) Received: from localhost ([::1]:46224 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHUn-0007bN-Ge for importer@patchew.org; Mon, 08 Mar 2021 10:08:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46030) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHSr-0005Tu-2S for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:06:33 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:20747) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHSp-0001Av-8a for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:06:32 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-534-Q3CddSfyPsGMUcgvPwxIiA-1; Mon, 08 Mar 2021 10:06:25 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id A4C63879A1F; Mon, 8 Mar 2021 15:06:23 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9B61A5D9D3; Mon, 8 Mar 2021 15:06:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615215989; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0RRZHJ9qaTOxtBmiPk4Hdrj+ORcKtQnnSAofGrYFBoQ=; b=JrKWceD70HmmVnq8CHroZR4jfwJ++UsQ42MplxJrfzEunXVUIrWKPdRj/4Iwif9eM/USNs N2CqHRiVFYvduZIobnhPSk3+/GOW1dM3SevWvPSOpZmh6pjb7W23ESJnUw4arRwDfnWP96 MOFp5QyNCKnUKeOW8lDCF5wAPxGO4mE= X-MC-Unique: Q3CddSfyPsGMUcgvPwxIiA-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 01/12] softmmu/physmem: Mark shared anonymous memory RAM_SHARED Date: Mon, 8 Mar 2021 16:05:49 +0100 Message-Id: <20210308150600.14440-2-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's drop the "shared" parameter from ram_block_add() and properly store it in the flags of the ram block instead, such that qemu_ram_is_shared() properly succeeds on all ram blocks that were mapped MAP_SHARED. We'll use this information next to fix some cases with shared anonymous memory. Reviewed-by: Igor Kotrasinski Reviewed-by: Richard Henderson Reviewed-by: Peter Xu Signed-off-by: David Hildenbrand --- softmmu/physmem.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 141fce79e8..62ea4abbdd 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1927,8 +1927,9 @@ static void dirty_memory_extend(ram_addr_t old_ram_si= ze, } } =20 -static void ram_block_add(RAMBlock *new_block, Error **errp, bool shared) +static void ram_block_add(RAMBlock *new_block, Error **errp) { + const bool shared =3D qemu_ram_is_shared(new_block); RAMBlock *block; RAMBlock *last_block =3D NULL; ram_addr_t old_ram_size, new_ram_size; @@ -2064,7 +2065,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Mem= oryRegion *mr, return NULL; } =20 - ram_block_add(new_block, &local_err, ram_flags & RAM_SHARED); + ram_block_add(new_block, &local_err); if (local_err) { g_free(new_block); error_propagate(errp, local_err); @@ -2127,10 +2128,13 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, = ram_addr_t max_size, if (host) { new_block->flags |=3D RAM_PREALLOC; } + if (share) { + new_block->flags |=3D RAM_SHARED; + } if (resizeable) { new_block->flags |=3D RAM_RESIZEABLE; } - ram_block_add(new_block, &local_err, share); + ram_block_add(new_block, &local_err); if (local_err) { g_free(new_block); error_propagate(errp, local_err); --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216243; cv=none; d=zohomail.com; s=zohoarc; b=B0xdo6jWF21EEquCA+yO8Q1+kKdEWWBXfRaYN1NJLvJ0ee+gNlncUhmBrUEdtHOd23rTyf/kMeFWTzeqlG2Tg9BIlhmyCw0l907blXFzRZtGvR38GWnbxt/nCJED9k5EbRF/po3wLm3CXwAia/QaCZ6XiQoeRm6BgXmg6ITPe7Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216243; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XtdIvl849NtSwhObgAWNC1HihBCNlWbPsoigE9tqXac=; b=E4FLp5DYT8x9CAJIjw9JscWfp4Z9845WVH5soBzjIJpNJAILh9U0kxUyJKG05NB3gv4SN2CUZMArzwCjI/nGWR4CBVS70eu3zfBPJROYTHB8BfohRb+4KzqKZJvMcsl5EYmmiXQqXxj/RxyCwadsDCuZoshSuieQdQYGuNBZhIs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 161521624386012.892430403425237; Mon, 8 Mar 2021 07:10:43 -0800 (PST) Received: from localhost ([::1]:54810 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHWs-0002dv-Oc for importer@patchew.org; Mon, 08 Mar 2021 10:10:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46098) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHT6-0005kn-G6 for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:06:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:42655) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHT4-0001HL-Tz for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:06:48 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-199-KLWDt_O2ON24o01P_EUM7Q-1; Mon, 08 Mar 2021 10:06:42 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id A12771966323; Mon, 8 Mar 2021 15:06:40 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id F209D5D9CD; Mon, 8 Mar 2021 15:06:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216006; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XtdIvl849NtSwhObgAWNC1HihBCNlWbPsoigE9tqXac=; b=MaIYQea3aBJRMF9gkDz1XevwCAoFT7m7AX+l4KlXH+txUgbajpQDILpzvtwiKyOmyXDTic xCUoWGz2QsjyB73sodLfuRvNx4XBc0CP3B59AfnM9keDQ5PNE25GvkYy19JRvl0SB9tb7F pTx13fcc940HMW7qH8SEivo2GpAPI3Y= X-MC-Unique: KLWDt_O2ON24o01P_EUM7Q-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 02/12] softmmu/physmem: Fix ram_block_discard_range() to handle shared anonymous memory Date: Mon, 8 Mar 2021 16:05:50 +0100 Message-Id: <20210308150600.14440-3-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" We can create shared anonymous memory via "-object memory-backend-ram,share=3Don,..." which is, for example, required by PVRDMA for mremap() to work. Shared anonymous memory is weird, though. Instead of MADV_DONTNEED, we have to use MADV_REMOVE. MADV_DONTNEED fails silently and does nothing. Fixes: 06329ccecfa0 ("mem: add share parameter to memory-backend-ram") Signed-off-by: David Hildenbrand Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu --- softmmu/physmem.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 62ea4abbdd..2ba815fec6 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -3506,6 +3506,7 @@ int ram_block_discard_range(RAMBlock *rb, uint64_t st= art, size_t length) /* The logic here is messy; * madvise DONTNEED fails for hugepages * fallocate works on hugepages and shmem + * shared anonymous memory requires madvise REMOVE */ need_madvise =3D (rb->page_size =3D=3D qemu_host_page_size); need_fallocate =3D rb->fd !=3D -1; @@ -3539,7 +3540,11 @@ int ram_block_discard_range(RAMBlock *rb, uint64_t s= tart, size_t length) * fallocate'd away). */ #if defined(CONFIG_MADVISE) - ret =3D madvise(host_startaddr, length, MADV_DONTNEED); + if (qemu_ram_is_shared(rb) && rb->fd < 0) { + ret =3D madvise(host_startaddr, length, MADV_REMOVE); + } else { + ret =3D madvise(host_startaddr, length, MADV_DONTNEED); + } if (ret) { ret =3D -errno; error_report("ram_block_discard_range: Failed to discard r= ange " --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216215; cv=none; d=zohomail.com; s=zohoarc; b=PnJTeo3HUhgt3HZb5C0YDmI+cJ0BEd5VS5eX6eTh5BpA9GNtaVcvjGKFdmQp1hsa18xW6oGgd9cTR/A9GhcQCfEv6Sd1eeb+NqZ6rRhd5zjlBjvHlcD2waRnEbzND5gV2XEComeRK93UXiZWtIobVhu51ze592ZU5T7r92TMDjY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216215; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/aG0pcc0FOFeRWr3hFrUde4Cr4zAlrIzsgtRsPw+ebc=; b=lvi6myCufbKeaFyg8ilg6orXMeSvYMxYbMpLmvdFFsUOI+0k6Zcvcfdl3GzYGVhPb7PpVScz/KfCs9HhT09hSRskxH9Ycu+/QVdh2lM/r+XblZqxMqVOoIQDH0mMc0LwULoOxnTjVJjyEAxXyjrzK10P3AxNGJS1YcxRdI+cmJM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 161521621589958.58975667755885; Mon, 8 Mar 2021 07:10:15 -0800 (PST) Received: from localhost ([::1]:53514 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHWQ-00027g-SX for importer@patchew.org; Mon, 08 Mar 2021 10:10:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46136) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHTJ-0005os-20 for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:49990) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHTB-0001Je-NW for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:00 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-324-gNXSfTH0NlqEr2FXTswGqg-1; Mon, 08 Mar 2021 10:06:47 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id EB7BE801814; Mon, 8 Mar 2021 15:06:44 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id ECBEF5D9D3; Mon, 8 Mar 2021 15:06:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216011; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/aG0pcc0FOFeRWr3hFrUde4Cr4zAlrIzsgtRsPw+ebc=; b=XtuSuuegUcrPsG/oceGsstHStxyCbyCYCl57bXrOBKBxS27UtB1IYcw+yd9O2D5/SXFd2b uuzvy/vtUGork8lFvRLi/T1ZOobx0Paj5DvVDOB4A3hqvtYdzDSbq3x7n2IYt0UpV/yK+a 6bEcnCpMZKsXHR90twP2+MBncZJ7qc4= X-MC-Unique: gNXSfTH0NlqEr2FXTswGqg-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 03/12] softmmu/physmem: Fix qemu_ram_remap() to handle shared anonymous memory Date: Mon, 8 Mar 2021 16:05:51 +0100 Message-Id: <20210308150600.14440-4-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" RAM_SHARED now also properly indicates shared anonymous memory. Let's check that flag for anonymous memory as well, to restore the proper mapping. Fixes: 06329ccecfa0 ("mem: add share parameter to memory-backend-ram") Signed-off-by: David Hildenbrand --- softmmu/physmem.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 2ba815fec6..d0a0027a16 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -2222,13 +2222,13 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t len= gth) abort(); } else { flags =3D MAP_FIXED; + flags |=3D block->flags & RAM_SHARED ? + MAP_SHARED : MAP_PRIVATE; if (block->fd >=3D 0) { - flags |=3D (block->flags & RAM_SHARED ? - MAP_SHARED : MAP_PRIVATE); area =3D mmap(vaddr, length, PROT_READ | PROT_WRITE, flags, block->fd, offset); } else { - flags |=3D MAP_PRIVATE | MAP_ANONYMOUS; + flags |=3D MAP_ANONYMOUS; area =3D mmap(vaddr, length, PROT_READ | PROT_WRITE, flags, -1, 0); } --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216364; cv=none; d=zohomail.com; s=zohoarc; b=L8AJUwmwRV7GkOcYjUsoYxwDq/I4Jf99hCnaKlxXmUNHqlpVgm0lj6U3GFQw57OZQoMbHhDiKMvUPdCLp5aqarg8sfpBHk7B1CugoZBy3H0eGKBUs+U+euxKh4++ICP4L1uvaZNM6F+6rghOrY8eaOH2MIGi7fVqxMklsMVbe1E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216364; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=W2xadBhOlctA+eFTSVDngodlBQX81CnvqOgmN6nNNlI=; b=L75R7jP3ZH+jTaPUW0cLZp5xk3bfJEKkbScJEHSw0j0jMGU802NTIOM1ugqCb6QABWNjcyBj+xpSQrGnl1idjM2dAMQ8QtovKPwtjEUyy/5flUJsNdViks/9nUj7WwK2zSG+a105mgCHCOiA4Bbo43Nu62NnPBZOsDG6IaHGo1o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216364532894.4772137360061; Mon, 8 Mar 2021 07:12:44 -0800 (PST) Received: from localhost ([::1]:34284 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHYp-0005te-8G for importer@patchew.org; Mon, 08 Mar 2021 10:12:43 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46216) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHTU-0005we-Up for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:12 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:53962) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHTT-0001OG-2q for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:12 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-198-yhhkkrVWMM6C0_vkUtMf3w-1; Mon, 08 Mar 2021 10:07:06 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 98A16804332; Mon, 8 Mar 2021 15:07:04 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 477725D9CD; Mon, 8 Mar 2021 15:06:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216028; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W2xadBhOlctA+eFTSVDngodlBQX81CnvqOgmN6nNNlI=; b=JzVNEISfoRIu6n3P9rPi70bFhBfFZyOSTpc5DdFg+mvDahmejVKOCmg3pErrjFyGBSJvAn UcLje6aVjiDfxCYxyRiKfhHdDFiiu5o//e8Jw/nu6u73YufE26onQr1hcl5eybTUvKdguG fd7ll8+LoLcFNmZ1WlM1RXBr3xY8uyM= X-MC-Unique: yhhkkrVWMM6C0_vkUtMf3w-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 04/12] util/mmap-alloc: Factor out calculation of the pagesize for the guard page Date: Mon, 8 Mar 2021 16:05:52 +0100 Message-Id: <20210308150600.14440-5-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's factor out calculating the size of the guard page and rename the variable to make it clearer that this pagesize only applies to the guard page. Reviewed-by: Peter Xu Acked-by: Murilo Opsfelder Araujo Cc: Igor Kotrasinski Signed-off-by: David Hildenbrand --- util/mmap-alloc.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index e6fa8b598b..24854064b4 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -82,6 +82,16 @@ size_t qemu_mempath_getpagesize(const char *mem_path) return qemu_real_host_page_size; } =20 +static inline size_t mmap_guard_pagesize(int fd) +{ +#if defined(__powerpc64__) && defined(__linux__) + /* Mappings in the same segment must share the same page size */ + return qemu_fd_getpagesize(fd); +#else + return qemu_real_host_page_size; +#endif +} + void *qemu_ram_mmap(int fd, size_t size, size_t align, @@ -90,12 +100,12 @@ void *qemu_ram_mmap(int fd, bool is_pmem, off_t map_offset) { + const size_t guard_pagesize =3D mmap_guard_pagesize(fd); int prot; int flags; int map_sync_flags =3D 0; int guardfd; size_t offset; - size_t pagesize; size_t total; void *guardptr; void *ptr; @@ -116,8 +126,7 @@ void *qemu_ram_mmap(int fd, * anonymous memory is OK. */ flags =3D MAP_PRIVATE; - pagesize =3D qemu_fd_getpagesize(fd); - if (fd =3D=3D -1 || pagesize =3D=3D qemu_real_host_page_size) { + if (fd =3D=3D -1 || guard_pagesize =3D=3D qemu_real_host_page_size) { guardfd =3D -1; flags |=3D MAP_ANONYMOUS; } else { @@ -126,7 +135,6 @@ void *qemu_ram_mmap(int fd, } #else guardfd =3D -1; - pagesize =3D qemu_real_host_page_size; flags =3D MAP_PRIVATE | MAP_ANONYMOUS; #endif =20 @@ -138,7 +146,7 @@ void *qemu_ram_mmap(int fd, =20 assert(is_power_of_2(align)); /* Always align to host page size */ - assert(align >=3D pagesize); + assert(align >=3D guard_pagesize); =20 flags =3D MAP_FIXED; flags |=3D fd =3D=3D -1 ? MAP_ANONYMOUS : 0; @@ -193,8 +201,8 @@ void *qemu_ram_mmap(int fd, * a guard page guarding against potential buffer overflows. */ total -=3D offset; - if (total > size + pagesize) { - munmap(ptr + size + pagesize, total - size - pagesize); + if (total > size + guard_pagesize) { + munmap(ptr + size + guard_pagesize, total - size - guard_pagesize); } =20 return ptr; @@ -202,15 +210,8 @@ void *qemu_ram_mmap(int fd, =20 void qemu_ram_munmap(int fd, void *ptr, size_t size) { - size_t pagesize; - if (ptr) { /* Unmap both the RAM block and the guard page */ -#if defined(__powerpc64__) && defined(__linux__) - pagesize =3D qemu_fd_getpagesize(fd); -#else - pagesize =3D qemu_real_host_page_size; -#endif - munmap(ptr, size + pagesize); + munmap(ptr, size + mmap_guard_pagesize(fd)); } } --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216131; cv=none; d=zohomail.com; s=zohoarc; b=mzHcWtbAuHHb17Vu1MXBxcKP2Z2CVXd52d+NlCjz2aHs63cxHIzGsIkdovtpG9KYFsGcwRVSS7Ln6LDqXz9q/9wVVCGBB3n/pqp5NKLlE/w0U1Idg+thbua9s+vMzam2jrHrdg8E182Lzh/FuaeDQ0kd89rY2tg277Okc9uPS0A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216131; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IcSEGod7KTi/JjEkRbArfe4hY+fUndoBU72cDZ+8n6E=; b=LuNYgmT1Z+m62s3/hrpRpw4YdjY7rZgu8BSUuiicKzRNXHccsLvcua328WrnBR4afmuaCoh97ye7lPcoGshwKKtsF9NK+pFBPrV2I8uKnfJ8VfgNjslbQHZWGIxlNUjV6K5gegu40etzhN7PwoA/TQPxCkKZ5g3jw0hii/cbhGc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216131782159.1288733120565; Mon, 8 Mar 2021 07:08:51 -0800 (PST) Received: from localhost ([::1]:46758 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHV4-0007qe-CH for importer@patchew.org; Mon, 08 Mar 2021 10:08:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46274) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHTk-0006Bd-3C for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:28 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:27283) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHTi-0001US-Bf for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:27 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-234-NZrrJDi-MUemDr_Qg4UD5A-1; Mon, 08 Mar 2021 10:07:24 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 797D61966321; Mon, 8 Mar 2021 15:07:22 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id ED8165D9CD; Mon, 8 Mar 2021 15:07:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216045; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IcSEGod7KTi/JjEkRbArfe4hY+fUndoBU72cDZ+8n6E=; b=aRxYtRux0gez0+beaWbBU6piGFz0WIXLiHHNJuu102/10wRMv/Xg+kiwCe2d4g5uSR/xTx CdtBl3cR+1LrFfGHxJS1feT6n6JIJt8hdnxo6WfTvaY0LpiEqsT7It4FPJpIV3QsVJkGzs 6FOpiqj+JS7ugpXx2CPKm8qMHYfZ0Jo= X-MC-Unique: NZrrJDi-MUemDr_Qg4UD5A-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 05/12] util/mmap-alloc: Factor out reserving of a memory region to mmap_reserve() Date: Mon, 8 Mar 2021 16:05:53 +0100 Message-Id: <20210308150600.14440-6-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" We want to reserve a memory region without actually populating memory. Let's factor that out. Reviewed-by: Igor Kotrasinski Acked-by: Murilo Opsfelder Araujo Reviewed-by: Richard Henderson Reviewed-by: Peter Xu Signed-off-by: David Hildenbrand --- util/mmap-alloc.c | 58 +++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index 24854064b4..223d66219c 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -82,6 +82,38 @@ size_t qemu_mempath_getpagesize(const char *mem_path) return qemu_real_host_page_size; } =20 +/* + * Reserve a new memory region of the requested size to be used for mapping + * from the given fd (if any). + */ +static void *mmap_reserve(size_t size, int fd) +{ + int flags =3D MAP_PRIVATE; + +#if defined(__powerpc64__) && defined(__linux__) + /* + * On ppc64 mappings in the same segment (aka slice) must share the sa= me + * page size. Since we will be re-allocating part of this segment + * from the supplied fd, we should make sure to use the same page size= , to + * this end we mmap the supplied fd. In this case, set MAP_NORESERVE = to + * avoid allocating backing store memory. + * We do this unless we are using the system page size, in which case + * anonymous memory is OK. + */ + if (fd =3D=3D -1 || qemu_fd_getpagesize(fd) =3D=3D qemu_real_host_page= _size) { + fd =3D -1; + flags |=3D MAP_ANONYMOUS; + } else { + flags |=3D MAP_NORESERVE; + } +#else + fd =3D -1; + flags |=3D MAP_ANONYMOUS; +#endif + + return mmap(0, size, PROT_NONE, flags, fd, 0); +} + static inline size_t mmap_guard_pagesize(int fd) { #if defined(__powerpc64__) && defined(__linux__) @@ -104,7 +136,6 @@ void *qemu_ram_mmap(int fd, int prot; int flags; int map_sync_flags =3D 0; - int guardfd; size_t offset; size_t total; void *guardptr; @@ -116,30 +147,7 @@ void *qemu_ram_mmap(int fd, */ total =3D size + align; =20 -#if defined(__powerpc64__) && defined(__linux__) - /* On ppc64 mappings in the same segment (aka slice) must share the sa= me - * page size. Since we will be re-allocating part of this segment - * from the supplied fd, we should make sure to use the same page size= , to - * this end we mmap the supplied fd. In this case, set MAP_NORESERVE = to - * avoid allocating backing store memory. - * We do this unless we are using the system page size, in which case - * anonymous memory is OK. - */ - flags =3D MAP_PRIVATE; - if (fd =3D=3D -1 || guard_pagesize =3D=3D qemu_real_host_page_size) { - guardfd =3D -1; - flags |=3D MAP_ANONYMOUS; - } else { - guardfd =3D fd; - flags |=3D MAP_NORESERVE; - } -#else - guardfd =3D -1; - flags =3D MAP_PRIVATE | MAP_ANONYMOUS; -#endif - - guardptr =3D mmap(0, total, PROT_NONE, flags, guardfd, 0); - + guardptr =3D mmap_reserve(total, fd); if (guardptr =3D=3D MAP_FAILED) { return MAP_FAILED; } --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216169; cv=none; d=zohomail.com; s=zohoarc; b=JW71hzbtWsfkTuo5ksc3HcDuZIsB0QAfoCz4PiORBYcaR4LkpX/HjmCwdXwJ2Tnb/afU5zHUveP+nHlyNWUPBHFyOnLNhalhA/4AME0JbhisLcMf7Xgo1QclUwHhawopjJf7DDSBCLOrpD5ds3iBnG/0owuV/AU9FL9l4nfjEoo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216169; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GsJdXZ454wExRLL3qh5UOajAHhl4JEsG4lRkdymGX2Q=; b=THaM61NaMDjcsbCDHX3WmoFX0pqrhYp+u9xPFro/ZrsBdVfJkKn21z9jedUXbXptlewLWSZTtNCYomuLjpV5nEPxHZskw4YzXIPFLn9sswOIfP2EaH1r1F4RbpZQkNhQj85EwusItBxukXv+aoiXrI+LYRAGXpgnxDQjYiKlO6Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216169369303.13741847368897; Mon, 8 Mar 2021 07:09:29 -0800 (PST) Received: from localhost ([::1]:49742 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHVe-0000bn-3B for importer@patchew.org; Mon, 08 Mar 2021 10:09:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46286) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHTo-0006KH-Kg for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:58406) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHTm-0001WH-R0 for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:32 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-588-HuG_uEOiNMSNG4VXzS07MQ-1; Mon, 08 Mar 2021 10:07:28 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id C3A11760C1; Mon, 8 Mar 2021 15:07:26 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id C6E105D9CD; Mon, 8 Mar 2021 15:07:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216050; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GsJdXZ454wExRLL3qh5UOajAHhl4JEsG4lRkdymGX2Q=; b=eG/W+tonrD0UqWWX2cMwffufoEAn/b213cp9PaaDtkVYPyoAgGjEtCjyVZJKgOTeXH2Xhq KNWgIq+bAvl3r92FtDt5a5oRmd6dpSnFJNnTZ57UgCahftMdCn+TDFSefwyjbkerEx3/Jt t2o+kZY9TPbm9zSCHk7kLHjJz1Zk0NY= X-MC-Unique: HuG_uEOiNMSNG4VXzS07MQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 06/12] util/mmap-alloc: Factor out activating of memory to mmap_activate() Date: Mon, 8 Mar 2021 16:05:54 +0100 Message-Id: <20210308150600.14440-7-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" We want to activate memory within a reserved memory region, to make it accessible. Let's factor that out. Reviewed-by: Richard Henderson Acked-by: Murilo Opsfelder Araujo Reviewed-by: Peter Xu Signed-off-by: David Hildenbrand --- util/mmap-alloc.c | 94 +++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index 223d66219c..0e2bd7bc0e 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -114,6 +114,52 @@ static void *mmap_reserve(size_t size, int fd) return mmap(0, size, PROT_NONE, flags, fd, 0); } =20 +/* + * Activate memory in a reserved region from the given fd (if any), to make + * it accessible. + */ +static void *mmap_activate(void *ptr, size_t size, int fd, bool readonly, + bool shared, bool is_pmem, off_t map_offset) +{ + const int prot =3D PROT_READ | (readonly ? 0 : PROT_WRITE); + int map_sync_flags =3D 0; + int flags =3D MAP_FIXED; + void *activated_ptr; + + flags |=3D fd =3D=3D -1 ? MAP_ANONYMOUS : 0; + flags |=3D shared ? MAP_SHARED : MAP_PRIVATE; + if (shared && is_pmem) { + map_sync_flags =3D MAP_SYNC | MAP_SHARED_VALIDATE; + } + + activated_ptr =3D mmap(ptr, size, prot, flags | map_sync_flags, fd, + map_offset); + if (activated_ptr =3D=3D MAP_FAILED && map_sync_flags) { + if (errno =3D=3D ENOTSUP) { + char *proc_link =3D g_strdup_printf("/proc/self/fd/%d", fd); + char *file_name =3D g_malloc0(PATH_MAX); + int len =3D readlink(proc_link, file_name, PATH_MAX - 1); + + if (len < 0) { + len =3D 0; + } + file_name[len] =3D '\0'; + fprintf(stderr, "Warning: requesting persistence across crashe= s " + "for backend file %s failed. Proceeding without " + "persistence, data might become corrupted in case of h= ost " + "crash.\n", file_name); + g_free(proc_link); + g_free(file_name); + } + /* + * If mmap failed with MAP_SHARED_VALIDATE | MAP_SYNC, we will try + * again without these flags to handle backwards compatibility. + */ + activated_ptr =3D mmap(ptr, size, prot, flags, fd, map_offset); + } + return activated_ptr; +} + static inline size_t mmap_guard_pagesize(int fd) { #if defined(__powerpc64__) && defined(__linux__) @@ -133,13 +179,8 @@ void *qemu_ram_mmap(int fd, off_t map_offset) { const size_t guard_pagesize =3D mmap_guard_pagesize(fd); - int prot; - int flags; - int map_sync_flags =3D 0; - size_t offset; - size_t total; - void *guardptr; - void *ptr; + size_t offset, total; + void *ptr, *guardptr; =20 /* * Note: this always allocates at least one extra page of virtual addr= ess @@ -156,45 +197,10 @@ void *qemu_ram_mmap(int fd, /* Always align to host page size */ assert(align >=3D guard_pagesize); =20 - flags =3D MAP_FIXED; - flags |=3D fd =3D=3D -1 ? MAP_ANONYMOUS : 0; - flags |=3D shared ? MAP_SHARED : MAP_PRIVATE; - if (shared && is_pmem) { - map_sync_flags =3D MAP_SYNC | MAP_SHARED_VALIDATE; - } - offset =3D QEMU_ALIGN_UP((uintptr_t)guardptr, align) - (uintptr_t)guar= dptr; =20 - prot =3D PROT_READ | (readonly ? 0 : PROT_WRITE); - - ptr =3D mmap(guardptr + offset, size, prot, - flags | map_sync_flags, fd, map_offset); - - if (ptr =3D=3D MAP_FAILED && map_sync_flags) { - if (errno =3D=3D ENOTSUP) { - char *proc_link, *file_name; - int len; - proc_link =3D g_strdup_printf("/proc/self/fd/%d", fd); - file_name =3D g_malloc0(PATH_MAX); - len =3D readlink(proc_link, file_name, PATH_MAX - 1); - if (len < 0) { - len =3D 0; - } - file_name[len] =3D '\0'; - fprintf(stderr, "Warning: requesting persistence across crashe= s " - "for backend file %s failed. Proceeding without " - "persistence, data might become corrupted in case of h= ost " - "crash.\n", file_name); - g_free(proc_link); - g_free(file_name); - } - /* - * if map failed with MAP_SHARED_VALIDATE | MAP_SYNC, - * we will remove these flags to handle compatibility. - */ - ptr =3D mmap(guardptr + offset, size, prot, flags, fd, map_offset); - } - + ptr =3D mmap_activate(guardptr + offset, size, fd, readonly, shared, i= s_pmem, + map_offset); if (ptr =3D=3D MAP_FAILED) { munmap(guardptr, total); return MAP_FAILED; --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216488; cv=none; d=zohomail.com; s=zohoarc; b=Leu7N5bPjYcBITTv3InJAhy9YzFhrOtFEPad1Dw+EEIfL+SJ8ElajCtgua79bQHzUT3OxU82N/3AAXSsO7ctkSrgpcAUYfgO7rvOIobp6zzYHNJTZVKXfIQNBCL1VNCmBsONluF7iCAhX5XfzOiChVvlEvioXidtBdXYP2HxQgM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216488; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=vAShob+LcPwPvHLqKh2sCgg9eZjpciYxGAdUukXAgcY=; b=DfFZIp7Bon6anSWQLRVXUk412tIpBE4CTkSBL7WK2yAWHfnYcWDbuPbQsrku4uVuRRQv4jdRPsuYFozyRJktVO6sBAuW3GmnjG+0BWJZzGbpsHpP6UQboEcOMT8nMKRuifzcNHRBOAUeCk9FcX5WNYAtS43tC9mbwLerp+KEic0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216488457265.6918558921152; Mon, 8 Mar 2021 07:14:48 -0800 (PST) Received: from localhost ([::1]:40284 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHap-0008LK-74 for importer@patchew.org; Mon, 08 Mar 2021 10:14:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46348) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUA-0006ep-Ns for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:54 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:56197) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHU4-0001ca-0r for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:54 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-568-cgZG7dHkMAS--KmUbzpUow-1; Mon, 08 Mar 2021 10:07:45 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id DF26E881286; Mon, 8 Mar 2021 15:07:43 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1C0D25D9CD; Mon, 8 Mar 2021 15:07:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216067; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vAShob+LcPwPvHLqKh2sCgg9eZjpciYxGAdUukXAgcY=; b=XhROgj2mrFZP9kvACRHZ/KAvWD7nYV4lJXGkcYzdKt2I6nrh+ECx4d3TqYu46wpo80cLSO /SSR7wHAqb0A+SMSFb6ZYleDEFtofB27t9hZD4DrO7f9fOkfL4YEmz/Sv5CdxlRGxKwk3Q CIsYrFPMlB0XBhx9b+bl5dNhe2VlDKs= X-MC-Unique: cgZG7dHkMAS--KmUbzpUow-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 07/12] softmmu/memory: Pass ram_flags into qemu_ram_alloc_from_fd() Date: Mon, 8 Mar 2021 16:05:55 +0100 Message-Id: <20210308150600.14440-8-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's pass in ram flags just like we do with qemu_ram_alloc_from_file(), to clean up and prepare for more flags. Simplify the documentation of passed ram flags: Looking at our documentation of RAM_SHARED and RAM_PMEM is sufficient, no need to be repetitive. Reviewed-by: Peter Xu Signed-off-by: David Hildenbrand --- backends/hostmem-memfd.c | 7 ++++--- hw/misc/ivshmem.c | 5 ++--- include/exec/memory.h | 9 +++------ include/exec/ram_addr.h | 6 +----- softmmu/memory.c | 7 +++---- 5 files changed, 13 insertions(+), 21 deletions(-) diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index 69b0ae30bb..93b5d1a4cf 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -36,6 +36,7 @@ static void memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { HostMemoryBackendMemfd *m =3D MEMORY_BACKEND_MEMFD(backend); + uint32_t ram_flags; char *name; int fd; =20 @@ -53,9 +54,9 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Er= ror **errp) } =20 name =3D host_memory_backend_get_name(backend); - memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), - name, backend->size, - backend->share, fd, 0, errp); + ram_flags =3D backend->share ? RAM_SHARED : 0; + memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, + backend->size, ram_flags, fd, 0, errp); g_free(name); } =20 diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index 603e992a7f..730669dfc5 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -494,9 +494,8 @@ static void process_msg_shmem(IVShmemState *s, int fd, = Error **errp) size =3D buf.st_size; =20 /* mmap the region and map into the BAR2 */ - memory_region_init_ram_from_fd(&s->server_bar2, OBJECT(s), - "ivshmem.bar2", size, true, fd, 0, - &local_err); + memory_region_init_ram_from_fd(&s->server_bar2, OBJECT(s), "ivshmem.ba= r2", + size, RAM_SHARED, fd, 0, &local_err); if (local_err) { error_propagate(errp, local_err); return; diff --git a/include/exec/memory.h b/include/exec/memory.h index c6fb714e49..14004de685 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -967,10 +967,7 @@ void memory_region_init_resizeable_ram(MemoryRegion *m= r, * @size: size of the region. * @align: alignment of the region base address; if 0, the default alignme= nt * (getpagesize()) will be used. - * @ram_flags: Memory region features: - * - RAM_SHARED: memory must be mmaped with the MAP_SHARED flag - * - RAM_PMEM: the memory is persistent memory - * Other bits are ignored now. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. * @path: the path in which to allocate the RAM. * @readonly: true to open @path for reading, false for read/write. * @errp: pointer to Error*, to store an error if it happens. @@ -996,7 +993,7 @@ void memory_region_init_ram_from_file(MemoryRegion *mr, * @owner: the object that tracks the region's reference count * @name: the name of the region. * @size: size of the region. - * @share: %true if memory must be mmaped with the MAP_SHARED flag + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. * @fd: the fd to mmap. * @offset: offset within the file referenced by fd * @errp: pointer to Error*, to store an error if it happens. @@ -1008,7 +1005,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr, struct Object *owner, const char *name, uint64_t size, - bool share, + uint32_t ram_flags, int fd, ram_addr_t offset, Error **errp); diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index 3cb9791df3..a7e3378340 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -104,11 +104,7 @@ long qemu_maxrampagesize(void); * Parameters: * @size: the size in bytes of the ram block * @mr: the memory region where the ram block is - * @ram_flags: specify the properties of the ram block, which can be one - * or bit-or of following values - * - RAM_SHARED: mmap the backing file or device with MAP_SHA= RED - * - RAM_PMEM: the backend @mem_path or @fd is persistent mem= ory - * Other bits are ignored. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. * @mem_path or @fd: specify the backing file or device * @readonly: true to open @path for reading, false for read/write. * @errp: pointer to Error*, to store an error if it happens diff --git a/softmmu/memory.c b/softmmu/memory.c index 874a8fccde..9f67c6c23c 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -1610,7 +1610,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr, struct Object *owner, const char *name, uint64_t size, - bool share, + uint32_t ram_flags, int fd, ram_addr_t offset, Error **errp) @@ -1620,9 +1620,8 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr, mr->ram =3D true; mr->terminates =3D true; mr->destructor =3D memory_region_destructor_ram; - mr->ram_block =3D qemu_ram_alloc_from_fd(size, mr, - share ? RAM_SHARED : 0, - fd, offset, false, &err); + mr->ram_block =3D qemu_ram_alloc_from_fd(size, mr, ram_flags, fd, offs= et, + false, &err); if (err) { mr->size =3D int128_zero(); object_unparent(OBJECT(mr)); --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216638; cv=none; d=zohomail.com; s=zohoarc; b=M8wUvq3ylOtGCB7ZEgIop5ylBpnqjmy2ra71vB/L4kC3rX8KPr92jNiRQtycFcszrN97JkqF8Wbo2fi4YDsMFBcl+lxd4vQYVyGgTGyVlSIhQ2wtzBJa1BCp7lqyEfWw6MTdY1CTdmlBq1QpatKGWxKhj4fV7GP/+g+I7KQFDMc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216638; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8zlV7fTe872MYlpsf2ZZoybQkf1OnxU2OPFpGQZDPBw=; b=deZs9U23o4tR4lureElBgd/eWoytqS+AJ2FillIjRIk5VWBYncrDvfDThgw06zbN3wV7WEckTmpy0iUlgUtcYUHBpgcD5WFufblVcXP2aGAazuecEseCjQp5du5nJwdjX1aRPSnSRdfeMF1ydQ3tyvDzBOYsX2CP2Hud1LHHgmA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216638647167.3176585974752; Mon, 8 Mar 2021 07:17:18 -0800 (PST) Received: from localhost ([::1]:44528 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHdF-0001ti-9x for importer@patchew.org; Mon, 08 Mar 2021 10:17:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46362) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUC-0006ke-Qp for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:56 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:47627) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHUA-0001f2-Ed for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:07:56 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-306-9TqmPDhiMAu3Wz8c8-uiOw-1; Mon, 08 Mar 2021 10:07:50 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 546E11084D6F; Mon, 8 Mar 2021 15:07:48 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 391AA5D9CD; Mon, 8 Mar 2021 15:07:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216071; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8zlV7fTe872MYlpsf2ZZoybQkf1OnxU2OPFpGQZDPBw=; b=Qf60PS6F7YCwNfp1WjLRWz40+Q4aRgq9qbhwMyVAtm5SXCKl0HV2yWuVIEmuxJxTGjojak +IqRYajdWxzxhHV02Vy9sm0vUjlcKtuUy+6UrNFHaoMaDPJ1ZROUil6zAmSh/qI4KxoFcP w04HcSYu7HQTfGdQJkI5ri0PY4wWdBM= X-MC-Unique: 9TqmPDhiMAu3Wz8c8-uiOw-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 08/12] softmmu/memory: Pass ram_flags into memory_region_init_ram_shared_nomigrate() Date: Mon, 8 Mar 2021 16:05:56 +0100 Message-Id: <20210308150600.14440-9-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's forward ram_flags instead, renaming memory_region_init_ram_shared_nomigrate() into memory_region_init_ram_flags_nomigrate(). Forward flags to qemu_ram_alloc() and qemu_ram_alloc_internal(). Reviewed-by: Peter Xu Signed-off-by: David Hildenbrand --- backends/hostmem-ram.c | 6 +++-- hw/m68k/next-cube.c | 4 ++-- include/exec/memory.h | 24 +++++++++---------- include/exec/ram_addr.h | 2 +- .../memory-region-housekeeping.cocci | 8 +++---- softmmu/memory.c | 20 ++++++++-------- softmmu/physmem.c | 24 ++++++++----------- 7 files changed, 43 insertions(+), 45 deletions(-) diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c index 5cc53e76c9..741e701062 100644 --- a/backends/hostmem-ram.c +++ b/backends/hostmem-ram.c @@ -19,6 +19,7 @@ static void ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { + uint32_t ram_flags; char *name; =20 if (!backend->size) { @@ -27,8 +28,9 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Erro= r **errp) } =20 name =3D host_memory_backend_get_name(backend); - memory_region_init_ram_shared_nomigrate(&backend->mr, OBJECT(backend),= name, - backend->size, backend->share, errp); + ram_flags =3D backend->share ? RAM_SHARED : 0; + memory_region_init_ram_flags_nomigrate(&backend->mr, OBJECT(backend), = name, + backend->size, ram_flags, errp); g_free(name); } =20 diff --git a/hw/m68k/next-cube.c b/hw/m68k/next-cube.c index 92b45d760f..59ccae0d5e 100644 --- a/hw/m68k/next-cube.c +++ b/hw/m68k/next-cube.c @@ -986,8 +986,8 @@ static void next_cube_init(MachineState *machine) sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02100000); =20 /* BMAP memory */ - memory_region_init_ram_shared_nomigrate(bmapm1, NULL, "next.bmapmem", = 64, - true, &error_fatal); + memory_region_init_ram_flags_nomigrate(bmapm1, NULL, "next.bmapmem", 6= 4, + RAM_SHARED, &error_fatal); memory_region_add_subregion(sysmem, 0x020c0000, bmapm1); /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */ memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 6= 4); diff --git a/include/exec/memory.h b/include/exec/memory.h index 14004de685..2d97bdf59c 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -904,27 +904,27 @@ void memory_region_init_ram_nomigrate(MemoryRegion *m= r, Error **errp); =20 /** - * memory_region_init_ram_shared_nomigrate: Initialize RAM memory region. - * Accesses into the region will - * modify memory directly. + * memory_region_init_ram_flags_nomigrate: Initialize RAM memory region. + * Accesses into the region will + * modify memory directly. * * @mr: the #MemoryRegion to be initialized. * @owner: the object that tracks the region's reference count * @name: Region name, becomes part of RAMBlock name used in migration str= eam * must be unique within any device * @size: size of the region. - * @share: allow remapping RAM to different addresses + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED. * @errp: pointer to Error*, to store an error if it happens. * - * Note that this function is similar to memory_region_init_ram_nomigrate. - * The only difference is part of the RAM region can be remapped. + * Note that this function does not do anything to cause the data in the + * RAM memory region to be migrated; that is the responsibility of the cal= ler. */ -void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr, - struct Object *owner, - const char *name, - uint64_t size, - bool share, - Error **errp); +void memory_region_init_ram_flags_nomigrate(MemoryRegion *mr, + struct Object *owner, + const char *name, + uint64_t size, + uint32_t ram_flags, + Error **errp); =20 /** * memory_region_init_resizeable_ram: Initialize memory region with resiz= eable diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index a7e3378340..6d4513f8e2 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -122,7 +122,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Memor= yRegion *mr, =20 RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, MemoryRegion *mr, Error **errp); -RAMBlock *qemu_ram_alloc(ram_addr_t size, bool share, MemoryRegion *mr, +RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags, MemoryRegion= *mr, Error **errp); RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t max_size, void (*resized)(const char*, diff --git a/scripts/coccinelle/memory-region-housekeeping.cocci b/scripts/= coccinelle/memory-region-housekeeping.cocci index c768d8140a..29651ebde9 100644 --- a/scripts/coccinelle/memory-region-housekeeping.cocci +++ b/scripts/coccinelle/memory-region-housekeeping.cocci @@ -127,8 +127,8 @@ static void device_fn(DeviceState *dev, ...) - memory_region_init_rom(E1, NULL, E2, E3, E4); + memory_region_init_rom(E1, obj, E2, E3, E4); | -- memory_region_init_ram_shared_nomigrate(E1, NULL, E2, E3, E4, E5); -+ memory_region_init_ram_shared_nomigrate(E1, obj, E2, E3, E4, E5); +- memory_region_init_ram_flags_nomigrate(E1, NULL, E2, E3, E4, E5); ++ memory_region_init_ram_flags_nomigrate(E1, obj, E2, E3, E4, E5); ) ...+> } @@ -152,8 +152,8 @@ static void device_fn(DeviceState *dev, ...) - memory_region_init_rom(E1, NULL, E2, E3, E4); + memory_region_init_rom(E1, OBJECT(dev), E2, E3, E4); | -- memory_region_init_ram_shared_nomigrate(E1, NULL, E2, E3, E4, E5); -+ memory_region_init_ram_shared_nomigrate(E1, OBJECT(dev), E2, E3, E4, E5); +- memory_region_init_ram_flags_nomigrate(E1, NULL, E2, E3, E4, E5); ++ memory_region_init_ram_flags_nomigrate(E1, OBJECT(dev), E2, E3, E4, E5); ) ...+> } diff --git a/softmmu/memory.c b/softmmu/memory.c index 9f67c6c23c..03bf13a5e7 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -1532,22 +1532,22 @@ void memory_region_init_ram_nomigrate(MemoryRegion = *mr, uint64_t size, Error **errp) { - memory_region_init_ram_shared_nomigrate(mr, owner, name, size, false, = errp); + memory_region_init_ram_flags_nomigrate(mr, owner, name, size, 0, errp); } =20 -void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr, - Object *owner, - const char *name, - uint64_t size, - bool share, - Error **errp) +void memory_region_init_ram_flags_nomigrate(MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size, + uint32_t ram_flags, + Error **errp) { Error *err =3D NULL; memory_region_init(mr, owner, name, size); mr->ram =3D true; mr->terminates =3D true; mr->destructor =3D memory_region_destructor_ram; - mr->ram_block =3D qemu_ram_alloc(size, share, mr, &err); + mr->ram_block =3D qemu_ram_alloc(size, ram_flags, mr, &err); if (err) { mr->size =3D int128_zero(); object_unparent(OBJECT(mr)); @@ -1683,7 +1683,7 @@ void memory_region_init_rom_nomigrate(MemoryRegion *m= r, uint64_t size, Error **errp) { - memory_region_init_ram_shared_nomigrate(mr, owner, name, size, false, = errp); + memory_region_init_ram_flags_nomigrate(mr, owner, name, size, 0, errp); mr->readonly =3D true; } =20 @@ -1703,7 +1703,7 @@ void memory_region_init_rom_device_nomigrate(MemoryRe= gion *mr, mr->terminates =3D true; mr->rom_device =3D true; mr->destructor =3D memory_region_destructor_ram; - mr->ram_block =3D qemu_ram_alloc(size, false, mr, &err); + mr->ram_block =3D qemu_ram_alloc(size, 0, mr, &err); if (err) { mr->size =3D int128_zero(); object_unparent(OBJECT(mr)); diff --git a/softmmu/physmem.c b/softmmu/physmem.c index d0a0027a16..8f90cb4cd2 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -2108,12 +2108,14 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, = ram_addr_t max_size, void (*resized)(const char*, uint64_t length, void *host), - void *host, bool resizeable, bool share, + void *host, uint32_t ram_flags, MemoryRegion *mr, Error **errp) { RAMBlock *new_block; Error *local_err =3D NULL; =20 + assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE)) =3D=3D 0); + size =3D HOST_PAGE_ALIGN(size); max_size =3D HOST_PAGE_ALIGN(max_size); new_block =3D g_malloc0(sizeof(*new_block)); @@ -2125,15 +2127,10 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, = ram_addr_t max_size, new_block->fd =3D -1; new_block->page_size =3D qemu_real_host_page_size; new_block->host =3D host; + new_block->flags =3D ram_flags; if (host) { new_block->flags |=3D RAM_PREALLOC; } - if (share) { - new_block->flags |=3D RAM_SHARED; - } - if (resizeable) { - new_block->flags |=3D RAM_RESIZEABLE; - } ram_block_add(new_block, &local_err); if (local_err) { g_free(new_block); @@ -2146,15 +2143,14 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, = ram_addr_t max_size, RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, MemoryRegion *mr, Error **errp) { - return qemu_ram_alloc_internal(size, size, NULL, host, false, - false, mr, errp); + return qemu_ram_alloc_internal(size, size, NULL, host, 0, mr, errp); } =20 -RAMBlock *qemu_ram_alloc(ram_addr_t size, bool share, +RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags, MemoryRegion *mr, Error **errp) { - return qemu_ram_alloc_internal(size, size, NULL, NULL, false, - share, mr, errp); + assert((ram_flags & ~RAM_SHARED) =3D=3D 0); + return qemu_ram_alloc_internal(size, size, NULL, NULL, ram_flags, mr, = errp); } =20 RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t maxsz, @@ -2163,8 +2159,8 @@ RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, = ram_addr_t maxsz, void *host), MemoryRegion *mr, Error **errp) { - return qemu_ram_alloc_internal(size, maxsz, resized, NULL, true, - false, mr, errp); + return qemu_ram_alloc_internal(size, maxsz, resized, NULL, + RAM_RESIZEABLE, mr, errp); } =20 static void reclaim_ramblock(RAMBlock *block) --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216746; cv=none; d=zohomail.com; s=zohoarc; b=Yttu/fQ4mjfSlhOIpYS1OYNqgLvtvRauo4NJkUr39Zz3SVYbiNOi91bIMe4Jjk38xDlbpYISZo1uhvTcywNv/z2MXWlQkAZfqdknrEgOcMup85yermXssATjcuNil2g+NlULrNViK2iIHi3DVQt6p9+gkcfs/XiTb10TijBQQFg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216746; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0bNxAjoblhVsFa7Cr7BGJOrI3UqBRI900v9WI//iqpQ=; b=VA2NzxfbhUP/b6iBz1NBTgCrXFtOJYjjcJq26w8SMEYUfJuDIEMvVfS3MzT7g5SDbSl7UOpEvbdgtRR9ezsMJOWQIQ+rIdaMJN268kq6W8D9earXpZVI+EeARqnothQb2Gp6XPaGW2TOC2fwfEOU9vxafFly0RpxkaCuhhLu22k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216746708600.4043871729695; Mon, 8 Mar 2021 07:19:06 -0800 (PST) Received: from localhost ([::1]:48982 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHez-0003md-Uf for importer@patchew.org; Mon, 08 Mar 2021 10:19:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46408) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUR-0007Ob-Nv for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:11 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:34649) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHUP-0001lQ-OX for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:11 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-344-gAyWJPViPb-THNzsfaIJXQ-1; Mon, 08 Mar 2021 10:08:07 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id BD079101962A; Mon, 8 Mar 2021 15:08:05 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id A25945D9D3; Mon, 8 Mar 2021 15:07:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216089; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0bNxAjoblhVsFa7Cr7BGJOrI3UqBRI900v9WI//iqpQ=; b=ft68lsTy7tANFZkRPR8Q5qu9CL2O3CoQnHq2Z8Mw96Wtj+f+m9USvqDXnv04mrs17qhdUy eMPaxQHJ3ta3XcSQiXPM2r/MmOpS1gE4fJpq2rqM3IJTSZpG86ImqthYSCT3KIfbTqNJsc xw2xy8RS+EN0+dbrs4DmZeg4grHXuAY= X-MC-Unique: gAyWJPViPb-THNzsfaIJXQ-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 09/12] util/mmap-alloc: Pass flags instead of separate bools to qemu_ram_mmap() Date: Mon, 8 Mar 2021 16:05:57 +0100 Message-Id: <20210308150600.14440-10-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's introduce a new set of flags that abstract mmap logic and replace our current set of bools, to prepare for another flag. Signed-off-by: David Hildenbrand --- include/qemu/mmap-alloc.h | 17 +++++++++++------ softmmu/physmem.c | 8 +++++--- util/mmap-alloc.c | 14 +++++++------- util/oslib-posix.c | 3 ++- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h index 456ff87df1..55664ea9f3 100644 --- a/include/qemu/mmap-alloc.h +++ b/include/qemu/mmap-alloc.h @@ -6,6 +6,15 @@ size_t qemu_fd_getpagesize(int fd); =20 size_t qemu_mempath_getpagesize(const char *mem_path); =20 +/* Map PROT_READ instead of PROT_READ|PROT_WRITE. */ +#define QEMU_RAM_MMAP_READONLY (1 << 0) + +/* Map MAP_SHARED instead of MAP_PRIVATE. */ +#define QEMU_RAM_MMAP_SHARED (1 << 1) + +/* Map MAP_SYNC|MAP_SHARED_VALIDATE if possible, fallback and warn otherwi= se. */ +#define QEMU_RAM_MMAP_PMEM (1 << 2) + /** * qemu_ram_mmap: mmap the specified file or device. * @@ -14,9 +23,7 @@ size_t qemu_mempath_getpagesize(const char *mem_path); * @size: the number of bytes to be mmaped * @align: if not zero, specify the alignment of the starting mapping add= ress; * otherwise, the alignment in use will be determined by QEMU. - * @readonly: true for a read-only mapping, false for read/write. - * @shared: map has RAM_SHARED flag. - * @is_pmem: map has RAM_PMEM flag. + * @mmap_flags: QEMU_RAM_MMAP_* flags * @map_offset: map starts at offset of map_offset from the start of fd * * Return: @@ -26,9 +33,7 @@ size_t qemu_mempath_getpagesize(const char *mem_path); void *qemu_ram_mmap(int fd, size_t size, size_t align, - bool readonly, - bool shared, - bool is_pmem, + uint32_t mmap_flags, off_t map_offset); =20 void qemu_ram_munmap(int fd, void *ptr, size_t size); diff --git a/softmmu/physmem.c b/softmmu/physmem.c index 8f90cb4cd2..ec7a382ccd 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1533,6 +1533,7 @@ static void *file_ram_alloc(RAMBlock *block, off_t offset, Error **errp) { + uint32_t mmap_flags; void *area; =20 block->page_size =3D qemu_fd_getpagesize(fd); @@ -1580,9 +1581,10 @@ static void *file_ram_alloc(RAMBlock *block, perror("ftruncate"); } =20 - area =3D qemu_ram_mmap(fd, memory, block->mr->align, readonly, - block->flags & RAM_SHARED, block->flags & RAM_PME= M, - offset); + mmap_flags =3D readonly ? QEMU_RAM_MMAP_READONLY : 0; + mmap_flags |=3D (block->flags & RAM_SHARED) ? QEMU_RAM_MMAP_SHARED : 0; + mmap_flags |=3D (block->flags & RAM_PMEM) ? QEMU_RAM_MMAP_PMEM : 0; + area =3D qemu_ram_mmap(fd, memory, block->mr->align, mmap_flags, offse= t); if (area =3D=3D MAP_FAILED) { error_setg_errno(errp, errno, "unable to map backing store for guest RAM"); diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index 0e2bd7bc0e..bd8f7ab547 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -118,9 +118,12 @@ static void *mmap_reserve(size_t size, int fd) * Activate memory in a reserved region from the given fd (if any), to make * it accessible. */ -static void *mmap_activate(void *ptr, size_t size, int fd, bool readonly, - bool shared, bool is_pmem, off_t map_offset) +static void *mmap_activate(void *ptr, size_t size, int fd, uint32_t mmap_f= lags, + off_t map_offset) { + const bool readonly =3D mmap_flags & QEMU_RAM_MMAP_READONLY; + const bool shared =3D mmap_flags & QEMU_RAM_MMAP_SHARED; + const bool is_pmem =3D mmap_flags & QEMU_RAM_MMAP_PMEM; const int prot =3D PROT_READ | (readonly ? 0 : PROT_WRITE); int map_sync_flags =3D 0; int flags =3D MAP_FIXED; @@ -173,9 +176,7 @@ static inline size_t mmap_guard_pagesize(int fd) void *qemu_ram_mmap(int fd, size_t size, size_t align, - bool readonly, - bool shared, - bool is_pmem, + uint32_t mmap_flags, off_t map_offset) { const size_t guard_pagesize =3D mmap_guard_pagesize(fd); @@ -199,8 +200,7 @@ void *qemu_ram_mmap(int fd, =20 offset =3D QEMU_ALIGN_UP((uintptr_t)guardptr, align) - (uintptr_t)guar= dptr; =20 - ptr =3D mmap_activate(guardptr + offset, size, fd, readonly, shared, i= s_pmem, - map_offset); + ptr =3D mmap_activate(guardptr + offset, size, fd, mmap_flags, map_off= set); if (ptr =3D=3D MAP_FAILED) { munmap(guardptr, total); return MAP_FAILED; diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 36820fec16..1d250416f1 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -229,8 +229,9 @@ void *qemu_memalign(size_t alignment, size_t size) /* alloc shared memory pages */ void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared) { + const uint32_t mmap_flags =3D shared ? QEMU_RAM_MMAP_SHARED : 0; size_t align =3D QEMU_VMALLOC_ALIGN; - void *ptr =3D qemu_ram_mmap(-1, size, align, false, shared, false, 0); + void *ptr =3D qemu_ram_mmap(-1, size, align, mmap_flags, 0); =20 if (ptr =3D=3D MAP_FAILED) { return NULL; --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216279; cv=none; d=zohomail.com; s=zohoarc; b=UybiUxEwAGBgRc231bq0aIUsHmIEGONK+a3Kf38SdDbjORWzNF5YwtwN3pMWePmoEGo02uqLkm5dSLA0CRdHzcsTYGy8tL8ORuD5MvV1HFUtTifWMBP464WFublfV1Dp4DYKc1WNfANHv98yyoZRLBOvGVT4FR37PGVYiB0kT6w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216279; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jVrOZFTnsT3zj2UiCAsG7eDoDu76mO5ChVhYgbKeU/E=; b=IxKa8F0KBXkEDOO+th8ZuHiZkHC757vuRsdwzvWxWdDoQwPSJigjSzvnlbki7Sy4P14c7zY61ymmu4jcIzkoizIYRhyRIUfL3O0a2uocrhcTlsKVHGEXZMI4g4Ora8QVu9jWdk5zndxdyvyijXzWm2nbdMQyIRHdKwW3apd/iM0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216279690598.6548470888655; Mon, 8 Mar 2021 07:11:19 -0800 (PST) Received: from localhost ([::1]:58348 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHXS-00049Q-HL for importer@patchew.org; Mon, 08 Mar 2021 10:11:18 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46452) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUW-0007by-UH for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:16 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:20510) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHUU-0001nF-HN for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:16 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-242-oe6MMNRePruFEJn_dl7W9w-1; Mon, 08 Mar 2021 10:08:12 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 96BF3760C1; Mon, 8 Mar 2021 15:08:10 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3CC905D9CD; Mon, 8 Mar 2021 15:08:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216093; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jVrOZFTnsT3zj2UiCAsG7eDoDu76mO5ChVhYgbKeU/E=; b=RKrj3woGLVcUzcws8lr7DwFfV9ViNqwHFUUoom++sCXYScHo1Ju6JQO2sjvsQ8uzpSiNZI bhoDQO5CFH3GGv6VfWcJ/5kTYXTpoavZv5Zj4V5DxKLJG9/mVH/woxY0NFmyeB9Z7uPDkI 1TOH2bg+BXkzSUnM0XbYQ3tCmfqapx8= X-MC-Unique: oe6MMNRePruFEJn_dl7W9w-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 10/12] memory: introduce RAM_NORESERVE and wire it up in qemu_ram_mmap() Date: Mon, 8 Mar 2021 16:05:58 +0100 Message-Id: <20210308150600.14440-11-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Igor Kotrasinski , kvm@vger.kernel.org, "Michael S. Tsirkin" , Thomas Huth , Peter Xu , Paolo Bonzini , Juan Quintela , David Hildenbrand , Halil Pasic , Christian Borntraeger , Murilo Opsfelder Araujo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , Eduardo Habkost , Stefan Weil , Richard Henderson , "Dr. David Alan Gilbert" , Greg Kurz , qemu-s390x@nongnu.org, Stefan Hajnoczi , Igor Mammedov , Cornelia Huck Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's introduce RAM_NORESERVE, allowing mmap'ing with MAP_NORESERVE. The new flag has the following semantics: RAM is mmap-ed with MAP_NORESERVE. When set, reserving swap space (or huge pages on Linux) is skipped: will bail out if not supported. When not set, the OS might reserve swap space (or huge pages on Linux), depending on OS support. Allow passing it into: - memory_region_init_ram_nomigrate() - memory_region_init_resizeable_ram() - memory_region_init_ram_from_file() ... and teach qemu_ram_mmap() and qemu_anon_ram_alloc() about the flag. Bail out if the flag is not supported, which is the case right now for both, POSIX and win32. We will add the POSIX mmap implementation next and allow specifying RAM_NORESERVE via memory backends. The target use case is virtio-mem, which dynamically exposes memory inside a large, sparse memory area to the VM. Cc: Juan Quintela Cc: Halil Pasic Cc: Cornelia Huck Cc: Christian Borntraeger Cc: Thomas Huth Cc: Stefan Weil Cc: kvm@vger.kernel.org Cc: qemu-s390x@nongnu.org Signed-off-by: David Hildenbrand --- include/exec/cpu-common.h | 1 + include/exec/memory.h | 16 +++++++++++++--- include/exec/ram_addr.h | 3 ++- include/qemu/mmap-alloc.h | 3 +++ include/qemu/osdep.h | 3 ++- migration/ram.c | 3 +-- softmmu/physmem.c | 15 +++++++++++---- util/mmap-alloc.c | 6 ++++++ util/oslib-posix.c | 6 ++++-- util/oslib-win32.c | 13 ++++++++++++- 10 files changed, 55 insertions(+), 14 deletions(-) diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 5a0a2d93e0..38a47ad4ac 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -58,6 +58,7 @@ void *qemu_ram_get_host_addr(RAMBlock *rb); ram_addr_t qemu_ram_get_offset(RAMBlock *rb); ram_addr_t qemu_ram_get_used_length(RAMBlock *rb); bool qemu_ram_is_shared(RAMBlock *rb); +bool qemu_ram_is_noreserve(RAMBlock *rb); bool qemu_ram_is_uf_zeroable(RAMBlock *rb); void qemu_ram_set_uf_zeroable(RAMBlock *rb); bool qemu_ram_is_migratable(RAMBlock *rb); diff --git a/include/exec/memory.h b/include/exec/memory.h index 2d97bdf59c..1369497415 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -155,6 +155,14 @@ typedef struct IOMMUTLBEvent { */ #define RAM_UF_WRITEPROTECT (1 << 6) =20 +/* + * RAM is mmap-ed with MAP_NORESERVE. When set, reserving swap space (or h= uge + * pages Linux) is skipped: will bail out if not supported. When not set, = the + * OS might reserve swap space (or huge pages on Linux), depending on OS + * support. + */ +#define RAM_NORESERVE (1 << 7) + static inline void iommu_notifier_init(IOMMUNotifier *n, IOMMUNotify fn, IOMMUNotifierFlag flags, hwaddr start, hwaddr end, @@ -913,7 +921,7 @@ void memory_region_init_ram_nomigrate(MemoryRegion *mr, * @name: Region name, becomes part of RAMBlock name used in migration str= eam * must be unique within any device * @size: size of the region. - * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_NORESERVE. * @errp: pointer to Error*, to store an error if it happens. * * Note that this function does not do anything to cause the data in the @@ -967,7 +975,8 @@ void memory_region_init_resizeable_ram(MemoryRegion *mr, * @size: size of the region. * @align: alignment of the region base address; if 0, the default alignme= nt * (getpagesize()) will be used. - * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM, + * RAM_NORESERVE, * @path: the path in which to allocate the RAM. * @readonly: true to open @path for reading, false for read/write. * @errp: pointer to Error*, to store an error if it happens. @@ -993,7 +1002,8 @@ void memory_region_init_ram_from_file(MemoryRegion *mr, * @owner: the object that tracks the region's reference count * @name: the name of the region. * @size: size of the region. - * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM, + * RAM_NORESERVE. * @fd: the fd to mmap. * @offset: offset within the file referenced by fd * @errp: pointer to Error*, to store an error if it happens. diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index 6d4513f8e2..551876bed0 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -104,7 +104,8 @@ long qemu_maxrampagesize(void); * Parameters: * @size: the size in bytes of the ram block * @mr: the memory region where the ram block is - * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM. + * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM, + * RAM_NORESERVE. * @mem_path or @fd: specify the backing file or device * @readonly: true to open @path for reading, false for read/write. * @errp: pointer to Error*, to store an error if it happens diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h index 55664ea9f3..6ac05d70d4 100644 --- a/include/qemu/mmap-alloc.h +++ b/include/qemu/mmap-alloc.h @@ -15,6 +15,9 @@ size_t qemu_mempath_getpagesize(const char *mem_path); /* Map MAP_SYNC|MAP_SHARED_VALIDATE if possible, fallback and warn otherwi= se. */ #define QEMU_RAM_MMAP_PMEM (1 << 2) =20 +/* Map MAP_NORESERVE and fail if not effective. */ +#define QEMU_RAM_MMAP_NORESERVE (1 << 3) + /** * qemu_ram_mmap: mmap the specified file or device. * diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index ba15be9c56..d6d8ef0999 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -343,7 +343,8 @@ extern int daemon(int, int); int qemu_daemon(int nochdir, int noclose); void *qemu_try_memalign(size_t alignment, size_t size); void *qemu_memalign(size_t alignment, size_t size); -void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared); +void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared, + bool noreserve); void qemu_vfree(void *ptr); void qemu_anon_ram_free(void *ptr, size_t size); =20 diff --git a/migration/ram.c b/migration/ram.c index 72143da0ac..dd8daad386 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3322,8 +3322,7 @@ int colo_init_ram_cache(void) WITH_RCU_READ_LOCK_GUARD() { RAMBLOCK_FOREACH_NOT_IGNORED(block) { block->colo_cache =3D qemu_anon_ram_alloc(block->used_length, - NULL, - false); + NULL, false, false); if (!block->colo_cache) { error_report("%s: Can't alloc memory for COLO cache of blo= ck %s," "size 0x" RAM_ADDR_FMT, __func__, block->idst= r, diff --git a/softmmu/physmem.c b/softmmu/physmem.c index ec7a382ccd..dcc1fb74aa 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -1584,6 +1584,7 @@ static void *file_ram_alloc(RAMBlock *block, mmap_flags =3D readonly ? QEMU_RAM_MMAP_READONLY : 0; mmap_flags |=3D (block->flags & RAM_SHARED) ? QEMU_RAM_MMAP_SHARED : 0; mmap_flags |=3D (block->flags & RAM_PMEM) ? QEMU_RAM_MMAP_PMEM : 0; + mmap_flags |=3D (block->flags & RAM_NORESERVE) ? QEMU_RAM_MMAP_NORESER= VE : 0; area =3D qemu_ram_mmap(fd, memory, block->mr->align, mmap_flags, offse= t); if (area =3D=3D MAP_FAILED) { error_setg_errno(errp, errno, @@ -1704,6 +1705,11 @@ bool qemu_ram_is_shared(RAMBlock *rb) return rb->flags & RAM_SHARED; } =20 +bool qemu_ram_is_noreserve(RAMBlock *rb) +{ + return rb->flags & RAM_NORESERVE; +} + /* Note: Only set at the start of postcopy */ bool qemu_ram_is_uf_zeroable(RAMBlock *rb) { @@ -1932,6 +1938,7 @@ static void dirty_memory_extend(ram_addr_t old_ram_si= ze, static void ram_block_add(RAMBlock *new_block, Error **errp) { const bool shared =3D qemu_ram_is_shared(new_block); + const bool noreserve =3D qemu_ram_is_noreserve(new_block); RAMBlock *block; RAMBlock *last_block =3D NULL; ram_addr_t old_ram_size, new_ram_size; @@ -1954,7 +1961,7 @@ static void ram_block_add(RAMBlock *new_block, Error = **errp) } else { new_block->host =3D qemu_anon_ram_alloc(new_block->max_length, &new_block->mr->align, - shared); + shared, noreserve); if (!new_block->host) { error_setg_errno(errp, errno, "cannot set up guest memory '%s'", @@ -2025,7 +2032,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, Mem= oryRegion *mr, int64_t file_size, file_align; =20 /* Just support these ram flags by now. */ - assert((ram_flags & ~(RAM_SHARED | RAM_PMEM)) =3D=3D 0); + assert((ram_flags & ~(RAM_SHARED | RAM_PMEM | RAM_NORESERVE)) =3D=3D 0= ); =20 if (xen_enabled()) { error_setg(errp, "-mem-path not supported with Xen"); @@ -2116,7 +2123,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ra= m_addr_t max_size, RAMBlock *new_block; Error *local_err =3D NULL; =20 - assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE)) =3D=3D 0); + assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_NORESERVE)) = =3D=3D 0); =20 size =3D HOST_PAGE_ALIGN(size); max_size =3D HOST_PAGE_ALIGN(max_size); @@ -2151,7 +2158,7 @@ RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, vo= id *host, RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags, MemoryRegion *mr, Error **errp) { - assert((ram_flags & ~RAM_SHARED) =3D=3D 0); + assert((ram_flags & ~(RAM_SHARED | RAM_NORESERVE)) =3D=3D 0); return qemu_ram_alloc_internal(size, size, NULL, NULL, ram_flags, mr, = errp); } =20 diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index bd8f7ab547..ecace41ad5 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "qemu/mmap-alloc.h" #include "qemu/host-utils.h" +#include "qemu/error-report.h" =20 #define HUGETLBFS_MAGIC 0x958458f6 =20 @@ -183,6 +184,11 @@ void *qemu_ram_mmap(int fd, size_t offset, total; void *ptr, *guardptr; =20 + if (mmap_flags & QEMU_RAM_MMAP_NORESERVE) { + error_report("Skipping reservation of swap space is not supported"= ); + return MAP_FAILED; + } + /* * Note: this always allocates at least one extra page of virtual addr= ess * space, even if size is already aligned. diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 1d250416f1..eab92fcafe 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -227,9 +227,11 @@ void *qemu_memalign(size_t alignment, size_t size) } =20 /* alloc shared memory pages */ -void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared) +void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared, + bool noreserve) { - const uint32_t mmap_flags =3D shared ? QEMU_RAM_MMAP_SHARED : 0; + const uint32_t mmap_flags =3D (shared ? QEMU_RAM_MMAP_SHARED : 0) | + (noreserve ? QEMU_RAM_MMAP_NORESERVE : 0); size_t align =3D QEMU_VMALLOC_ALIGN; void *ptr =3D qemu_ram_mmap(-1, size, align, mmap_flags, 0); =20 diff --git a/util/oslib-win32.c b/util/oslib-win32.c index f68b8012bb..8cafe44179 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -39,6 +39,7 @@ #include "trace.h" #include "qemu/sockets.h" #include "qemu/cutils.h" +#include "qemu/error-report.h" #include =20 /* this must come after including "trace.h" */ @@ -77,10 +78,20 @@ static int get_allocation_granularity(void) return system_info.dwAllocationGranularity; } =20 -void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared) +void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared, + bool noreserve) { void *ptr; =20 + if (noreserve) { + /* + * We need a MEM_COMMIT before accessing any memory in a MEM_RESER= VE + * area; we cannot easily mimic POSIX MAP_NORESERVE semantics. + */ + error_report("Skipping reservation of swap space is not supported.= "); + return NULL; + } + ptr =3D VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); trace_qemu_anon_ram_alloc(size, ptr); =20 --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216851; cv=none; d=zohomail.com; s=zohoarc; b=M9svmtw4VMKW3rOB3s0zlkK8k91ctoWu/AE2ehi/nJqg9nCL6s3RYDGw0FQApZs04DxU6chUvKoDGtOyFZPli4UH7l72ejw8sqWb9YoYuXISRf//ngwdav+2GKqXOYAguMTFpuRRbPHhYPylTlUIXE/rXp0Lqy/e4g2ZK/B3jtc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216851; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=mFbtNAviaY5RzdTkvR3TkHFa5JBmWt8SJ0yvJU2jGv4=; b=ce95Bm80ZeZWRaA3byBno/arANWgTIMyJ13tP1GomuOBymkrzftZhlansl+YkhKW+FlvjJ0SeKrBYnbWp4RFQ18te2NsTXMR6RIfPktY02CMY700HmurqDx5hqEMImfGaB3SZmwl4uV01YC5WLDvJx8aTbp+npLruB7RcP1ZOzM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216851290509.4081890264607; Mon, 8 Mar 2021 07:20:51 -0800 (PST) Received: from localhost ([::1]:52074 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHgg-0005Mr-Jf for importer@patchew.org; Mon, 08 Mar 2021 10:20:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46638) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUo-0008O3-H3 for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:34 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59444) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHUm-0001xG-El for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:34 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-39-zV0pEjl7ONSDa1BLGKAnVA-1; Mon, 08 Mar 2021 10:08:29 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id BA92980432D; Mon, 8 Mar 2021 15:08:27 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id ED7815D9CD; Mon, 8 Mar 2021 15:08:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216111; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mFbtNAviaY5RzdTkvR3TkHFa5JBmWt8SJ0yvJU2jGv4=; b=csF0qmZvEJrlr1rei+daUm7bV+RyOEeK1toMyjv/Sl30ehYAsJXFGdzq4p2sO6vvov3F0X hCO4doBuQ8jzlySAryCz8mvYNYsoQIi92zKeOSOdADOuWvb9eVlSSZB+kuZm8RVqoesei2 0GbWvc3wqeTZsSA2WaEkBtb/CGVQnlk= X-MC-Unique: zV0pEjl7ONSDa1BLGKAnVA-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 11/12] util/mmap-alloc: Support RAM_NORESERVE via MAP_NORESERVE Date: Mon, 8 Mar 2021 16:05:59 +0100 Message-Id: <20210308150600.14440-12-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's support RAM_NORESERVE via MAP_NORESERVE. At least on Linux, the flag has no effect on most shared mappings - except for hugetlbfs and anonymous memory. Linux man page: "MAP_NORESERVE: Do not reserve swap space for this mapping. When swap space is reserved, one has the guarantee that it is possible to modify the mapping. When swap space is not reserved one might get SIGSEGV upon a write if no physical memory is available. See also the discussion of the file /proc/sys/vm/overcommit_memory in proc(5). In kernels before 2.6, this flag had effect only for private writable mappings." Note that the "guarantee" part is wrong with memory overcommit in Linux. Also, in Linux hugetlbfs is treated differently - we configure reservation of huge pages from the pool, not reservation of swap space (huge pages cannot be swapped). The rough behavior is [1]: a) !Hugetlbfs: 1) Without MAP_NORESERVE *or* with memory overcommit under Linux disabled ("/proc/sys/vm/overcommit_memory =3D=3D 2"), the following accounting/reservation happens: For a file backed map SHARED or READ-only - 0 cost (the file is the map not swap) PRIVATE WRITABLE - size of mapping per instance For an anonymous or /dev/zero map SHARED - size of mapping PRIVATE READ-only - 0 cost (but of little use) PRIVATE WRITABLE - size of mapping per instance 2) With MAP_NORESERVE, no accounting/reservation happens. b) Hugetlbfs: 1) Without MAP_NORESERVE, huge pages are reserved. 2) With MAP_NORESERVE, no huge pages are reserved. Note: With "/proc/sys/vm/overcommit_memory =3D=3D 0", we were already able to configure it for !hugetlbfs globally; this toggle now allows configuring it more fine-grained, not for the whole system. The target use case is virtio-mem, which dynamically exposes memory inside a large, sparse memory area to the VM. [1] https://www.kernel.org/doc/Documentation/vm/overcommit-accounting Signed-off-by: David Hildenbrand --- softmmu/physmem.c | 1 + util/mmap-alloc.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/softmmu/physmem.c b/softmmu/physmem.c index dcc1fb74aa..199c5a4985 100644 --- a/softmmu/physmem.c +++ b/softmmu/physmem.c @@ -2229,6 +2229,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t lengt= h) flags =3D MAP_FIXED; flags |=3D block->flags & RAM_SHARED ? MAP_SHARED : MAP_PRIVATE; + flags |=3D block->flags & RAM_NORESERVE ? MAP_NORESERVE : = 0; if (block->fd >=3D 0) { area =3D mmap(vaddr, length, PROT_READ | PROT_WRITE, flags, block->fd, offset); diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index ecace41ad5..c511a68bbe 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "qemu/mmap-alloc.h" #include "qemu/host-utils.h" +#include "qemu/cutils.h" #include "qemu/error-report.h" =20 #define HUGETLBFS_MAGIC 0x958458f6 @@ -125,6 +126,7 @@ static void *mmap_activate(void *ptr, size_t size, int = fd, uint32_t mmap_flags, const bool readonly =3D mmap_flags & QEMU_RAM_MMAP_READONLY; const bool shared =3D mmap_flags & QEMU_RAM_MMAP_SHARED; const bool is_pmem =3D mmap_flags & QEMU_RAM_MMAP_PMEM; + const bool noreserve =3D mmap_flags & QEMU_RAM_MMAP_NORESERVE; const int prot =3D PROT_READ | (readonly ? 0 : PROT_WRITE); int map_sync_flags =3D 0; int flags =3D MAP_FIXED; @@ -132,6 +134,7 @@ static void *mmap_activate(void *ptr, size_t size, int = fd, uint32_t mmap_flags, =20 flags |=3D fd =3D=3D -1 ? MAP_ANONYMOUS : 0; flags |=3D shared ? MAP_SHARED : MAP_PRIVATE; + flags |=3D noreserve ? MAP_NORESERVE : 0; if (shared && is_pmem) { map_sync_flags =3D MAP_SYNC | MAP_SHARED_VALIDATE; } @@ -174,6 +177,66 @@ static inline size_t mmap_guard_pagesize(int fd) #endif } =20 +#define OVERCOMMIT_MEMORY_PATH "/proc/sys/vm/overcommit_memory" +static bool map_noreserve_effective(int fd, uint32_t mmap_flags) +{ +#if defined(__linux__) + const bool readonly =3D mmap_flags & QEMU_RAM_MMAP_READONLY; + const bool shared =3D mmap_flags & QEMU_RAM_MMAP_SHARED; + gchar *content =3D NULL; + const char *endptr; + unsigned int tmp; + + /* + * hugeltb accounting is different than ordinary swap reservation: + * a) Hugetlb pages from the pool are reserved for both private and + * shared mappings. For shared mappings, reservations are tracked + * per file -- all mappers have to specify MAP_NORESERVE. + * b) MAP_NORESERVE is not affected by /proc/sys/vm/overcommit_memory. + */ + if (qemu_fd_getpagesize(fd) !=3D qemu_real_host_page_size) { + return true; + } + + /* + * Accountable mappings in the kernel that can be affected by MAP_NORE= SEVE + * are private writable mappings (see mm/mmap.c:accountable_mapping() = in + * Linux). For all shared or readonly mappings, MAP_NORESERVE is always + * implicitly active -- no reservation; this includes shmem. The only + * exception is shared anonymous memory, it is accounted like private + * anonymous memory. + */ + if (readonly || (shared && fd >=3D 0)) { + return true; + } + + /* + * MAP_NORESERVE is globally ignored for private writable mappings when + * overcommit is set to "never". Sparse memory regions aren't really + * possible in this system configuration. + * + * Bail out now instead of silently committing way more memory than + * currently desired by the user. + */ + if (g_file_get_contents(OVERCOMMIT_MEMORY_PATH, &content, NULL, NULL) = && + !qemu_strtoui(content, &endptr, 0, &tmp) && + (!endptr || *endptr =3D=3D '\n')) { + if (tmp =3D=3D 2) { + error_report("Skipping reservation of swap space is not suppor= ted:" + " \"" OVERCOMMIT_MEMORY_PATH "\" is \"2\""); + return false; + } + return true; + } + /* this interface has been around since Linux 2.6 */ + error_report("Skipping reservation of swap space is not supported:" + " Could not read: \"" OVERCOMMIT_MEMORY_PATH "\""); + return false; +#else + return true; +#endif +} + void *qemu_ram_mmap(int fd, size_t size, size_t align, @@ -184,7 +247,8 @@ void *qemu_ram_mmap(int fd, size_t offset, total; void *ptr, *guardptr; =20 - if (mmap_flags & QEMU_RAM_MMAP_NORESERVE) { + if (mmap_flags & QEMU_RAM_MMAP_NORESERVE && + !map_noreserve_effective(fd, mmap_flags)) { error_report("Skipping reservation of swap space is not supported"= ); return MAP_FAILED; } --=20 2.29.2 From nobody Sat Feb 7 04:05:56 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1615216924; cv=none; d=zohomail.com; s=zohoarc; b=ORnVn7Eggmw/kQL+icXo95X5aKT9RGY3hg3qDGOtDU6lKUmdI/mlAKksl6RyWO/e85+ZdBMJpOjgUVyeXSKC+zvc8t5pWddmyoa+gZYNphVYDWIzXLi6xVAQJuVC6fepvJqNJkXONG9MbQ1AM8f+xirEd4H7IQ64GXPLbOyR7WI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615216924; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=000A2Kzvuldjk5CK/R2/a6cUGZhusis3M8m5/x7Qvzo=; b=UqH5RdTLEGWXflnlO/+03Yf/Mj2IxmxiVz8SO5/C8hN6aQITWqghAT4++L2JD1OIRuAm8e8oojgho5Hxn2L6dTjBQ92MM+QURJ9kNITjvICVs1Vc7U+CQ/aZV7UGzIP3JP7C1gVzSvtbt8rrW+BB7r+pLyxBhhUN/74QSFnqing= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615216924655450.86943891691965; Mon, 8 Mar 2021 07:22:04 -0800 (PST) Received: from localhost ([::1]:54244 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJHhr-0006gD-VE for importer@patchew.org; Mon, 08 Mar 2021 10:22:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:46674) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJHUw-0008Tn-0F for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:43 -0500 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:45149) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1lJHUq-0001zT-W4 for qemu-devel@nongnu.org; Mon, 08 Mar 2021 10:08:41 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-35-hbFlU2yaM3OOgT2Nvvaltw-1; Mon, 08 Mar 2021 10:08:33 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 260C68143F0; Mon, 8 Mar 2021 15:08:32 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-123.ams2.redhat.com [10.36.113.123]) by smtp.corp.redhat.com (Postfix) with ESMTP id 12C645D9CD; Mon, 8 Mar 2021 15:08:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1615216116; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=000A2Kzvuldjk5CK/R2/a6cUGZhusis3M8m5/x7Qvzo=; b=hPX1X4XzGDSpgOIcgHhauI9sPRWCeSW77TtkkvHlF6FHuPGQF5RXdx/2MOYckA2irOoR/f mrsB5pfHrLEF/Nc0UphXVQyNwxYv0SBB8AffjVpCWsQS6y9I/g1cf9dUxH8bHDsT5uDij8 Te3CfrOsWA7tV4qQzZzDUcIhcGucSH8= X-MC-Unique: hbFlU2yaM3OOgT2Nvvaltw-1 From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH v3 12/12] hostmem: Wire up RAM_NORESERVE via "reserve" property Date: Mon, 8 Mar 2021 16:06:00 +0100 Message-Id: <20210308150600.14440-13-david@redhat.com> In-Reply-To: <20210308150600.14440-1-david@redhat.com> References: <20210308150600.14440-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=david@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.251, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_FILL_THIS_FORM_SHORT=0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcel Apfelbaum , Murilo Opsfelder Araujo , Cornelia Huck , Eduardo Habkost , "Michael S. Tsirkin" , Stefan Weil , David Hildenbrand , Richard Henderson , "Dr. David Alan Gilbert" , Peter Xu , Greg Kurz , Halil Pasic , Christian Borntraeger , Stefan Hajnoczi , Igor Mammedov , Thomas Huth , Paolo Bonzini , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Igor Kotrasinski , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Let's provide a way to control the use of RAM_NORESERVE via memory backends using the "reserve" property which defaults to true (old behavior). Only POSIX supports setting the flag (and Linux support is checked at runtime, depending on the setting of "/proc/sys/vm/overcommit_memory"). Windows will bail out. The target use case is virtio-mem, which dynamically exposes memory inside a large, sparse memory area to the VM. This essentially allows avoiding to set "/proc/sys/vm/overcommit_memory =3D=3D 0") when using virtio-mem and also supporting hugetlbfs in the future. Reviewed-by: Peter Xu Reviewed-by: Eduardo Habkost Signed-off-by: David Hildenbrand --- backends/hostmem-file.c | 11 ++++++----- backends/hostmem-memfd.c | 1 + backends/hostmem-ram.c | 1 + backends/hostmem.c | 33 +++++++++++++++++++++++++++++++++ include/sysemu/hostmem.h | 2 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c index b683da9daf..9d550e53d4 100644 --- a/backends/hostmem-file.c +++ b/backends/hostmem-file.c @@ -40,6 +40,7 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Err= or **errp) object_get_typename(OBJECT(backend))); #else HostMemoryBackendFile *fb =3D MEMORY_BACKEND_FILE(backend); + uint32_t ram_flags; gchar *name; =20 if (!backend->size) { @@ -52,11 +53,11 @@ file_backend_memory_alloc(HostMemoryBackend *backend, E= rror **errp) } =20 name =3D host_memory_backend_get_name(backend); - memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), - name, - backend->size, fb->align, - (backend->share ? RAM_SHARED : 0) | - (fb->is_pmem ? RAM_PMEM : 0), + ram_flags =3D backend->share ? RAM_SHARED : 0; + ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; + ram_flags |=3D fb->is_pmem ? RAM_PMEM : 0; + memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), name, + backend->size, fb->align, ram_flags, fb->mem_path, fb->readonly, errp); g_free(name); #endif diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index 93b5d1a4cf..f3436b623d 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -55,6 +55,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Er= ror **errp) =20 name =3D host_memory_backend_get_name(backend); ram_flags =3D backend->share ? RAM_SHARED : 0; + ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name, backend->size, ram_flags, fd, 0, errp); g_free(name); diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c index 741e701062..b8e55cdbd0 100644 --- a/backends/hostmem-ram.c +++ b/backends/hostmem-ram.c @@ -29,6 +29,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Erro= r **errp) =20 name =3D host_memory_backend_get_name(backend); ram_flags =3D backend->share ? RAM_SHARED : 0; + ram_flags |=3D backend->reserve ? 0 : RAM_NORESERVE; memory_region_init_ram_flags_nomigrate(&backend->mr, OBJECT(backend), = name, backend->size, ram_flags, errp); g_free(name); diff --git a/backends/hostmem.c b/backends/hostmem.c index c6c1ff5b99..4e80162915 100644 --- a/backends/hostmem.c +++ b/backends/hostmem.c @@ -217,6 +217,11 @@ static void host_memory_backend_set_prealloc(Object *o= bj, bool value, Error *local_err =3D NULL; HostMemoryBackend *backend =3D MEMORY_BACKEND(obj); =20 + if (!backend->reserve && value) { + error_setg(errp, "'prealloc=3Don' and 'reserve=3Doff' are incompat= ible"); + return; + } + if (!host_memory_backend_mr_inited(backend)) { backend->prealloc =3D value; return; @@ -268,6 +273,7 @@ static void host_memory_backend_init(Object *obj) /* TODO: convert access to globals to compat properties */ backend->merge =3D machine_mem_merge(machine); backend->dump =3D machine_dump_guest_core(machine); + backend->reserve =3D true; backend->prealloc_threads =3D 1; } =20 @@ -426,6 +432,28 @@ static void host_memory_backend_set_share(Object *o, b= ool value, Error **errp) backend->share =3D value; } =20 +static bool host_memory_backend_get_reserve(Object *o, Error **errp) +{ + HostMemoryBackend *backend =3D MEMORY_BACKEND(o); + + return backend->reserve; +} + +static void host_memory_backend_set_reserve(Object *o, bool value, Error *= *errp) +{ + HostMemoryBackend *backend =3D MEMORY_BACKEND(o); + + if (host_memory_backend_mr_inited(backend)) { + error_setg(errp, "cannot change property value"); + return; + } + if (backend->prealloc && !value) { + error_setg(errp, "'prealloc=3Don' and 'reserve=3Doff' are incompat= ible"); + return; + } + backend->reserve =3D value; +} + static bool host_memory_backend_get_use_canonical_path(Object *obj, Error **errp) { @@ -494,6 +522,11 @@ host_memory_backend_class_init(ObjectClass *oc, void *= data) host_memory_backend_get_share, host_memory_backend_set_share); object_class_property_set_description(oc, "share", "Mark the memory as private to QEMU or shared"); + object_class_property_add_bool(oc, "reserve", + host_memory_backend_get_reserve, host_memory_backend_set_reserve); + object_class_property_set_description(oc, "reserve", + "Reserve swap space (or huge pages under Linux) for the whole memo= ry" + " backend, if supported by the OS."); /* * Do not delete/rename option. This option must be considered stable * (as if it didn't have the 'x-' prefix including deprecation period)= as diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h index df5644723a..9ff5c16963 100644 --- a/include/sysemu/hostmem.h +++ b/include/sysemu/hostmem.h @@ -64,7 +64,7 @@ struct HostMemoryBackend { /* protected */ uint64_t size; bool merge, dump, use_canonical_path; - bool prealloc, is_mapped, share; + bool prealloc, is_mapped, share, reserve; uint32_t prealloc_threads; DECLARE_BITMAP(host_nodes, MAX_NODES + 1); HostMemPolicy policy; --=20 2.29.2