From: Gaosheng Cui Date: Thu, 24 Oct 2024 03:23:00 +0000 (+0800) Subject: mm/ksm: add missing IS_ERR_OR_NULL check for stable_tree_search() X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=7b835854a95663680686d0c0150a6bca813981cf;p=users%2Fjedix%2Flinux-maple.git mm/ksm: add missing IS_ERR_OR_NULL check for stable_tree_search() The stable_tree_search() maybe return -EBUSY if the stable node's page is being migrated or nullptr, we need to check kfolio with IS_ERR_OR_NULL() before dereference it. To mitigate this, add IS_ERR_OR_NULL check for stable_tree_search(). Link: https://lkml.kernel.org/r/20241024032300.2501949-1-cuigaosheng1@huawei.com Signed-off-by: Gaosheng Cui Cc: Alex Shi Cc: David Hildenbrand Cc: "Matthew Wilcox (Oracle)" Signed-off-by: Andrew Morton --- diff --git a/mm/ksm.c b/mm/ksm.c index 6f33f970627b6..f5957bbfcd2f6 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -1787,7 +1787,7 @@ static __always_inline struct folio *chain(struct ksm_stable_node **s_n_d, * with identical content to the page that we are scanning right now. * * This function returns the stable tree node of identical content if found, - * NULL otherwise. + * -EBUSY if the stable node's page is being migrated, NULL otherwise. */ static struct folio *stable_tree_search(struct page *page) { @@ -2261,7 +2261,8 @@ static void cmp_and_merge_page(struct page *page, struct ksm_rmap_item *rmap_ite /* Start by searching for the folio in the stable tree */ kfolio = stable_tree_search(page); - if (&kfolio->page == page && rmap_item->head == stable_node) { + if (!IS_ERR_OR_NULL(kfolio) && &kfolio->page == page && + rmap_item->head == stable_node) { folio_put(kfolio); return; }