The patch titled Subject: mm: ksm: do not block on page lock when searching stable tree has been added to the -mm tree. Its filename is mm-ksm-do-not-block-on-page-lock-when-searching-stable-tree.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-ksm-do-not-block-on-page-lock-when-searching-stable-tree.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-ksm-do-not-block-on-page-lock-when-searching-stable-tree.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/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> Subject: mm: ksm: do not block on page lock when searching stable tree ksmd needs to search the stable tree to look for a suitable KSM page, but the KSM page might be locked for a long time due to the KSM page rmap walk. It is not worth waiting for the lock; the page can be skipped and we can then try to merge it in the next scan to avoid long stalls if its content is still intact. Introduce an async mode to get_ksm_page() to not block on the page lock, as try_to_merge_one_page() does. Return -EBUSY if the trylock fails, since a NULL means failure to find a suitable KSM page, which is a valid case. Link: http://lkml.kernel.org/r/1541618201-120667-2-git-send-email-yang.shi@xxxxxxxxxxxxxxxxx Signed-off-by: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> Cc: Vlastimil Babka <vbabka@xxxxxxx> Cc: Johannes Weiner <hannes@xxxxxxxxxxx> Cc: Hugh Dickins <hughd@xxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxxxx> Cc: Andrea Arcangeli <aarcange@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/ksm.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) --- a/mm/ksm.c~mm-ksm-do-not-block-on-page-lock-when-searching-stable-tree +++ a/mm/ksm.c @@ -667,7 +667,7 @@ static void remove_node_from_stable_tree } /* - * get_ksm_page: checks if the page indicated by the stable node + * __get_ksm_page: checks if the page indicated by the stable node * is still its ksm page, despite having held no reference to it. * In which case we can trust the content of the page, and it * returns the gotten page; but if the page has now been zapped, @@ -685,7 +685,8 @@ static void remove_node_from_stable_tree * a page to put something that might look like our key in page->mapping. * is on its way to being freed; but it is an anomaly to bear in mind. */ -static struct page *get_ksm_page(struct stable_node *stable_node, bool lock_it) +static struct page *__get_ksm_page(struct stable_node *stable_node, + bool lock_it, bool async) { struct page *page; void *expected_mapping; @@ -728,7 +729,14 @@ again: } if (lock_it) { - lock_page(page); + if (async) { + if (!trylock_page(page)) { + put_page(page); + return ERR_PTR(-EBUSY); + } + } else + lock_page(page); + if (READ_ONCE(page->mapping) != expected_mapping) { unlock_page(page); put_page(page); @@ -751,6 +759,11 @@ stale: return NULL; } +static struct page *get_ksm_page(struct stable_node *stable_node, bool lock_it) +{ + return __get_ksm_page(stable_node, lock_it, false); +} + /* * Removing rmap_item from stable or unstable tree. * This function will clean the information from the stable/unstable tree. @@ -1675,7 +1688,11 @@ again: * It would be more elegant to return stable_node * than kpage, but that involves more changes. */ - tree_page = get_ksm_page(stable_node_dup, true); + tree_page = __get_ksm_page(stable_node_dup, true, true); + + if (PTR_ERR(tree_page) == -EBUSY) + return ERR_PTR(-EBUSY); + if (unlikely(!tree_page)) /* * The tree may have been rebalanced, @@ -2062,6 +2079,10 @@ static void cmp_and_merge_page(struct pa /* We first start with searching the page inside the stable tree */ kpage = stable_tree_search(page); + + if (PTR_ERR(kpage) == -EBUSY) + return; + if (kpage == page && rmap_item->head == stable_node) { put_page(kpage); return; _ Patches currently in -mm which might be from yang.shi@xxxxxxxxxxxxxxxxx are mm-vmscan-skip-ksm-page-in-direct-reclaim-if-priority-is-low.patch mm-ksm-do-not-block-on-page-lock-when-searching-stable-tree.patch