mm: reimplement compound_order()
Make compound_order() use struct folio. It can't be turned into a wrapper around folio_order() as a page can be turned into a tail page between a check in compound_order() and the assertion in folio_test_large(). Link: https://lkml.kernel.org/r/20230111142915.1001531-17-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Родитель
1aa4d03b60
Коммит
5eb5cea11d
|
@ -719,11 +719,20 @@ int vma_is_stack_for_current(struct vm_area_struct *vma);
|
|||
struct mmu_gather;
|
||||
struct inode;
|
||||
|
||||
/*
|
||||
* compound_order() can be called without holding a reference, which means
|
||||
* that niceties like page_folio() don't work. These callers should be
|
||||
* prepared to handle wild return values. For example, PG_head may be
|
||||
* set before _folio_order is initialised, or this may be a tail page.
|
||||
* See compaction.c for some good examples.
|
||||
*/
|
||||
static inline unsigned int compound_order(struct page *page)
|
||||
{
|
||||
if (!PageHead(page))
|
||||
struct folio *folio = (struct folio *)page;
|
||||
|
||||
if (!test_bit(PG_head, &folio->flags))
|
||||
return 0;
|
||||
return page[1].compound_order;
|
||||
return folio->_folio_order;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Загрузка…
Ссылка в новой задаче