On 16.06.20 19:03, Dan Williams wrote: > On Tue, Jun 16, 2020 at 10:00 AM Dan Williams <dan.j.williams@xxxxxxxxx> wrote: >> >> On Tue, Jun 16, 2020 at 5:51 AM Michal Hocko <mhocko@xxxxxxxxxx> wrote: >>> >>> On Tue 16-06-20 13:52:12, David Hildenbrand wrote: >>>> Commit e900a918b098 ("mm: shuffle initial free memory to improve >>>> memory-side-cache utilization") introduced shuffling of free pages >>>> during system boot and whenever we online memory blocks. >>>> >>>> However, whenever we online memory blocks, all pages that will be >>>> exposed to the buddy end up getting freed via __free_one_page(). In the >>>> general case, we free these pages in MAX_ORDER - 1 chunks, which >>>> corresponds to the shuffle order. >>>> >>>> Inside __free_one_page(), we will already shuffle the newly onlined pages >>>> using "to_tail = shuffle_pick_tail();". Drop explicit zone shuffling on >>>> memory hotplug. > > This was already explained in the initial patch submission. The > shuffle_pick_tail() shuffling at run time is only sufficient for > maintaining the shuffle. It's not sufficient for effectively > randomizing the free list. Thanks for pointing that out. Something like that should definitely belong into the code in form of a comment. I'll think of something. Tow things: 1. The "shuffle when onlining" is really sub-optimal. Assume you hotplug a 64GB DIMM. With 128MB memory blocks you get 512 zone shuffles. I guess something better would have been to schedule a reshuffle some ms in the future. 2. You'll run into the same issue whenever you free a bigger, consecutive range. Like free_contig_rang()'ing one or more multiple gigantic pages. We might want to reshuffle (or schedule a reshuffle) here as well. -- Thanks, David / dhildenb