[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20260116062535.306453-2-robin.kuo@mediatek.com>
Date: Fri, 16 Jan 2026 14:25:00 +0800
From: <robin.kuo@...iatek.com>
To: <robin.kuo@...iatek.com>, <akpm@...ux-foundation.org>, <ryncsn@...il.com>,
Chris Li <chrisl@...nel.org>, Kairui Song <kasong@...cent.com>, Kemeng Shi
<shikemeng@...weicloud.com>, Nhat Pham <nphamcs@...il.com>, Baoquan He
<bhe@...hat.com>, Barry Song <baohua@...nel.org>, Matthias Brugger
<matthias.bgg@...il.com>, AngeloGioacchino Del Regno
<angelogioacchino.delregno@...labora.com>
CC: <wsd_upstream@...iatek.com>, <casper.li@...iatek.com>,
<chinwen.chang@...iatek.com>, <Andrew.Yang@...iatek.com>,
<Qun-wei.Lin@...iatek.com>, <linux-mm@...ck.org>,
<linux-kernel@...r.kernel.org>, <linux-arm-kernel@...ts.infradead.org>,
<linux-mediatek@...ts.infradead.org>
Subject: [PATCH v2 1/1] mm, swap: Restore swap_space attr aviod krn panic
From: "robin.kuo" <robin.kuo@...iatek.com>
commit 8b47299a411a ("mm, swap: mark swap address space ro and add
context debug check") made the swap address space read-only.
It may lead to kernel panic if arch_prepare_to_swap returns a failure
under heavy memory pressure as follows,
el1_abort+0x40/0x64
el1h_64_sync_handler+0x48/0xcc
el1h_64_sync+0x84/0x88
errseq_set+0x4c/0xb8 (P)
__filemap_set_wb_err+0x20/0xd0
shrink_folio_list+0xc20/0x11cc
evict_folios+0x1520/0x1be4
try_to_shrink_lruvec+0x27c/0x3dc
shrink_one+0x9c/0x228
shrink_node+0xb3c/0xeac
do_try_to_free_pages+0x170/0x4f0
try_to_free_pages+0x334/0x534
__alloc_pages_direct_reclaim+0x90/0x158
__alloc_pages_slowpath+0x334/0x588
__alloc_frozen_pages_noprof+0x224/0x2fc
__folio_alloc_noprof+0x14/0x64
vma_alloc_zeroed_movable_folio+0x34/0x44
do_pte_missing+0xad4/0x1040
handle_mm_fault+0x4a4/0x790
do_page_fault+0x288/0x5f8
do_translation_fault+0x38/0x54
do_mem_abort+0x54/0xa8
Restore swap address space as not ro to avoid the panic.
Signed-off-by: robin.kuo <robin.kuo@...iatek.com>
---
mm/swap.h | 2 +-
mm/swap_state.c | 3 +--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/mm/swap.h b/mm/swap.h
index d034c13d8dd2..1bd466da3039 100644
--- a/mm/swap.h
+++ b/mm/swap.h
@@ -198,7 +198,7 @@ int swap_writeout(struct folio *folio, struct swap_iocb **swap_plug);
void __swap_writepage(struct folio *folio, struct swap_iocb **swap_plug);
/* linux/mm/swap_state.c */
-extern struct address_space swap_space __ro_after_init;
+extern struct address_space swap_space __read_mostly;
static inline struct address_space *swap_address_space(swp_entry_t entry)
{
return &swap_space;
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 5f97c6ae70a2..44d228982521 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -37,8 +37,7 @@ static const struct address_space_operations swap_aops = {
#endif
};
-/* Set swap_space as read only as swap cache is handled by swap table */
-struct address_space swap_space __ro_after_init = {
+struct address_space swap_space __read_mostly = {
.a_ops = &swap_aops,
};
--
2.45.2
Powered by blists - more mailing lists