On 3/20/24 7:02 PM, Johannes Weiner wrote: > There are three freeing paths that read the page's migratetype > optimistically before grabbing the zone lock. When this races with > block stealing, those pages go on the wrong freelist. > > The paths in question are: > - when freeing >costly orders that aren't THP > - when freeing pages to the buddy upon pcp lock contention > - when freeing pages that are isolated > - when freeing pages initially during boot > - when freeing the remainder in alloc_pages_exact() > - when "accepting" unaccepted VM host memory before first use > - when freeing pages during unpoisoning > > None of these are so hot that they would need this optimization at the > cost of hampering defrag efforts. Especially when contrasted with the > fact that the most common buddy freeing path - free_pcppages_bulk - is > checking the migratetype under the zone->lock just fine. > > In addition, isolated pages need to look up the migratetype under the > lock anyway, which adds branches to the locked section, and results in > a double lookup when the pages are in fact isolated. > > Move the lookups into the lock. > > Reported-by: Vlastimil Babka <vbabka@xxxxxxx> > Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx> Reviewed-by: Vlastimil Babka <vbabka@xxxxxxx>