From nobody Tue Feb 10 09:27:46 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1664398681943634.9579386424377; Wed, 28 Sep 2022 13:58:01 -0700 (PDT) Received: from localhost ([::1]:40316 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ode81-0004Yj-0E for importer@patchew.org; Wed, 28 Sep 2022 16:58:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33350) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oddev-0008Ux-Gk for qemu-devel@nongnu.org; Wed, 28 Sep 2022 16:27:57 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:48811) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oddet-0006Th-2O for qemu-devel@nongnu.org; Wed, 28 Sep 2022 16:27:57 -0400 Received: from quad ([82.142.8.70]) by mrelayeu.kundenserver.de (mreue108 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MO9vD-1otOIO0ptx-00ObHV; Wed, 28 Sep 2022 22:27:49 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Cc: Ilya Leoshkevich , Richard Henderson , Laurent Vivier Subject: [PULL 16/37] linux-user: Passthrough MADV_DONTNEED for certain file mappings Date: Wed, 28 Sep 2022 22:27:16 +0200 Message-Id: <20220928202737.793171-17-laurent@vivier.eu> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20220928202737.793171-1-laurent@vivier.eu> References: <20220928202737.793171-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:9j/9cvNf9CzPK9v5Lw6ejSm3B0TyF0+wOV93MTN+RNM9vXaKI/k vhhIsbSDIDtFWqhNr9az7nBbwGRODFwnWxMLf2ksOomnH7hUFCJ1KSUfh/aMH1HsMSpqnJU fiBrc1uUL1GzGxW24kkmVpwyRbs0T6PrmCclD1oHxoBbjJDi+SZIgRIu9R3bcQN/QDsuVDH WYyHxCaYLJYjfPxlW9lMA== X-UI-Out-Filterresults: notjunk:1;V03:K0:vi1r5Wh2IU8=:ugxUKS6qt9EcSyZDl0wAG+ uGo4EF2pKXGvluL1ULgPhDwGsnK105cFS7e2jtXH4PuCthZy5V6Ff0jU7hTnJBqnL0b/bPFxa NDw3jYzR0GX/6F+5AKUOgKCjRgZ2Ppd/T/LkToScb755DkiNUpQfo+BNXN9bPHKzgxzQICUDS A2cVAx3h5fs7iTVE3MQtGOMohgIytJp9w27dL6nJwP99WSbsg0EQ/grHT6nCX0znJG80E3s++ NnmRV12BdREUas4H2wRB4lEDcZnvmqqoSzItqsra2Du3V+6gL76Mn4PA3zbnlTym64iGbfmIa XViZmDKURxbfdri6ciu+InGSaTLchC861t2yjF40+Wkiv9+zk2lK7AofZApFceU/LmvupOy9Y twvvkp6KqbReQuO0YZR2T/9vOkzHT66c+GTEJio4etIHZWKAXR26YeIH+ZBB7gqg8Y9bTZb6+ O3uWCJB4SMHpkIxyfVnt6gvVCQ1mKK8dlcxTUzwzBquGDl1cPXQD/S8COy06+QrcV5p6mgsTh GrHKgHjwQIqio3LBy1/HZT067dUkoCB3ihPP6Q9EMH4s5WTzZSdIAQGsIBGU5fpzs5YehSXtA FdW6UERmrjGQvG44m4WNkhEVFw908c4Af61L9LATH130ZLTUJ5WKX9emRbdy9U04R00/Bc3mr En69SxmT2Jae8EBRlF1ETciHt9kvBgHOlrIiGniSHyc+qWT7dSPd+LL4EpQJ1alAs/5O0Oxee bWD2Qcu9Mq3gpUUAl7JRuyufE3CslHpReRC2Ihn01iZaqhDS0grdbTF6AAyZD7Jd8zk2rr6y5 jnkgc1i 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: none client-ip=212.227.17.10; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1664398683817100001 Content-Type: text/plain; charset="utf-8" From: Ilya Leoshkevich This is a follow-up for commit 892a4f6a750a ("linux-user: Add partial support for MADV_DONTNEED"), which added passthrough for anonymous mappings. File mappings can be handled in a similar manner. In order to do that, mark pages, for which mmap() was passed through, with PAGE_PASSTHROUGH, and then allow madvise() passthrough for these pages. Drop the explicit PAGE_ANON check, since anonymous mappings are expected to have PAGE_PASSTHROUGH anyway. Add PAGE_PASSTHROUGH to PAGE_STICKY in order to keep it on mprotect(). Signed-off-by: Ilya Leoshkevich Reviewed-by: Richard Henderson Message-Id: <20220725125043.43048-1-iii@linux.ibm.com> Message-Id: <20220906000839.1672934-5-iii@linux.ibm.com> Signed-off-by: Laurent Vivier --- accel/tcg/translate-all.c | 2 +- include/exec/cpu-all.h | 6 ++++++ linux-user/mmap.c | 27 ++++++++++++++++++++++----- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index f5e8592d4a47..d71d04d338db 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -2258,7 +2258,7 @@ int page_get_flags(target_ulong address) #ifndef PAGE_TARGET_STICKY #define PAGE_TARGET_STICKY 0 #endif -#define PAGE_STICKY (PAGE_ANON | PAGE_TARGET_STICKY) +#define PAGE_STICKY (PAGE_ANON | PAGE_PASSTHROUGH | PAGE_TARGET_STICKY) =20 /* Modify the flags of a page and invalidate the code if necessary. The flag PAGE_WRITE_ORG is positioned automatically depending diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h index 491629b9ba7a..16b7df41bf5e 100644 --- a/include/exec/cpu-all.h +++ b/include/exec/cpu-all.h @@ -262,6 +262,12 @@ extern const TargetPageBits target_page; #define PAGE_TARGET_1 0x0200 #define PAGE_TARGET_2 0x0400 =20 +/* + * For linux-user, indicates that the page is mapped with the same semanti= cs + * in both guest and host. + */ +#define PAGE_PASSTHROUGH 0x0800 + #if defined(CONFIG_USER_ONLY) void page_dump(FILE *f); =20 diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 942bec7e8528..e557f3626e5d 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -431,7 +431,8 @@ abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size= , abi_ulong align) abi_long target_mmap(abi_ulong start, abi_ulong len, int target_prot, int flags, int fd, abi_ulong offset) { - abi_ulong ret, end, real_start, real_end, retaddr, host_offset, host_l= en; + abi_ulong ret, end, real_start, real_end, retaddr, host_offset, host_l= en, + passthrough_start =3D -1, passthrough_end =3D -1; int page_flags, host_prot; =20 mmap_lock(); @@ -544,6 +545,8 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, in= t target_prot, host_start +=3D offset - host_offset; } start =3D h2g(host_start); + passthrough_start =3D start; + passthrough_end =3D start + len; } else { if (start & ~TARGET_PAGE_MASK) { errno =3D EINVAL; @@ -626,6 +629,8 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, in= t target_prot, host_prot, flags, fd, offset1); if (p =3D=3D MAP_FAILED) goto fail; + passthrough_start =3D real_start; + passthrough_end =3D real_end; } } the_end1: @@ -633,7 +638,18 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, i= nt target_prot, page_flags |=3D PAGE_ANON; } page_flags |=3D PAGE_RESET; - page_set_flags(start, start + len, page_flags); + if (passthrough_start =3D=3D passthrough_end) { + page_set_flags(start, start + len, page_flags); + } else { + if (start < passthrough_start) { + page_set_flags(start, passthrough_start, page_flags); + } + page_set_flags(passthrough_start, passthrough_end, + page_flags | PAGE_PASSTHROUGH); + if (passthrough_end < start + len) { + page_set_flags(passthrough_end, start + len, page_flags); + } + } the_end: trace_target_mmap_complete(start); if (qemu_loglevel_mask(CPU_LOG_PAGE)) { @@ -852,7 +868,7 @@ static bool can_passthrough_madv_dontneed(abi_ulong sta= rt, abi_ulong end) } =20 for (addr =3D start; addr < end; addr +=3D TARGET_PAGE_SIZE) { - if (!(page_get_flags(addr) & PAGE_ANON)) { + if (!(page_get_flags(addr) & PAGE_PASSTHROUGH)) { return false; } } @@ -894,8 +910,9 @@ abi_long target_madvise(abi_ulong start, abi_ulong len_= in, int advice) * This is a hint, so ignoring and returning success is ok. * * This breaks MADV_DONTNEED, completely implementing which is quite - * complicated. However, there is one low-hanging fruit: host-page-ali= gned - * anonymous mappings. In this case passthrough is safe, so do it. + * complicated. However, there is one low-hanging fruit: mappings that= are + * known to have the same semantics in the host and the guest. In this= case + * passthrough is safe, so do it. */ mmap_lock(); if (advice =3D=3D TARGET_MADV_DONTNEED && --=20 2.37.3