On Fri, Oct 18, 2019 at 11:15 AM Dave Hansen <dave.hansen@xxxxxxxxx> wrote: > > On 10/17/19 10:30 AM, Yang Shi wrote: > >> + if (!PageHuge(page)) { > >> + int rc = migrate_demote_mapping(page); > >> + > >> + /* > >> + * -ENOMEM on a THP may indicate either migration is > >> + * unsupported or there was not enough contiguous > >> + * space. Split the THP into base pages and retry the > >> + * head immediately. The tail pages will be considered > >> + * individually within the current loop's page list. > >> + */ > >> + if (rc == -ENOMEM && PageTransHuge(page) && > >> + !split_huge_page_to_list(page, page_list)) > >> + rc = migrate_demote_mapping(page); > > I recalled when Keith posted the patch at the first time, I raised > > question about why not just migrating THP in a whole? The > > migrate_pages() could handle this. If it fails, it just fallbacks to > > base page. > > There's a pair of migrate_demote_mapping()s in there. I expected that > the first will migrate the whole THP and the second plus the split is > only used if fails the whole migration. Ah, that's right. I mis-read the first migrate_demote_mapping(). But, why calling migrate_demote_mapping() twice for THP and base page (if THP is failed) instead of calling migrate_pages() that does deal with all the cases. > > Am I reading it wrong?