On Tue, 2 Aug 2022 01:31:55 +0800 Kairui Song <ryncsn@xxxxxxxxx> wrote: > From: Kairui Song <kasong@xxxxxxxxxxx> > > folio_entire_mapcount will call PageHeadHuge which is a function call, > and blocks the compiler from recognizing this redundant load. Did you mean folio_test_hugetlb() rather than folio_entire_mapcount()? > After rearranging the code, stack usage is dropped from 32 to 24, and > the function size is smaller (tested on GCC 12): > > Before: > Stack usage: > mm/util.c:845:5:folio_mapcount 32 static > Size: > 0000000000000ea0 00000000000000c7 T folio_mapcount > > After: > Stack usage: > mm/util.c:845:5:folio_mapcount 24 static > Size: > 0000000000000ea0 00000000000000b0 T folio_mapcount > > ... > > @@ -850,10 +850,10 @@ int folio_mapcount(struct folio *folio) > return atomic_read(&folio->_mapcount) + 1; > > compound = folio_entire_mapcount(folio); > - nr = folio_nr_pages(folio); > if (folio_test_hugetlb(folio)) > return compound; > ret = compound; > + nr = folio_nr_pages(folio); > for (i = 0; i < nr; i++) > ret += atomic_read(&folio_page(folio, i)->_mapcount) + 1; > /* File pages has compound_mapcount included in _mapcount */ > -- > 2.35.2