• Peter Xu's avatar
    mm: fix a few rare cases of using swapin error pte marker · 7e3ce3f8
    Peter Xu authored
    This patch should harden commit 15520a3f ("mm: use pte markers for
    swap errors") on using pte markers for swapin errors on a few corner
    cases.
    
    1. Propagate swapin errors across fork()s: if there're swapin errors in
       the parent mm, after fork()s the child should sigbus too when an error
       page is accessed.
    
    2. Fix a rare condition race in pte_marker_clear() where a uffd-wp pte
       marker can be quickly switched to a swapin error.
    
    3. Explicitly ignore swapin error pte markers in change_protection().
    
    I mostly don't worry on (2) or (3) at all, but we should still have them. 
    Case (1) is special because it can potentially cause silent data corrupt
    on child when parent has swapin error triggered with swapoff, but since
    swapin error is rare itself already it's probably not easy to trigger
    either.
    
    Currently there is a priority difference between the uffd-wp bit and the
    swapin error entry, in which the swapin error always has higher priority
    (e.g.  we don't need to wr-protect a swapin error pte marker).
    
    If there will be a 3rd bit introduced, we'll probably need to consider a
    more involved approach so we may need to start operate on the bits.  Let's
    leave that for later.
    
    This patch is tested with case (1) explicitly where we'll get corrupted
    data before in the child if there's existing swapin error pte markers, and
    after patch applied the child can be rightfully killed.
    
    We don't need to copy stable for this one since 15520a3f just landed
    as part of v6.2-rc1, only "Fixes" applied.
    
    Link: https://lkml.kernel.org/r/20221214200453.1772655-3-peterx@redhat.com
    Fixes: 15520a3f ("mm: use pte markers for swap errors")
    Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
    Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
    Reviewed-by: default avatarMiaohe Lin <linmiaohe@huawei.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: "Huang, Ying" <ying.huang@intel.com>
    Cc: Nadav Amit <nadav.amit@gmail.com>
    Cc: Pengfei Xu <pengfei.xu@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    7e3ce3f8
memory.c 160 KB