On Tue, Mar 12, 2024 at 03:07:39PM +0800, Miaohe Lin wrote: > On 2024/3/11 20:31, Matthew Wilcox wrote: > > Assuming we have a refcount on this page so it can't be simultaneously > > split/freed/whatever, these three sequences are equivalent: > > If page is stable after page refcnt is held, I agree below three sequences are equivalent. > > > > > 1 if (PageCompound(p)) > > > > 2 struct page *head = compound_head(p); > > 2 if (PageHead(head)) > > > > 3 struct folio *folio = page_folio(p); > > 3 if (folio_test_large(folio)) > > > > . > > > > But please see below commit: > > """ > commit f37d4298aa7f8b74395aa13c728677e2ed86fdaf > Author: Andi Kleen <ak@xxxxxxxxxxxxxxx> > Date: Wed Aug 6 16:06:49 2014 -0700 > > hwpoison: fix race with changing page during offlining > > When a hwpoison page is locked it could change state due to parallel > modifications. The original compound page can be torn down and then > this 4k page becomes part of a differently-size compound page is is a > standalone regular page. > > Check after the lock if the page is still the same compound page. I can't speak to what the rules were ten years ago, but this is not true now. Compound pages cannot be split if you hold a refcount. Since we don't track a per-page refcount, we wouldn't know which of the split pages to give the excess refcount to.