When there are more than 2 users of a page, __tcache_page_tree_delete() fails to freeze it. We skip it and never try to freeze the page again.
In this case the page remains not invalidated, and tcache_node->nr_pages never decremented. Later, we catch WARN_ON() reporting about this. The patch fixes the problem. In case of we failed to invalidate a page, we remember that, and return to such pages after others are invalidated. https://jira.sw.ru/browse/PSBM-78354 Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> --- mm/tcache.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mm/tcache.c b/mm/tcache.c index d1a2c53e11a..cbc50d4b8bc 100644 --- a/mm/tcache.c +++ b/mm/tcache.c @@ -903,13 +903,15 @@ tcache_invalidate_node_pages(struct tcache_node *node) struct page *pages[TCACHE_PAGEVEC_SIZE]; pgoff_t index = 0; unsigned nr_pages; + bool repeat; int i; /* * First forbid new page insertions - see tcache_page_tree_replace. */ node->invalidated = true; - +again: + repeat = false; while ((nr_pages = tcache_lookup(pages, node, index, TCACHE_PAGEVEC_SIZE, indices))) { for (i = 0; i < nr_pages; i++) { @@ -925,13 +927,20 @@ tcache_invalidate_node_pages(struct tcache_node *node) tcache_lru_del(node->pool, page, false); local_irq_enable(); tcache_put_page(page); - } else + } else { local_irq_enable(); + repeat = true; + } } cond_resched(); index++; } + if (repeat) { + index = 0; + goto again; + } + WARN_ON(node->nr_pages != 0); } _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel