Commit Graph

26 Commits

Author SHA1 Message Date
Rafael Aquini eb8ed4c5e4 mm/page_table_check: support userfault wr-protect entries
JIRA: https://issues.redhat.com/browse/RHEL-27745

This patch is a backport of the following upstream commit:
commit 8430557fc584657559bfbd5150b6ae1bb90f35a0
Author: Peter Xu <peterx@redhat.com>
Date:   Wed Apr 17 17:25:49 2024 -0400

    mm/page_table_check: support userfault wr-protect entries

    Allow page_table_check hooks to check over userfaultfd wr-protect criteria
    upon pgtable updates.  The rule is no co-existance allowed for any
    writable flag against userfault wr-protect flag.

    This should be better than c2da319c2e, where we used to only sanitize such
    issues during a pgtable walk, but when hitting such issue we don't have a
    good chance to know where does that writable bit came from [1], so that
    even the pgtable walk exposes a kernel bug (which is still helpful on
    triaging) but not easy to track and debug.

    Now we switch to track the source.  It's much easier too with the recent
    introduction of page table check.

    There are some limitations with using the page table check here for
    userfaultfd wr-protect purpose:

      - It is only enabled with explicit enablement of page table check configs
      and/or boot parameters, but should be good enough to track at least
      syzbot issues, as syzbot should enable PAGE_TABLE_CHECK[_ENFORCED] for
      x86 [1].  We used to have DEBUG_VM but it's now off for most distros,
      while distros also normally not enable PAGE_TABLE_CHECK[_ENFORCED], which
      is similar.

      - It conditionally works with the ptep_modify_prot API.  It will be
      bypassed when e.g. XEN PV is enabled, however still work for most of the
      rest scenarios, which should be the common cases so should be good
      enough.

      - Hugetlb check is a bit hairy, as the page table check cannot identify
      hugetlb pte or normal pte via trapping at set_pte_at(), because of the
      current design where hugetlb maps every layers to pte_t... For example,
      the default set_huge_pte_at() can invoke set_pte_at() directly and lose
      the hugetlb context, treating it the same as a normal pte_t. So far it's
      fine because we have huge_pte_uffd_wp() always equals to pte_uffd_wp() as
      long as supported (x86 only).  It'll be a bigger problem when we'll
      define _PAGE_UFFD_WP differently at various pgtable levels, because then
      one huge_pte_uffd_wp() per-arch will stop making sense first.. as of now
      we can leave this for later too.

    This patch also removes commit c2da319c2e altogether, as we have something
    better now.

    [1] https://lore.kernel.org/all/000000000000dce0530615c89210@google.com/

    Link: https://lkml.kernel.org/r/20240417212549.2766883-1-peterx@redhat.com
    Signed-off-by: Peter Xu <peterx@redhat.com>
    Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Nadav Amit <nadav.amit@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-12-09 12:25:08 -05:00
Rafael Aquini 74f45e8195 mm: convert page_table_check_pte_set() to page_table_check_ptes_set()
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit a379322022c0961fe0b638cdd842d3c38eeff92c
Author: Matthew Wilcox (Oracle) <willy@infradead.org>
Date:   Wed Aug 2 16:13:30 2023 +0100

    mm: convert page_table_check_pte_set() to page_table_check_ptes_set()

    Tell the page table check how many PTEs & PFNs we want it to check.

    Link: https://lkml.kernel.org/r/20230802151406.3735276-3-willy@infradead.org
    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:20:16 -04:00
Rafael Aquini 6a15962946 mm/page_ext: use page_ext_data helper in page_table_check
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit d981e2804c92b505e76f44e66909f3ae805d3aa2
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Tue Jul 18 22:58:11 2023 +0800

    mm/page_ext: use page_ext_data helper in page_table_check

    Use page_ext_data helper in page_table_check to avoid access offset
    directly.

    Link: https://lkml.kernel.org/r/20230718145812.1991717-3-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Reviewed-by: Andrew Morton <akpm@linux-foudation.org>
    Acked-by: Mike Rapoport (IBM) <rppt@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:19:11 -04:00
Rafael Aquini 8ac819b2d1 mm/page_table_check: remove unused parameter in [__]page_table_check_pud_set
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit 6d144436d954311f2dbacb5bf7b084042448d83e
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:36 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pud_set

    Remove unused addr in __page_table_check_pud_set and
    page_table_check_pud_set.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-9-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:57 -04:00
Rafael Aquini c36de5dd7c mm/page_table_check: remove unused parameter in [__]page_table_check_pmd_set
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit a3b837130b5865521fa8662aceaa6ebc8d29389a
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:35 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pmd_set

    Remove unused addr in __page_table_check_pmd_set and
    page_table_check_pmd_set.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-8-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:56 -04:00
Rafael Aquini ddd3238ae2 mm/page_table_check: remove unused parameter in [__]page_table_check_pte_set
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit 1066293d426d3000793c3c3b4276ef38b63ada4a
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:34 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pte_set

    Remove unused addr in __page_table_check_pte_set and
    page_table_check_pte_set.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-7-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:55 -04:00
Rafael Aquini 61f6dbb715 mm/page_table_check: remove unused parameter in [__]page_table_check_pud_clear
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit 931c38e16499a057e30a3033f4d6a9c242f0f156
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:33 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pud_clear

    Remove unused addr in __page_table_check_pud_clear and
    page_table_check_pud_clear.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-6-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:54 -04:00
Rafael Aquini 8f73571794 mm/page_table_check: remove unused parameter in [__]page_table_check_pmd_clear
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit 1831414cd729a34af937d56ad684a66599de6344
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:32 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pmd_clear

    Remove unused addr in page_table_check_pmd_clear and
    __page_table_check_pmd_clear.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-5-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:53 -04:00
Rafael Aquini d86d01ba0a mm/page_table_check: remove unused parameter in [__]page_table_check_pte_clear
JIRA: https://issues.redhat.com/browse/RHEL-27743
Conflicts:
  * arch/riscv/include/asm/pgtable.h: hunk dropped (unsupported arch)

This patch is a backport of the following upstream commit:
commit aa232204c4689427cefa55fe975692b57291523a
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:31 2023 +0800

    mm/page_table_check: remove unused parameter in [__]page_table_check_pte_clear

    Remove unused addr in page_table_check_pte_clear and
    __page_table_check_pte_clear.

    Link: https://lkml.kernel.org/r/20230713172636.1705415-4-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:52 -04:00
Rafael Aquini 55daeed218 mm/page_table_check: remove unused parameters in page_table_check_set()
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit 2f933eaf5bbf49b71319549464df44b87074a8ac
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:30 2023 +0800

    mm/page_table_check: remove unused parameters in page_table_check_set()

    Remove unused mm and addr in page_table_check_set().

    Link: https://lkml.kernel.org/r/20230713172636.1705415-3-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:51 -04:00
Rafael Aquini f751c643e7 mm/page_table_check: remove unused parameters in page_table_check_clear()
JIRA: https://issues.redhat.com/browse/RHEL-27743

This patch is a backport of the following upstream commit:
commit 34c876ce5eeda6c7aa89b2068e724cf84f409ebb
Author: Kemeng Shi <shikemeng@huaweicloud.com>
Date:   Fri Jul 14 01:26:29 2023 +0800

    mm/page_table_check: remove unused parameters in page_table_check_clear()

    Patch series "Remove unused parameters in page_table_check".

    This series remove unused parameters in functions from page_table_check.
    The first 2 patches remove unused mm and addr parameters in static common
    functions page_table_check_clear and page_table_check_set.  The last 6
    patches remove unused addr parameter in some externed functions which only
    need addr for cleaned page_table_check_clear or page_table_check_set.
    There is no intended functional change.

    This patch (of 8):

    Remove unused mm and addr in function page_table_check_clear().

    Link: https://lkml.kernel.org/r/20230713172636.1705415-1-shikemeng@huaweicloud.com
    Link: https://lkml.kernel.org/r/20230713172636.1705415-2-shikemeng@huaweicloud.com
    Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-10-01 11:18:51 -04:00
Rafael Aquini a85223eeb8 mm: ptep_get() conversion
JIRA: https://issues.redhat.com/browse/RHEL-27742
Conflicts:
  * drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c: hunks dropped as
      these are already applied via RHEL commit 26418f1a34 ("Merge DRM
      changes from upstream v6.4..v6.5")
  * kernel/events/uprobes.c: minor context difference due to backport of upstream
      commit ec8832d007cb ("mmu_notifiers: don't invalidate secondary TLBs
      as part of mmu_notifier_invalidate_range_end()")
  * mm/gup.c: minor context difference on the 2nd hunk due to backport of upstream
      commit d74943a2f3cd ("mm/gup: reintroduce FOLL_NUMA as FOLL_HONOR_NUMA_FAULT")
  * mm/hugetlb.c: hunk dropped as it's unecessary given the proactive work done
      on the backport of upstream  commit 191fcdb6c9cf ("mm/hugetlb.c: fix a bug
      within a BUG(): inconsistent pte comparison")
  * mm/ksm.c: context conflicts and differences on the 1st hunk are due to
      out-of-order backport of upstream commit 04dee9e85cf5 ("mm/various:
      give up if pte_offset_map[_lock]() fails") being compensated for only now.
  * mm/memory.c: minor context difference on the 35th hunk due to backport of
      upstream commit 04c35ab3bdae ("x86/mm/pat: fix VM_PAT handling in COW mappings")
  * mm/mempolicy.c: minor context difference on the 1st hunk due to backport of
      upstream commit 24526268f4e3 ("mm: mempolicy: keep VMA walk if both
      MPOL_MF_STRICT and MPOL_MF_MOVE are specified")
  * mm/migrate.c: minor context difference on the 2nd hunk due to backport of
      upstream commits 161e393c0f63 ("mm: Make pte_mkwrite() take a VMA"), and
      f3ebdf042df4 ("mm: don't check VMA write permissions if the PTE/PMD
      indicates write permissions")
  * mm/migrate_device.c: minor context difference on the 5th hunk due to backport
      of upstream commit ec8832d007cb ("mmu_notifiers: don't invalidate secondary
      TLBs  as part of mmu_notifier_invalidate_range_end()")
  * mm/swapfile.c: minor contex differences on the 1st and 2nd hunks due to
      backport of upstream commit f985fc322063 ("mm/swapfile: fix wrong swap
      entry type for hwpoisoned swapcache page")
  * mm/vmscan.c: minor context difference on the 3rd hunk due to backport of
      upstream commit c28ac3c7eb94 ("mm/mglru: skip special VMAs in
      lru_gen_look_around()")

This patch is a backport of the following upstream commit:
commit c33c794828f21217f72ce6fc140e0d34e0d56bff
Author: Ryan Roberts <ryan.roberts@arm.com>
Date:   Mon Jun 12 16:15:45 2023 +0100

    mm: ptep_get() conversion

    Convert all instances of direct pte_t* dereferencing to instead use
    ptep_get() helper.  This means that by default, the accesses change from a
    C dereference to a READ_ONCE().  This is technically the correct thing to
    do since where pgtables are modified by HW (for access/dirty) they are
    volatile and therefore we should always ensure READ_ONCE() semantics.

    But more importantly, by always using the helper, it can be overridden by
    the architecture to fully encapsulate the contents of the pte.  Arch code
    is deliberately not converted, as the arch code knows best.  It is
    intended that arch code (arm64) will override the default with its own
    implementation that can (e.g.) hide certain bits from the core code, or
    determine young/dirty status by mixing in state from another source.

    Conversion was done using Coccinelle:

    ----

    // $ make coccicheck \
    //          COCCI=ptepget.cocci \
    //          SPFLAGS="--include-headers" \
    //          MODE=patch

    virtual patch

    @ depends on patch @
    pte_t *v;
    @@

    - *v
    + ptep_get(v)

    ----

    Then reviewed and hand-edited to avoid multiple unnecessary calls to
    ptep_get(), instead opting to store the result of a single call in a
    variable, where it is correct to do so.  This aims to negate any cost of
    READ_ONCE() and will benefit arch-overrides that may be more complex.

    Included is a fix for an issue in an earlier version of this patch that
    was pointed out by kernel test robot.  The issue arose because config
    MMU=n elides definition of the ptep helper functions, including
    ptep_get().  HUGETLB_PAGE=n configs still define a simple
    huge_ptep_clear_flush() for linking purposes, which dereferences the ptep.
    So when both configs are disabled, this caused a build error because
    ptep_get() is not defined.  Fix by continuing to do a direct dereference
    when MMU=n.  This is safe because for this config the arch code cannot be
    trying to virtualize the ptes because none of the ptep helpers are
    defined.

    Link: https://lkml.kernel.org/r/20230612151545.3317766-4-ryan.roberts@arm.com
    Reported-by: kernel test robot <lkp@intel.com>
    Link: https://lore.kernel.org/oe-kbuild-all/202305120142.yXsNEo6H-lkp@intel.com/
    Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Alex Williamson <alex.williamson@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Daniel Vetter <daniel@ffwll.ch>
    Cc: Dave Airlie <airlied@gmail.com>
    Cc: Dimitri Sivanich <dimitri.sivanich@hpe.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jason Gunthorpe <jgg@ziepe.ca>
    Cc: Jérôme Glisse <jglisse@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Cc: Roman Gushchin <roman.gushchin@linux.dev>
    Cc: SeongJae Park <sj@kernel.org>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Uladzislau Rezki (Sony) <urezki@gmail.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: Yu Zhao <yuzhao@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
2024-09-05 20:36:52 -04:00
Chris von Recklinghausen 02d1fa9e86 mm/page_table_check: fix crash on ZONE_DEVICE
JIRA: https://issues.redhat.com/browse/RHEL-48052
CVE: CVE-2024-40948

commit 8bb592c2eca8fd2bc06db7d80b38da18da4a2f43
Author: Peter Xu <peterx@redhat.com>
Date:   Wed Jun 5 17:21:46 2024 -0400

    mm/page_table_check: fix crash on ZONE_DEVICE

    Not all pages may apply to pgtable check.  One example is ZONE_DEVICE
    pages: they map PFNs directly, and they don't allocate page_ext at all
    even if there's struct page around.  One may reference
    devm_memremap_pages().

    When both ZONE_DEVICE and page-table-check enabled, then try to map some
    dax memories, one can trigger kernel bug constantly now when the kernel
    was trying to inject some pfn maps on the dax device:

     kernel BUG at mm/page_table_check.c:55!

    While it's pretty legal to use set_pxx_at() for ZONE_DEVICE pages for page
    fault resolutions, skip all the checks if page_ext doesn't even exist in
    pgtable checker, which applies to ZONE_DEVICE but maybe more.

    Link: https://lkml.kernel.org/r/20240605212146.994486-1-peterx@redhat.com
    Fixes: df4e817b7108 ("mm: page table check")
    Signed-off-by: Peter Xu <peterx@redhat.com>
    Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: Dan Williams <dan.j.williams@intel.com>
    Reviewed-by: Alistair Popple <apopple@nvidia.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2024-07-17 09:13:28 -04:00
Rafael Aquini f88cf26fe4 mm: page_table_check: Ensure user pages are not slab pages
JIRA: https://issues.redhat.com/browse/RHEL-48221

This patch is a backport of the following upstream commit:
commit 44d0fb387b53e56c8a050bac5c7d460e21eb226f
Author: Ruihan Li <lrh2000@pku.edu.cn>
Date:   Mon May 15 21:09:58 2023 +0800

    mm: page_table_check: Ensure user pages are not slab pages

    The current uses of PageAnon in page table check functions can lead to
    type confusion bugs between struct page and slab [1], if slab pages are
    accidentally mapped into the user space. This is because slab reuses the
    bits in struct page to store its internal states, which renders PageAnon
    ineffective on slab pages.

    Since slab pages are not expected to be mapped into the user space, this
    patch adds BUG_ON(PageSlab(page)) checks to make sure that slab pages
    are not inadvertently mapped. Otherwise, there must be some bugs in the
    kernel.

    Reported-by: syzbot+fcf1a817ceb50935ce99@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/lkml/000000000000258e5e05fae79fc1@google.com/ [1]
    Fixes: df4e817b7108 ("mm: page table check")
    Cc: <stable@vger.kernel.org> # 5.17
    Signed-off-by: Ruihan Li <lrh2000@pku.edu.cn>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Link: https://lore.kernel.org/r/20230515130958.32471-5-lrh2000@pku.edu.cn
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Signed-off-by: Rafael Aquini <aquini@redhat.com>
2024-07-16 09:30:16 -04:00
Aristeu Rozanski 91bf16712f mm/page_ext: do not allocate space for page_ext->flags if not needed
JIRA: https://issues.redhat.com/browse/RHEL-27740
Tested: by me

commit 6189eb82f0aec8a877190bf52e629c687ed02773
Author: Pasha Tatashin <pasha.tatashin@soleen.com>
Date:   Fri Jan 13 15:42:53 2023 +0000

    mm/page_ext: do not allocate space for page_ext->flags if not needed

    There is 8 byte page_ext->flags field allocated per page whenever
    CONFIG_PAGE_EXTENSION is enabled.  However, not every user of page_ext
    uses flags.  Therefore, check whether flags is needed at least by one user
    and if so allocate space for it.

    For example when page_table_check is enabled, on a machine with 128G
    of memory before the fix:

    [    2.244288] allocated 536870912 bytes of page_ext
    after the fix:
    [    2.160154] allocated 268435456 bytes of page_ext

    Also, add a kernel-doc comment before page_ext_operations that describes
    the fields, and remove check if need() is set, as that is now a required
    field.

    [pasha.tatashin@soleen.com: address comments from Mike Rapoport]
      Link: https://lkml.kernel.org/r/20230117202103.1412449-1-pasha.tatashin@soleen.com
    Link: https://lkml.kernel.org/r/20230113154253.92480-1-pasha.tatashin@soleen.com
    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Acked-by: David Hildenbrand <david@redhat.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    Acked-by: David Rientjes <rientjes@google.com>
    Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Charan Teja Kalla <quic_charante@quicinc.com>
    Cc: Li Zhe <lizhe.67@bytedance.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
2024-04-29 14:33:08 -04:00
Audra Mitchell 5de7aadd9a mm: use kstrtobool() instead of strtobool()
JIRA: https://issues.redhat.com/browse/RHEL-27739

This patch is a backport of the following upstream commit:
commit f15be1b8d449a8eebe82d77164bf760804753651
Author: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Date:   Tue Nov 1 22:14:09 2022 +0100

    mm: use kstrtobool() instead of strtobool()

    strtobool() is the same as kstrtobool().  However, the latter is more used
    within the kernel.

    In order to remove strtobool() and slightly simplify kstrtox.h, switch to
    the other function name.

    While at it, include the corresponding header file (<linux/kstrtox.h>)

    Link: https://lkml.kernel.org/r/03f9401a6c8b87a1c786a2138d16b048f8d0eb53.1667336095.git.christophe.jaillet@wanadoo.fr
    Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Audra Mitchell <audra@redhat.com>
2024-04-09 09:42:56 -04:00
Chris von Recklinghausen 414cb8f393 mm/debug_vm_pgtable,page_table_check: warn pte map fails
JIRA: https://issues.redhat.com/browse/RHEL-1848

commit 9f2bad096d2f84751fd4559fcd4cdda1a2af1976
Author: Hugh Dickins <hughd@google.com>
Date:   Thu Jun 8 18:27:52 2023 -0700

    mm/debug_vm_pgtable,page_table_check: warn pte map fails

    Failures here would be surprising: pte_advanced_tests() and
    pte_clear_tests() and __page_table_check_pte_clear_range() each issue a
    warning if pte_offset_map() or pte_offset_map_lock() fails.

    Link: https://lkml.kernel.org/r/3ea9e4f-e5cf-d7d9-4c2-291b3c5a3636@google.com
    Signed-off-by: Hugh Dickins <hughd@google.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: "Huang, Ying" <ying.huang@intel.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Cc: Jason Gunthorpe <jgg@ziepe.ca>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Miaohe Lin <linmiaohe@huawei.com>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Mike Rapoport (IBM) <rppt@kernel.org>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
    Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Ralph Campbell <rcampbell@nvidia.com>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: SeongJae Park <sj@kernel.org>
    Cc: Song Liu <song@kernel.org>
    Cc: Steven Price <steven.price@arm.com>
    Cc: Suren Baghdasaryan <surenb@google.com>
    Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Yang Shi <shy828301@gmail.com>
    Cc: Yu Zhao <yuzhao@google.com>
    Cc: Zack Rusin <zackr@vmware.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-10-20 06:16:16 -04:00
Chris von Recklinghausen aca1c6bef9 mm/page_table_check: fix typos
JIRA: https://issues.redhat.com/browse/RHEL-1848

commit 3ae6d3e30a52a7af222f284d0bf5d424b4f2f365
Author: Chih-En Lin <shiyn.lin@gmail.com>
Date:   Fri Sep 16 17:04:34 2022 +0800

    mm/page_table_check: fix typos

    Link: https://lkml.kernel.org/r/20220916090434.701194-1-shiyn.lin@gmail.com
    Signed-off-by: Chih-En Lin <shiyn.lin@gmail.com>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-10-20 06:14:46 -04:00
Chris von Recklinghausen 8a31fd00da mm: fix use-after free of page_ext after race with memory-offline
JIRA: https://issues.redhat.com/browse/RHEL-1848

commit b1d5488a252dc9c0d9574100d0b8d807bf154603
Author: Charan Teja Kalla <quic_charante@quicinc.com>
Date:   Thu Aug 18 19:20:00 2022 +0530

    mm: fix use-after free of page_ext after race with memory-offline

    The below is one path where race between page_ext and offline of the
    respective memory blocks will cause use-after-free on the access of
    page_ext structure.

    process1                              process2
    ---------                             ---------
    a)doing /proc/page_owner           doing memory offline
                                       through offline_pages.

    b) PageBuddy check is failed
       thus proceed to get the
       page_owner information
       through page_ext access.
    page_ext = lookup_page_ext(page);

                                        migrate_pages();
                                        .................
                                    Since all pages are successfully
                                    migrated as part of the offline
                                    operation,send MEM_OFFLINE notification
                                    where for page_ext it calls:
                                    offline_page_ext()-->
                                    __free_page_ext()-->
                                       free_page_ext()-->
                                         vfree(ms->page_ext)
                                       mem_section->page_ext = NULL

    c) Check for the PAGE_EXT
       flags in the page_ext->flags
       access results into the
       use-after-free (leading to
       the translation faults).

    As mentioned above, there is really no synchronization between page_ext
    access and its freeing in the memory_offline.

    The memory offline steps(roughly) on a memory block is as below:

    1) Isolate all the pages

    2) while(1)
      try free the pages to buddy.(->free_list[MIGRATE_ISOLATE])

    3) delete the pages from this buddy list.

    4) Then free page_ext.(Note: The struct page is still alive as it is
       freed only during hot remove of the memory which frees the memmap,
       which steps the user might not perform).

    This design leads to the state where struct page is alive but the struct
    page_ext is freed, where the later is ideally part of the former which
    just representing the page_flags (check [3] for why this design is
    chosen).

    The abovementioned race is just one example __but the problem persists in
    the other paths too involving page_ext->flags access(eg:
    page_is_idle())__.

    Fix all the paths where offline races with page_ext access by maintaining
    synchronization with rcu lock and is achieved in 3 steps:

    1) Invalidate all the page_ext's of the sections of a memory block by
       storing a flag in the LSB of mem_section->page_ext.

    2) Wait until all the existing readers to finish working with the
       ->page_ext's with synchronize_rcu().  Any parallel process that starts
       after this call will not get page_ext, through lookup_page_ext(), for
       the block parallel offline operation is being performed.

    3) Now safely free all sections ->page_ext's of the block on which
       offline operation is being performed.

    Note: If synchronize_rcu() takes time then optimizations can be done in
    this path through call_rcu()[2].

    Thanks to David Hildenbrand for his views/suggestions on the initial
    discussion[1] and Pavan kondeti for various inputs on this patch.

    [1] https://lore.kernel.org/linux-mm/59edde13-4167-8550-86f0-11fc67882107@quicinc.com/
    [2] https://lore.kernel.org/all/a26ce299-aed1-b8ad-711e-a49e82bdd180@quicinc.com/T/#u
    [3] https://lore.kernel.org/all/6fa6b7aa-731e-891c-3efb-a03d6a700efa@redhat.com/

    [quic_charante@quicinc.com: rename label `loop' to `ext_put_continue' per David]
      Link: https://lkml.kernel.org/r/1661496993-11473-1-git-send-email-quic_charante@quicinc.com
    Link: https://lkml.kernel.org/r/1660830600-9068-1-git-send-email-quic_charante@quicinc.com
    Signed-off-by: Charan Teja Kalla <quic_charante@quicinc.com>
    Suggested-by: David Hildenbrand <david@redhat.com>
    Suggested-by: Michal Hocko <mhocko@suse.com>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Acked-by: David Hildenbrand <david@redhat.com>
    Cc: Fernand Sieber <sieberf@amazon.com>
    Cc: Minchan Kim <minchan@google.com>
    Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
    Cc: Pavan Kondeti <quic_pkondeti@quicinc.com>
    Cc: SeongJae Park <sjpark@amazon.de>
    Cc: Shakeel Butt <shakeelb@google.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: William Kucharski <william.kucharski@oracle.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-10-20 06:13:32 -04:00
Chris von Recklinghausen 62026b53d6 mm: page_table_check: move pxx_user_accessible_page into x86
Bugzilla: https://bugzilla.redhat.com/2160210

commit e5a554014618308f046af99ab9c950165ed6cb11
Author: Kefeng Wang <wangkefeng.wang@huawei.com>
Date:   Thu May 12 20:23:06 2022 -0700

    mm: page_table_check: move pxx_user_accessible_page into x86

    The pxx_user_accessible_page() checks the PTE bit, it's
    architecture-specific code, move them into x86's pgtable.h.

    These helpers are being moved out to make the page table check framework
    platform independent.

    Link: https://lkml.kernel.org/r/20220507110114.4128854-3-tongtiangen@huawei.com
    Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
    Signed-off-by: Tong Tiangen <tongtiangen@huawei.com>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:07 -04:00
Chris von Recklinghausen 1e06c29010 mm: page_table_check: using PxD_SIZE instead of PxD_PAGE_SIZE
Bugzilla: https://bugzilla.redhat.com/2160210

commit 92fb05242a1b1ecfcb39d9b1421a165adf344a3c
Author: Tong Tiangen <tongtiangen@huawei.com>
Date:   Thu May 12 20:23:06 2022 -0700

    mm: page_table_check: using PxD_SIZE instead of PxD_PAGE_SIZE

    Patch series "mm: page_table_check: add support on arm64 and riscv", v7.

    Page table check performs extra verifications at the time when new pages
    become accessible from the userspace by getting their page table entries
    (PTEs PMDs etc.) added into the table.  It is supported on X86[1].

    This patchset made some simple changes and make it easier to support new
    architecture, then we support this feature on ARM64 and RISCV.

    [1]https://lore.kernel.org/lkml/20211123214814.3756047-1-pasha.tatashin@soleen.com/

    This patch (of 6):

    Compared with PxD_PAGE_SIZE, which is defined and used only on X86,
    PxD_SIZE is more common in each architecture.  Therefore, it is more
    reasonable to use PxD_SIZE instead of PxD_PAGE_SIZE in page_table_check.c.
    At the same time, it is easier to support page table check in other
    architectures.  The substitution has no functional impact on the x86.

    Link: https://lkml.kernel.org/r/20220507110114.4128854-1-tongtiangen@huawei.com
    Link: https://lkml.kernel.org/r/20220507110114.4128854-2-tongtiangen@huawei.com
    Signed-off-by: Tong Tiangen <tongtiangen@huawei.com>
    Suggested-by: Anshuman Khandual <anshuman.khandual@arm.com>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Kefeng Wang <wangkefeng.wang@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2023-03-24 11:19:07 -04:00
Chris von Recklinghausen 417d05d3ab mm/page_table_check.c: use strtobool for param parsing
Bugzilla: https://bugzilla.redhat.com/2120352

commit 597da28e1abb4ad9f7255cbb57354158fd853e19
Author: Dr. David Alan Gilbert <linux@treblig.org>
Date:   Tue Mar 22 14:48:04 2022 -0700

    mm/page_table_check.c: use strtobool for param parsing

    Use strtobool rather than open coding "on" and "off" parsing.

    Link: https://lkml.kernel.org/r/20220227181038.126926-1-linux@treblig.org
    Signed-off-by: Dr. David Alan Gilbert <linux@treblig.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2022-10-12 07:27:55 -04:00
Chris von Recklinghausen 0490c3338b mm/page_table_check: use unsigned long for page counters and cleanup
Bugzilla: https://bugzilla.redhat.com/2120352

commit 64d8b9e14512ceb7bf11b235faeb8531aeb4d9d3
Author: Pasha Tatashin <pasha.tatashin@soleen.com>
Date:   Thu Feb 3 20:49:15 2022 -0800

    mm/page_table_check: use unsigned long for page counters and cleanup

    For consistency, use "unsigned long" for all page counters.

    Also, reduce code duplication by calling __page_table_check_*_clear()
    from __page_table_check_*_set() functions.

    Link: https://lkml.kernel.org/r/20220131203249.2832273-3-pasha.tatashin@soleen.com
    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Reviewed-by: Wei Xu <weixugc@google.com>
    Acked-by: David Rientjes <rientjes@google.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Paul Turner <pjt@google.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Zi Yan <ziy@nvidia.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2022-10-12 07:27:44 -04:00
Chris von Recklinghausen 8f87de6e6c mm/page_table_check: fix accessing unmapped ptep
Bugzilla: https://bugzilla.redhat.com/2120352

commit 24c8e27e63224ce832b4723cb60632d3eddb55de
Author: Miaohe Lin <linmiaohe@huawei.com>
Date:   Thu May 26 19:33:50 2022 +0800

    mm/page_table_check: fix accessing unmapped ptep

    ptep is unmapped too early, so ptep could theoretically be accessed while
    it's unmapped.  This might become a problem if/when CONFIG_HIGHPTE becomes
    available on riscv.

    Fix it by deferring pte_unmap() until page table checking is done.

    [akpm@linux-foundation.org: account for ptep alteration, per Matthew]
    Link: https://lkml.kernel.org/r/20220526113350.30806-1-linmiaohe@huawei.com
    Fixes: 80110bbfbba6 ("mm/page_table_check: check entries at pmd levels")
    Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
    Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Cc: Qi Zheng <zhengqi.arch@bytedance.com>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: David Rientjes <rientjes@google.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2022-10-12 07:27:21 -04:00
Chris von Recklinghausen 5e370f3598 mm/page_table_check: check entries at pmd levels
Bugzilla: https://bugzilla.redhat.com/2120352

commit 80110bbfbba6f0078d5a1cbc8df004506db8ffe5
Author: Pasha Tatashin <pasha.tatashin@soleen.com>
Date:   Thu Feb 3 20:49:24 2022 -0800

    mm/page_table_check: check entries at pmd levels

    syzbot detected a case where the page table counters were not properly
    updated.

      syzkaller login:  ------------[ cut here ]------------
      kernel BUG at mm/page_table_check.c:162!
      invalid opcode: 0000 [#1] PREEMPT SMP KASAN
      CPU: 0 PID: 3099 Comm: pasha Not tainted 5.16.0+ #48
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIO4
      RIP: 0010:__page_table_check_zero+0x159/0x1a0
      Call Trace:
       free_pcp_prepare+0x3be/0xaa0
       free_unref_page+0x1c/0x650
       free_compound_page+0xec/0x130
       free_transhuge_page+0x1be/0x260
       __put_compound_page+0x90/0xd0
       release_pages+0x54c/0x1060
       __pagevec_release+0x7c/0x110
       shmem_undo_range+0x85e/0x1250
      ...

    The repro involved having a huge page that is split due to uprobe event
    temporarily replacing one of the pages in the huge page.  Later the huge
    page was combined again, but the counters were off, as the PTE level was
    not properly updated.

    Make sure that when PMD is cleared and prior to freeing the level the
    PTEs are updated.

    Link: https://lkml.kernel.org/r/20220131203249.2832273-5-pasha.tatashin@soleen.com
    Fixes: df4e817b7108 ("mm: page table check")
    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Acked-by: David Rientjes <rientjes@google.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Cc: Anshuman Khandual <anshuman.khandual@arm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Paul Turner <pjt@google.com>
    Cc: Wei Xu <weixugc@google.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Zi Yan <ziy@nvidia.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2022-10-12 07:27:14 -04:00
Chris von Recklinghausen 63d42d92cd mm: page table check
Bugzilla: https://bugzilla.redhat.com/2120352

commit df4e817b710809425d899340dbfa8504a3ca4ba5
Author: Pasha Tatashin <pasha.tatashin@soleen.com>
Date:   Fri Jan 14 14:06:37 2022 -0800

    mm: page table check

    Check user page table entries at the time they are added and removed.

    Allows to synchronously catch memory corruption issues related to double
    mapping.

    When a pte for an anonymous page is added into page table, we verify
    that this pte does not already point to a file backed page, and vice
    versa if this is a file backed page that is being added we verify that
    this page does not have an anonymous mapping

    We also enforce that read-only sharing for anonymous pages is allowed
    (i.e.  cow after fork).  All other sharing must be for file pages.

    Page table check allows to protect and debug cases where "struct page"
    metadata became corrupted for some reason.  For example, when refcnt or
    mapcount become invalid.

    Link: https://lkml.kernel.org/r/20211221154650.1047963-4-pasha.tatashin@soleen.com
    Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
    Cc: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Frederic Weisbecker <frederic@kernel.org>
    Cc: Greg Thelen <gthelen@google.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Slaby <jirislaby@kernel.org>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Cc: Mike Rapoport <rppt@kernel.org>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Cc: Paul Turner <pjt@google.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sami Tolvanen <samitolvanen@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Wei Xu <weixugc@google.com>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: Chris von Recklinghausen <crecklin@redhat.com>
2022-10-12 07:27:14 -04:00