On 4/13/21 6:23 AM, Michal Hocko wrote: > On Tue 13-04-21 12:47:43, Oscar Salvador wrote: >> Currently, the clearing of the flag is done under the lock, but this >> is unnecessary as we just allocated the page and we did not give it >> away yet, so no one should be messing with it. >> >> Also, this helps making clear that here the lock is only protecting the >> counter. > > While moving the flag clearing is ok I am wondering why do we need that > in the first place. I think it is just a leftover from 6c0371490140 > ("hugetlb: convert PageHugeFreed to HPageFreed flag"). Prior to that a tail > page as been used to keep track of the state but now all happens in the > head page and the flag uses page->private which is always initialized > when allocated by the allocator (post_alloc_hook). Yes, this was just left over from 6c0371490140. And, as you mention post_alloc_hook will clear page->private for all non-gigantic pages allocated via buddy. > Or do we need it for giga pages which are not allocated by the page > allocator? If yes then moving it to prep_compound_gigantic_page would be > better. I am pretty sure dynamically allocated giga pages have page->Private cleared as well. It is not obvious, but the alloc_contig_range code used to put together giga pages will end up calling isolate_freepages_range that will call split_map_pages and then post_alloc_hook for each MAX_ORDER block. As mentioned, this is not obvious and I would hate to rely on this behavior not changing. > > So should we just drop it here? The only place where page->private may not be initialized is when we do allocations at boot time from memblock. In this case, we will add the pages to the free list via put_page/free_huge_page so the appropriate flags will be cleared before anyone notices. I'm wondering if we should just do a set_page_private(page, 0) here in prep_new_huge_page since we now use that field for flags. Or, is that overkill? -- Mike Kravetz