• Peter Xu's avatar
    mm/swap: add swp_offset_pfn() to fetch PFN from swap entry · 0d206b5d
    Peter Xu authored
    We've got a bunch of special swap entries that stores PFN inside the swap
    offset fields.  To fetch the PFN, normally the user just calls
    swp_offset() assuming that'll be the PFN.
    
    Add a helper swp_offset_pfn() to fetch the PFN instead, fetching only the
    max possible length of a PFN on the host, meanwhile doing proper check
    with MAX_PHYSMEM_BITS to make sure the swap offsets can actually store the
    PFNs properly always using the BUILD_BUG_ON() in is_pfn_swap_entry().
    
    One reason to do so is we never tried to sanitize whether swap offset can
    really fit for storing PFN.  At the meantime, this patch also prepares us
    with the future possibility to store more information inside the swp
    offset field, so assuming "swp_offset(entry)" to be the PFN will not stand
    any more very soon.
    
    Replace many of the swp_offset() callers to use swp_offset_pfn() where
    proper.  Note that many of the existing users are not candidates for the
    replacement, e.g.:
    
      (1) When the swap entry is not a pfn swap entry at all, or,
      (2) when we wanna keep the whole swp_offset but only change the swp type.
    
    For the latter, it can happen when fork() triggered on a write-migration
    swap entry pte, we may want to only change the migration type from
    write->read but keep the rest, so it's not "fetching PFN" but "changing
    swap type only".  They're left aside so that when there're more
    information within the swp offset they'll be carried over naturally in
    those cases.
    
    Since at it, dropping hwpoison_entry_to_pfn() because that's exactly what
    the new swp_offset_pfn() is about.
    
    Link: https://lkml.kernel.org/r/20220811161331.37055-4-peterx@redhat.comSigned-off-by: default avatarPeter Xu <peterx@redhat.com>
    Reviewed-by: default avatar"Huang, Ying" <ying.huang@intel.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Andi Kleen <andi.kleen@intel.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Nadav Amit <nadav.amit@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    0d206b5d
hugetlbpage.c 12.9 KB