tcache_invalidate_node_pages() temporarly drops/takes back node->tree_lock.
Once lock was dropped, another thread might remove and free the next slot.
Don't drop the looks.

https://jira.sw.ru/browse/PSBM-42104

Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>
---
 mm/tcache.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/mm/tcache.c b/mm/tcache.c
index b8757cf..9bb88b4 100644
--- a/mm/tcache.c
+++ b/mm/tcache.c
@@ -121,8 +121,9 @@ static struct tcache_lru *tcache_lru_node;
 /*
  * Locking rules:
  *
- * - tcache_node_tree->lock nests inside tcache_node->tree_lock
- * - tcache_lru->lock is independent
+ *   tcache_node->tree_lock
+ *        tcache_node_tree->lock
+ *        tcache_lru->lock
  */
 
 /* Enable/disable tcache backend (set at boot time) */
@@ -677,16 +678,8 @@ tcache_invalidate_node_pages(struct tcache_node *node)
        radix_tree_for_each_slot(slot, &node->page_tree, &iter, 0) {
                page = radix_tree_deref_slot_protected(slot, &node->tree_lock);
                BUG_ON(!__tcache_page_tree_delete(node, page->index, page));
-               spin_unlock(&node->tree_lock);
-
                tcache_lru_del(page);
                put_page(page);
-
-               local_irq_enable();
-               cond_resched();
-               local_irq_disable();
-
-               spin_lock(&node->tree_lock);
        }
 
        BUG_ON(node->nr_pages != 0);
-- 
2.4.10

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to