On Tue, Sep 08, 2026 at 09:01:13PM +0100, Lorenzo Stoakes (ARM) wrote: > Replace the deprecated .mmap hook with its replacement .mmap_prepare. As > part of this change, additionally take the approach of mapping pages upon > mmap rather than providing a fault handler. > > The page span cannot be mutated when an mmap mapping is in place, so this > is safe to do in advance (the MON_IOCT_RING_SIZE ioctl operation exits > -EBUSY if it's attempted, gated by the rp->mmap_active reference count). > > Utilise the newly introduced mmap_action_map_discontig_kernel_pages() to do > this, which allows for iteration over pages in mon_bin_discontig_get(). > > mon_bin_discontig_init() increments the rp->mmap_active reference count to > stabilise page spans. Should an error arise the core unmaps the VMA and > mon_bin_vma_close() drops the reference again. > > The vm_ops->close hook implemented in mon_bin_vma_close() will ensure > correct reference count arithmetic upon unmap (with mon_bin_vma_open() > accounting for splitting). > > The existing semantics are all retained, including not mapping past the > range of available pages, with a SIGBUS being raised in a userland process > that attempts to access past this point. > > Ultimately insert_page() is invoked to insert each page, which increments > the reference count on each mapped page. This mimics what was being done > previously, only we pre-map the entire range rather than doing so on > demand. > > The existing fault handler did nothing that required demand paging, and was > presumably implemented this way due for historic reasons. > > One behavioural difference: pages are no longer faulted in on demand, so a > page discarded with MADV_DONTNEED is not repopulated and a subsequent > access raises SIGBUS, as with other pre-populated kernel mappings. > > Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
