On Mon 22-02-21 14:51:37, Oscar Salvador wrote: [...] > @@ -2394,9 +2397,19 @@ bool isolate_or_dissolve_huge_page(struct page *page) > */ > if (hstate_is_gigantic(h)) > return ret; > - > - if (!page_count(head) && alloc_and_dissolve_huge_page(h, head)) > +retry: > + if (page_count(head) && isolate_huge_page(head, list)) { > ret = true; > + } else if (!page_count(head)) { This is rather head spinning. Do we need to test page_count in the else branch? Do you want to optimize for a case where the page cannot be isolated because of page_huge_active? > + int err = alloc_and_dissolve_huge_page(h, head); > + > + if (!err) { > + ret = true; > + } else if (err == -EBUSY && try_again) { > + try_again = false; > + goto retry; > + } Is this retry once logic really needed? Does it really give us any real benefit? alloc_and_dissolve_huge_page already retries when the page is being freed. -- Michal Hocko SUSE Labs