On 1/14/20 5:24 PM, Yang Shi wrote: > > > On 1/14/20 5:07 PM, Mike Kravetz wrote: >> On 1/14/20 6:09 AM, Li Xinhai wrote: >>> Add cc to >>> Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> >>> Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> >>> , who has been worked on this part >>> >>> On 2020-01-14 at 17:16 Li Xinhai wrote: >>>> Checking MPOL_MF_STRICT is ignored for HUGETLB vma according to mbind man >>>> page: >>>> >>>> Notes >>>> MPOL_MF_STRICT is ignored on huge page mappings. >>>> >>>> If MPOL_MF_STRICT is specified alone without any MOVE flag, we should >>>> indicate, from test_walk, that walking this vma should be skipped even if >>>> there are misplaced pages. >>>> >>>> Signed-off-by: Li Xinhai <lixinhai.lxh@xxxxxxxxx> >>>> Cc: Michal Hocko <mhocko@xxxxxxxx> >>>> Cc: Mike Kravetz <mike.kravetz@xxxxxxxxxx> >> I do not necessarily disagree with the change. However, this has made me >> question a couple things: >> 1) Why does the man page say MPOL_MF_STRICT is ignored on huge page mappings? >> - Is that leftover from the the days when huge page migration was not >> supported? >> - Is it just because huge page migration is more likely to fail than >> base page migration. >> 2) Does the mbind code function properly when unable to migrate a huge page >> MPOL_MF_STRICT is set? A quick look at the code looks like it returns >> EIO. > > I don't know the answer about question #1 I didn't dig into the history. The queue_pages_hugetlb() returns 0 unconditionally, I think this is what "MPOL_MF_STRICT is ignored on huge page mappings" means in code. > > It would return -EIO for base pages or THP as what the manpage describes. > I was thinking about a migration failure after isolation. This block of code in do_mbind() after queue_pages_range() and mbind_range(). if (!err) { int nr_failed = 0; if (!list_empty(&pagelist)) { WARN_ON_ONCE(flags & MPOL_MF_LAZY); nr_failed = migrate_pages(&pagelist, new_page, NULL, start, MIGRATE_SYNC, MR_MEMPOLICY_MBIND); if (nr_failed) putback_movable_pages(&pagelist); } if ((ret > 0) || (nr_failed && (flags & MPOL_MF_STRICT))) err = -EIO; -- Mike Kravetz