Re: [PATCH 5/5] [RFC] mm: Remove MAP_UNINITIALIZED support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 9/25/24 23:06, Arnd Bergmann wrote:
From: Arnd Bergmann <arnd@xxxxxxxx>

MAP_UNINITIALIZED was added back in 2009 for NOMMU kernels, specifically
for blackfin, which is long gone. MAP_HUGE_SHIFT/MAP_HUGE_MASK were
added in 2012 for architectures supporting hugepages, which at the time
did not overlap with the ones supporting NOMMU.

Adding the macro under an #ifdef was obviously a mistake, which
Christoph Hellwig tried to address by making it unconditionally defined
to 0x4000000 as part of the series to support RISC-V NOMMU kernels. At
this point linux/mman.h contained two conflicting definitions for bit 26,
though the two are still mutually exclusive at runtime in all supported
configurations.

According to the commit 854e9ed09ded ("mm: support madvise(MADV_FREE)")
description, it was previously used internally by facebook, which
would have resulted in MAP_HUGE_1MB turning into MAP_HUGE_2MB
with MAP_UNINITIALIZED enabled, and every other page size implying
MAP_UNINITIALIZED. I assume there are no remaining out of tree users
on MMU-enabled kernels today.

I do not see any sensible way to redefine the macros for the ABI in
a way avoids breaking something. The only ideas so far are:

  - do nothing, try to document the bug, hope for the best

  - remove the kernel implementation and redefine MAP_UNINITIALIZED to
    zero in the header to silently turn it off for everyone. There are
    few NOMMU users left, and the ones that do use NOMMU usually turn
    off MMAP_ALLOW_UNINITIALIZED, as it still has the potential to cause
    bugs and even security issues on systems with a memory protection
    unit.

  - remove both the implementation and the macro to force a build
    failure for anyone trying to use the feature. This way we can
    see who complains and whether we need to put it back in some
    form or change the userspace sources to no longer pass the flag.

Implement the third option here for the sake of discussion.

Usually I'd vote for option #2, which means remove the kernel implementation and
redefine MAP_UNINITIALIZED to zero in the header.
A few years back this turned out to be the "most compatible" solution.

But today, and specifically regarding MAP_UNINITIALIZED, I think we should get rid of it now.
This flag is useless and build issues will force people to drop it.

Helge





[Index of Archives]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux