[RFC 0/8] Hardening page _refcount

From: Pasha Tatashin
Date: Tue Oct 26 2021 - 13:38:29 EST


It is hard to root cause _refcount problems, because they usually
manifest after the damage has occurred. Yet, they can lead to
catastrophic failures such memory corruptions.

Improve debugability by adding more checks that ensure that
page->_refcount never turns negative (i.e. double free does not
happen, or free after freeze etc).

- Check for overflow and underflow right from the functions that
modify _refcount
- Remove set_page_count(), so we do not unconditionally overwrite
_refcount with an unrestrained value
- Trace return values in all functions that modify _refcount

Applies against v5.15-rc7. Boot tested in QEMU.

Pasha Tatashin (8):
mm: add overflow and underflow checks for page->_refcount
mm/hugetlb: remove useless set_page_count()
mm: Avoid using set_page_count() in set_page_recounted()
mm: remove set_page_count() from page_frag_alloc_align
mm: avoid using set_page_count() when pages are freed into allocator
mm: rename init_page_count() -> page_ref_init()
mm: remove set_page_count()
mm: simplify page_ref_* functions

arch/m68k/mm/motorola.c | 2 +-
include/linux/mm.h | 2 +-
include/linux/page_ref.h | 116 ++++++++++++++++----------------
include/trace/events/page_ref.h | 66 +++++++++++-------
mm/debug_page_ref.c | 22 ++----
mm/hugetlb.c | 2 +-
mm/internal.h | 5 +-
mm/page_alloc.c | 19 ++++--
8 files changed, 125 insertions(+), 109 deletions(-)

--
2.33.0.1079.g6e70778dc9-goog