> > This should be > > if (!folio->mapping) { > if (folio_test_pmd_mappable(folio)) > count_vm_event(THP_SPLIT_PAGE_FAILED); > return -EBUSY; > } > > Otherwise, a non PMD mappable folio with no mapping will fall through > and cause NULL pointer dereference in mapping_min_folio_order(). Ah, of course. I thought I was being "smart" here to avoid another nesting. Instead of triple nested ifs, I guess this is better: int split_folio_to_list(struct folio *folio, struct list_head *list) { unsigned int min_order = 0; if (folio_test_anon(folio)) goto out; if (!folio->mapping) { if (folio_test_pmd_mappable(folio)) count_vm_event(THP_SPLIT_PAGE_FAILED); return -EBUSY; } min_order = mapping_min_folio_order(folio->mapping); out: return split_huge_page_to_list_to_order(&folio->page, list, min_order); } Let me know what you think! > > > + min_order = mapping_min_folio_order(folio->mapping); > > + } > > + > > + return split_huge_page_to_list_to_order(&folio->page, list, min_order); > > +} > > + > > void __folio_undo_large_rmappable(struct folio *folio) > > { > > struct deferred_split *ds_queue; > > > -- > Best Regards, > Yan, Zi >