On Mon, 2022-12-19 at 15:53 +0800, Chao Peng wrote: > > > > [...] > > > > > + > > > + /* > > > + * These pages are currently unmovable so don't place them into > > > movable > > > + * pageblocks (e.g. CMA and ZONE_MOVABLE). > > > + */ > > > + mapping = memfd->f_mapping; > > > + mapping_set_unevictable(mapping); > > > + mapping_set_gfp_mask(mapping, > > > + mapping_gfp_mask(mapping) & ~__GFP_MOVABLE); > > > > But, IIUC removing __GFP_MOVABLE flag here only makes page allocation from > > non- > > movable zones, but doesn't necessarily prevent page from being migrated. My > > first glance is you need to implement either a_ops->migrate_folio() or just > > get_page() after faulting in the page to prevent. > > The current api restrictedmem_get_page() already does this, after the > caller calling it, it holds a reference to the page. The caller then > decides when to call put_page() appropriately. I tried to dig some history. Perhaps I am missing something, but it seems Kirill said in v9 that this code doesn't prevent page migration, and we need to increase page refcount in restrictedmem_get_page(): https://lore.kernel.org/linux-mm/20221129112139.usp6dqhbih47qpjl@xxxxxxxxxxxxxxxxx/ But looking at this series it seems restrictedmem_get_page() in this v10 is identical to the one in v9 (except v10 uses 'folio' instead of 'page')? Anyway if this is not fixed, then it should be fixed. Otherwise, a comment at the place where page refcount is increased will be helpful to help people understand page migration is actually prevented.