Re: [PATCH v9 04/10] mm: split a folio in minimum folio order chunks

Pankaj Raghav (Samsung)
2024-07-09T11:04:38Z

>
> 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
>