All of lore.kernel.org
 help / color / mirror / Atom feed
From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Kyle Evans <kevans@FreeBSD.org>,
	Richard Henderson <richard.henderson@linaro.org>,
	Guy Yur <guyyur@gmail.com>, Laurent Vivier <laurent@vivier.eu>,
	Warner Losh <imp@bsdimp.com>
Subject: [PULL v2 07/23] bsd-user/mmap.c: Don't mmap fd == -1 independently from MAP_ANON flag
Date: Mon, 18 Oct 2021 13:00:59 -0600	[thread overview]
Message-ID: <20211018190115.5365-8-imp@bsdimp.com> (raw)
In-Reply-To: <20211018190115.5365-1-imp@bsdimp.com>

Switch checks for !(flags & MAP_ANONYMOUS) with checks for fd != -1.
MAP_STACK and MAP_GUARD both require fd == -1 and don't require mapping
the fd either. Add analysis from Guy Yur detailing the different cases
for MAP_GUARD and MAP_STACK.

Signed-off-by: Guy Yur <guyyur@gmail.com>
[ partially merged before, finishing the job and documenting origin]
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Kyle Evans <kevans@FreeBSD.org>
---
 bsd-user/mmap.c | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

diff --git a/bsd-user/mmap.c b/bsd-user/mmap.c
index face98573f..4ecd949a10 100644
--- a/bsd-user/mmap.c
+++ b/bsd-user/mmap.c
@@ -127,7 +127,27 @@ error:
     return ret;
 }
 
-/* map an incomplete host page */
+/*
+ * map an incomplete host page
+ *
+ * mmap_frag can be called with a valid fd, if flags doesn't contain one of
+ * MAP_ANON, MAP_STACK, MAP_GUARD. If we need to map a page in those cases, we
+ * pass fd == -1. However, if flags contains MAP_GUARD then MAP_ANON cannot be
+ * added.
+ *
+ * * If fd is valid (not -1) we want to map the pages with MAP_ANON.
+ * * If flags contains MAP_GUARD we don't want to add MAP_ANON because it
+ *   will be rejected.  See kern_mmap's enforcing of constraints for MAP_GUARD
+ *   in sys/vm/vm_mmap.c.
+ * * If flags contains MAP_ANON it doesn't matter if we add it or not.
+ * * If flags contains MAP_STACK, mmap adds MAP_ANON when called so doesn't
+ *   matter if we add it or not either. See enforcing of constraints for
+ *   MAP_STACK in kern_mmap.
+ *
+ * Don't add MAP_ANON for the flags that use fd == -1 without specifying the
+ * flags directly, with the assumption that future flags that require fd == -1
+ * will also not require MAP_ANON.
+ */
 static int mmap_frag(abi_ulong real_start,
                      abi_ulong start, abi_ulong end,
                      int prot, int flags, int fd, abi_ulong offset)
@@ -147,9 +167,9 @@ static int mmap_frag(abi_ulong real_start,
     }
 
     if (prot1 == 0) {
-        /* no page was there, so we allocate one */
+        /* no page was there, so we allocate one. See also above. */
         void *p = mmap(host_start, qemu_host_page_size, prot,
-                       flags | MAP_ANON, -1, 0);
+                       flags | ((fd != -1) ? MAP_ANON : 0), -1, 0);
         if (p == MAP_FAILED)
             return -1;
         prot1 = prot;
