The patch titled Subject: mm: add non-lru movable page support document has been added to the -mm tree. Its filename is mm-add-non-lru-movable-page-support-document.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-add-non-lru-movable-page-support-document.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-add-non-lru-movable-page-support-document.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Minchan Kim <minchan@xxxxxxxxxx> Subject: mm: add non-lru movable page support document Describe what a subsystem should do for non-lru movable page supporting. Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx> Cc: Jonathan Corbet <corbet@xxxxxxx> Cc: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> Cc: Konstantin Khlebnikov <koct9i@xxxxxxxxx> Cc: Rafael Aquini <aquini@xxxxxxxxxx> Cc: Russ Knize <rknize@xxxxxxxxxxxx> Cc: Mel Gorman <mgorman@xxxxxxx> Cc: Hugh Dickins <hughd@xxxxxxxxxx> Cc: Sergey Senozhatsky <sergey.senozhatsky@xxxxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Cc: Gioh Kim <gi-oh.kim@xxxxxxxxxxxxxxxx> Cc: Sangseok Lee <sangseok.lee@xxxxxxx> Cc: Chan Gyun Jeong <chan.jeong@xxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: YiPing Xu <xuyiping@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- Documentation/filesystems/vfs.txt | 11 ++++ Documentation/vm/page_migration | 69 +++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff -puN Documentation/filesystems/vfs.txt~mm-add-non-lru-movable-page-support-document Documentation/filesystems/vfs.txt --- a/Documentation/filesystems/vfs.txt~mm-add-non-lru-movable-page-support-document +++ a/Documentation/filesystems/vfs.txt @@ -752,12 +752,21 @@ struct address_space_operations { and transfer data directly between the storage and the application's address space. + isolate_page: Called by the VM when isolating a movable non-lru page. + If page is successfully isolated, we should mark the page as + PG_isolated via __SetPageIsolated. + migrate_page: This is used to compact the physical memory usage. If the VM wants to relocate a page (maybe off a memory card that is signalling imminent failure) it will pass a new page and an old page to this function. migrate_page should transfer any private data across and update any references - that it has to the page. + that it has to the page. If migrated page is non-lru page, + we should clear PG_isolated and PG_movable via __ClearPageIsolated + and __ClearPageMovable. + + putback_page: Called by the VM when isolated page's migration fails. + We should clear PG_isolated marked in isolated_page function. launder_page: Called before freeing a page - it writes back the dirty page. To prevent redirtying the page, it is kept locked during the whole diff -puN Documentation/vm/page_migration~mm-add-non-lru-movable-page-support-document Documentation/vm/page_migration --- a/Documentation/vm/page_migration~mm-add-non-lru-movable-page-support-document +++ a/Documentation/vm/page_migration @@ -142,5 +142,72 @@ Steps: 20. The new page is moved to the LRU and can be scanned by the swapper etc again. -Christoph Lameter, May 8, 2006. +C. Non-LRU Page migration +------------------------- + +Although original migration aimed for reducing the latency of memory access +for NUMA, compaction who want to create high-order page is also main customer. + +Ppage migration's disadvantage is that it was designed to migrate only +*LRU* pages. However, there are potential non-lru movable pages which can be +migrated in system, for example, zsmalloc, virtio-balloon pages. +For virtio-balloon pages, some parts of migration code path was hooked up +and added virtio-balloon specific functions to intercept logi. +It's too specific to one subsystem so other subsystem who want to make +their pages movable should add own specific hooks in migration path. + +To solve such problem, VM supports non-LRU page migration which provides +generic functions for non-LRU movable pages without needing subsystem +specific hook in mm/{migrate|compact}.c. + +If a subsystem want to make own pages movable, it should mark pages as +PG_movable via __SetPageMovable. __SetPageMovable needs address_space for +argument for register functions which will be called by VM. + +Three functions in address_space_operation related to non-lru movable page: + + bool (*isolate_page) (struct page *, isolate_mode_t); + int (*migratepage) (struct address_space *, + struct page *, struct page *, enum migrate_mode); + void (*putback_page)(struct page *); + +1. Isolation + +What VM expected on isolate_page of subsystem is to set PG_isolated flags +of the page if it was successful. With that, concurrent isolation among +CPUs skips the isolated page by other CPU earlier. VM calls isolate_page +under PG_lock of page. If a subsystem cannot isolate the page, it should +return false. +2. Migration + +After successful isolation, VM calls migratepage. The migratepage's goal is +to move content of the old page to new page and set up struct page fields +of new page. If migration is successful, subsystem should release old page's +refcount to free. Keep in mind that subsystem should clear PG_movable and +PG_isolated before releasing the refcount. If everything are done, user +should return MIGRATEPAGE_SUCCESS. If subsystem cannot migrate the page +at the moment, migratepage can return -EAGAIN. On -EAGAIN, VM will retry page +migration because VM interprets -EAGAIN as "temporal migration failure". + +3. Putback + +If migration was unsuccessful, VM calls putback_page. The subsystem should +insert isolated page to own data structure again if it has. And subsystem +should clear PG_isolated which was marked in isolation step. + +Note about releasing page: + +Subsystem can release pages whenever it want but if it releses the page +which is already isolated, it should clear PG_isolated but doesn't touch +PG_movable under PG_lock. Instead of it, VM will clear PG_movable after +his job done. Otherweise, subsystem should clear both page flags before +releasing the page. + +Note about PG_isolated: + +PG_isolated check on a page is valid only if the page's flag is already +set to PG_movable. + +Christoph Lameter, May 8, 2006. +Minchan Kim, Mar 28, 2016. _ Patches currently in -mm which might be from minchan@xxxxxxxxxx are zsmalloc-use-first_page-rather-than-page.patch zsmalloc-clean-up-many-bug_on.patch zsmalloc-reordering-function-parameter.patch zsmalloc-remove-unused-pool-param-in-obj_free.patch mm-use-put_page-to-free-page-instead-of-putback_lru_page.patch mm-compaction-support-non-lru-movable-page-migration.patch mm-add-non-lru-movable-page-support-document.patch mm-balloon-use-general-movable-page-feature-into-balloon.patch zsmalloc-keep-max_object-in-size_class.patch zsmalloc-squeeze-inuse-into-page-mapping.patch zsmalloc-remove-page_mapcount_reset.patch zsmalloc-squeeze-freelist-into-page-mapping.patch zsmalloc-move-struct-zs_meta-from-mapping-to-freelist.patch zsmalloc-factor-page-chain-functionality-out.patch zsmalloc-separate-free_zspage-from-putback_zspage.patch zsmalloc-zs_compact-refactoring.patch zsmalloc-migrate-head-page-of-zspage.patch zsmalloc-use-single-linked-list-for-page-chain.patch zsmalloc-migrate-tail-pages-in-zspage.patch zram-use-__gfp_movable-for-memory-allocation.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html