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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux