The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at 
https://src.openvz.org/scm/ovz/vzkernel.git
after ark-5.14
------>
commit cdcbb410c89ae1e96ffa2ccca5734469b0592f20
Author: Andrey Ryabinin <ryabinin....@gmail.com>
Date:   Thu Sep 30 16:04:01 2021 +0300

    mm/mempool: Use kvmalloc to allocate array of element pointers
    
    The minimal number of mempool elements passed to
    mempool_create()/mempool_resize() could be large enough to
    trigger high order allocation in kmalloc_node(). High order
    allocations are costly and/or may fail if memory is fragmented.
    Since we don't need the array of element pointers to be physically
    contiguous, use kvmalloc_node() to allocate it.
    
    https://jira.sw.ru/browse/HCI-132
    https://pmc.acronis.com/browse/VSTOR-14758
    
    Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>
    
    Reviewed-by: Kirill Tkhai <ktk...@virtuozzo.com>
    
    (cherry-picked from vz7 commit 083d46fa7553 ("mm/mempool: Use kvmalloc to
    allocate array of element pointers"))
    
    Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
    
    (cherry picked from vz8 commit 50362c156f100d9ebdb1ee9c752c69107fbc7fa2)
    Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
 mm/mempool.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/mm/mempool.c b/mm/mempool.c
index 0b8afbec3e35..1cd77ba6a316 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -154,7 +154,7 @@ void mempool_exit(mempool_t *pool)
                void *element = remove_element(pool);
                pool->free(element, pool->pool_data);
        }
-       kfree(pool->elements);
+       kvfree(pool->elements);
        pool->elements = NULL;
 }
 EXPORT_SYMBOL(mempool_exit);
@@ -188,7 +188,7 @@ int mempool_init_node(mempool_t *pool, int min_nr, 
mempool_alloc_t *alloc_fn,
        pool->free      = free_fn;
        init_waitqueue_head(&pool->wait);
 
-       pool->elements = kmalloc_array_node(min_nr, sizeof(void *),
+       pool->elements = kvmalloc_node(min_nr * sizeof(void *),
                                            gfp_mask, node_id);
        if (!pool->elements)
                return -ENOMEM;
@@ -301,6 +301,7 @@ int mempool_resize(mempool_t *pool, int new_min_nr)
        void *element;
        void **new_elements;
        unsigned long flags;
+       void *old_elements = NULL;
 
        BUG_ON(new_min_nr <= 0);
        might_sleep();
@@ -319,7 +320,7 @@ int mempool_resize(mempool_t *pool, int new_min_nr)
        spin_unlock_irqrestore(&pool->lock, flags);
 
        /* Grow the pool */
-       new_elements = kmalloc_array(new_min_nr, sizeof(*new_elements),
+       new_elements = kvmalloc_array(new_min_nr, sizeof(*new_elements),
                                     GFP_KERNEL);
        if (!new_elements)
                return -ENOMEM;
@@ -328,12 +329,12 @@ int mempool_resize(mempool_t *pool, int new_min_nr)
        if (unlikely(new_min_nr <= pool->min_nr)) {
                /* Raced, other resize will do our work */
                spin_unlock_irqrestore(&pool->lock, flags);
-               kfree(new_elements);
+               kvfree(new_elements);
                goto out;
        }
        memcpy(new_elements, pool->elements,
                        pool->curr_nr * sizeof(*new_elements));
-       kfree(pool->elements);
+       old_elements = pool->elements;
        pool->elements = new_elements;
        pool->min_nr = new_min_nr;
 
@@ -354,6 +355,7 @@ int mempool_resize(mempool_t *pool, int new_min_nr)
 out_unlock:
        spin_unlock_irqrestore(&pool->lock, flags);
 out:
+       kvfree(old_elements);
        return 0;
 }
 EXPORT_SYMBOL(mempool_resize);
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to