Bug 251389

Summary: linuxkpi malloc is not strictly compatible with Linux
Product: Base System Reporter: Justin Hibbits <jhibbits>
Component: kernAssignee: freebsd-emulation (Nobody) <emulation>
Status: New ---    
Severity: Affects Some People CC: kib
Priority: ---    
Version: CURRENT   
Hardware: Any   
OS: Any   

Description Justin Hibbits freebsd_committer 2020-11-26 01:32:09 UTC
Linux's kmalloc seems to provide the following guarantees:

* GPF_KERNEL returns memory in the lower 4GB physical space
* Allocations are physically contiguous

malloc(9) does not make either of these guarantees.  This ends up breaking DRM modules on powerpc64 platforms, where even if memory happens to be contiguous it may not be in the bottom 4GB physical address space, and it may even be in a different NUMA domain, where NUMA domains are physically indexed at 1<<45, such that the bottom 4GB of the second NUMA domain doesn't fit into the 40-bit PA range accessible to Radeon GPUs.

Contiguity can be emulated with contigmalloc(9), but that's not a viable solution for replacing all calls, as it's very possible for the size to not be known and traceable through the lifetime of a pointer.
Comment 1 Konstantin Belousov freebsd_committer 2020-11-26 16:22:23 UTC
(In reply to Justin Hibbits from comment #0)
Is this a cross-platform guarantee, or only valid and assumed for PPC ?
Comment 2 Justin Hibbits freebsd_committer 2020-11-27 00:29:32 UTC
(In reply to Konstantin Belousov from comment #1)
It appears to be a general guarantee, from reading the linux source.

GFP_KERNEL implies ZONE_NORMAL, which is guaranteed to be below 4GB.  The contiguity guarantee looks to be a property of the Linux slab allocator.