@@ -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;
}
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(). Fixes: 15605244fdce ("ksm: convert cmp_and_merge_page() to use a folio") Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com> --- mm/ksm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)