From nobody Thu May 16 07:16:31 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=vmware.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1527620494729733.7756394327754; Tue, 29 May 2018 12:01:34 -0700 (PDT) Received: from localhost ([::1]:34523 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fNjs9-0005Ka-EY for importer@patchew.org; Tue, 29 May 2018 15:01:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56049) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fNjr9-00052r-OY for qemu-devel@nongnu.org; Tue, 29 May 2018 15:00:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fNjr6-0002Xb-Hn for qemu-devel@nongnu.org; Tue, 29 May 2018 15:00:27 -0400 Received: from [69.196.150.84] (port=47177 helo=smcpolin-M01.vmware.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fNjr6-0002WW-6e for qemu-devel@nongnu.org; Tue, 29 May 2018 15:00:24 -0400 Received: by smcpolin-M01.vmware.com (Postfix, from userid 375304) id D3B2FC01BBA; Tue, 29 May 2018 15:00:22 -0400 (EDT) From: Steve Mcpolin Date: Tue, 29 May 2018 14:15:25 -0400 To: qemu-devel@nongnu.org Message-Id: <20180529190022.D3B2FC01BBA@smcpolin-M01.vmware.com> X-detected-operating-system: by eggs.gnu.org: Mac OS X [generic] [fuzzy] X-Received-From: 69.196.150.84 Subject: [Qemu-devel] [PATCH v3] linux-user: Remove extra mapping X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-trivial@nongnu.org, riku.voipio@iki.fi, laurent@vivier.eu, smcpolin@vmware.com, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When a guest mmap()'d a file, an anonymous mapping was created to align different host and client page granularity and provide for beyond EOF mappings. The file was then mapped ontop of this mapping, releasing the memory reserved by it. A file based mmap does not reserve memory, but the anonymous map does; thus this anonymous mapping could could cause spurious failures. This patch minimizes the size of the anonymous mapping to prevent spurious failures. Signed-off-by: Steve Mcpolin --- linux-user/mmap.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 9168a20..7a975c8 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -453,21 +453,29 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, = int prot, /* Note: we prefer to control the mapping address. It is especially important if qemu_host_page_size > qemu_real_host_page_size */ - p =3D mmap(g2h(start), host_len, prot, - flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0); - if (p =3D=3D MAP_FAILED) - goto fail; - /* update start so that it points to the file position at 'offset'= */ - host_start =3D (unsigned long)p; - if (!(flags & MAP_ANONYMOUS)) { - p =3D mmap(g2h(start), len, prot, + if (flags & MAP_ANONYMOUS) { + offset =3D 0; + host_offset =3D 0; + fd =3D -1; + } + p =3D mmap(g2h(start), len, prot, flags | MAP_FIXED, fd, host_offset); - if (p =3D=3D MAP_FAILED) { - munmap(g2h(start), host_len); - goto fail; + host_start =3D (uintptr_t)p; + if (p !=3D MAP_FAILED && host_len > REAL_HOST_PAGE_ALIGN(len)) { + void *q; + q =3D mmap(g2h(start + len), host_len - REAL_HOST_PAGE_ALIGN(l= en), + prot, MAP_FIXED | (flags & MAP_TYPE) | MAP_ANONYMOUS, + -1, 0); + if (q =3D=3D MAP_FAILED) { + p =3D MAP_FAILED; } - host_start +=3D offset - host_offset; } + if (p =3D=3D MAP_FAILED) { + munmap(g2h(start), host_len); + goto fail; + } + host_start +=3D offset - host_offset; + /* update start so that it points to the file position at 'offset'= */ start =3D h2g(host_start); } else { if (start & ~TARGET_PAGE_MASK) { --=20 2.7.4