Hi Mark,

On 12/21/2024 5:15 PM, Mark Geisert wrote:
Hi Ken,

On 12/21/2024 1:42 PM, Ken Brown wrote:
I'm wondering why munmap insists on operating with chunks of size 64k instead of pages of size 4k.  In other words, what would go wrong if we did the following:

--- a/winsup/cygwin/mm/mmap.cc
+++ b/winsup/cygwin/mm/mmap.cc
@@ -1143,7 +1143,7 @@ munmap (void *addr, size_t len)
        set_errno (EINVAL);
        return -1;
      }
-  const size_t pagesize = wincap.allocation_granularity ();
+  const size_t pagesize = wincap.page_size ();
    if (((uintptr_t) addr % pagesize) || !len)
      {
        set_errno (EINVAL);

I'm currently testing a build with this patch, and so far I haven't seen any problems.  But maybe I don't know what to test.

I'm afraid I don't remember the circumstances, but the change from 4K pages to 64K was done somewhat recently.  In the last 2-3 years IIRC.

Maybe check the git history of mmap.cc for clues?  Some corner case of how Windows manages page protection wasn't allowing the desired POSIX and/or Linux behavior?
Good suggestion. The following commit changed getpagesize() to return 64k instead of 4k [and it makes the opposite change for getsystempagesize()], but the commit message doesn't say why:

commit 1656b946379942d5a7d78afdaf9786b78b7b618b
Author: Corinna Vinschen <cori...@vinschen.de>
Date:   Tue Jan 9 15:46:41 2007 +0000

            * syscalls.cc (getpagesize): Change condition for clarity.
            (getsystempagesize): Ditto.

And munmap used getpagesize() to determine its page size for a long time, which means that the munmap page size changed from 4k to 64k after the above commit. I don't know the rationale for that change. Maybe the point is that a well-behaved application should call getpagesize() or sysconf() before calling munmap, since POSIX says the following about munmap: "The implementation may require that addr be a multiple of the page size as returned by sysconf()." Notice that it says "may", so Cygwin could still be POSIX compliant if munmap went back to using 4k chunks, as in the old days.

Ken

Reply via email to