@@ -157,7 +177,7 @@ static int mmap_frag(abi_ulong real_start,
     prot1 &= PAGE_BITS;
 
     prot_new = prot | prot1;
-    if (!(flags & MAP_ANON)) {
+    if (fd != -1) {
         /* msync() won't work here, so we return an error if write is
            possible while it is a shared mapping */
         if ((flags & TARGET_BSD_MAP_FLAGMASK) == MAP_SHARED &&
@@ -565,7 +585,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
          * worst case: we cannot map the file because the offset is not
          * aligned, so we read it
          */
-        if (!(flags & MAP_ANON) &&
+        if (fd != -1 &&
             (offset & ~qemu_host_page_mask) != (start & ~qemu_host_page_mask)) {
             /*
              * msync() won't work here, so we return an error if write is
-- 
2.32.0



  parent reply	other threads:[~2021-10-18 19:11 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-18 19:00 [PULL v2 00/23] Pull bsd user 20211018 patches Warner Losh
2021-10-18 19:00 ` [PULL v2 01/23] bsd-user/mmap.c: Always zero MAP_ANONYMOUS memory in mmap_frag() Warner Losh
2021-10-18 19:00 ` [PULL v2 02/23] bsd-user/mmap.c: check pread's return value to fix warnings with _FORTIFY_SOURCE Warner Losh
2021-10-18 19:00 ` [PULL v2 03/23] bsd-user/mmap.c: MAP_ symbols are defined, so no need for ifdefs Warner Losh
2021-10-18 19:00 ` [PULL v2 04/23] bsd-user/mmap.c: mmap return ENOMEM on overflow Warner Losh
2021-10-18 19:00 ` [PULL v2 05/23] bsd-user/mmap.c: mmap prefer MAP_ANON for BSD Warner Losh
2021-10-18 19:00 ` [PULL v2 06/23] bsd-user/mmap.c: Convert to qemu_log logging for mmap debugging Warner Losh
2021-10-18 19:00 ` Warner Losh [this message]
2021-10-18 19:01 ` [PULL v2 08/23] bsd-user/mmap.c: Implement MAP_EXCL, required by jemalloc in head Warner Losh
2021-10-18 19:01 ` [PULL v2 09/23] bsd-user/mmap.c: assert that target_mprotect cannot fail Warner Losh
2021-10-18 19:01 ` [PULL v2 10/23] meson: *-user: only descend into *-user when configured Warner Losh
2021-10-18 19:01 ` [PULL v2 11/23] bsd-user/target_os-user.h: Remove support for FreeBSD older than 12.0 Warner Losh
2021-10-18 19:01 ` [PULL v2 12/23] bsd-user/strace.list: Remove support for FreeBSD versions " Warner Losh
2021-10-18 19:01 ` [PULL v2 13/23] bsd-user: TARGET_RESET define is unused, remove it Warner Losh
2021-10-18 19:01 ` [PULL v2 14/23] bsd-user: export get_errno and is_error from syscall.c Warner Losh
2021-10-18 19:01 ` [PULL v2 15/23] bsd-user/errno_defs.h: Add internal error numbers Warner Losh
2021-10-18 19:01 ` [PULL v2 16/23] bsd-user: move TARGET_MC_GET_CLEAR_RET to target_os_signal.h Warner Losh
2021-10-18 19:01 ` [PULL v2 17/23] bsd-user/target_os_elf.h: Remove fallback ELF_HWCAP and reorder Warner Losh
2021-10-18 19:01 ` [PULL v2 18/23] bsd-user/target_os_elf: If ELF_HWCAP2 is defined, publish it Warner Losh
2021-10-18 19:01 ` [PULL v2 19/23] bsd-user: Remove used from TaskState Warner Losh
2021-10-18 19:01 ` [PULL v2 20/23] bsd-user: Add stop_all_tasks Warner Losh
2021-10-18 19:01 ` [PULL v2 21/23] bsd-user/sysarch: Move to using do_freebsd_arch_sysarch interface Warner Losh
2021-10-18 19:01 ` [PULL v2 22/23] bsd-user: Rename sigqueue to qemu_sigqueue Warner Losh
2021-10-18 19:01 ` [PULL v2 23/23] bsd-user/signal: Create a dummy signal queueing function Warner Losh
2021-10-18 21:06 ` [PULL v2 00/23] Pull bsd user 20211018 patches Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211018190115.5365-8-imp@bsdimp.com \
    --to=imp@bsdimp.com \
    --cc=guyyur@gmail.com \
    --cc=kevans@FreeBSD.org \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.