]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/rtrs-srv: Do not use mempool for page allocation
authorJack Wang <jinpu.wang@ionos.com>
Tue, 12 Jul 2022 10:31:13 +0000 (12:31 +0200)
committerLeon Romanovsky <leonro@nvidia.com>
Mon, 18 Jul 2022 09:28:06 +0000 (12:28 +0300)
The mempool is for guaranteed memory allocation during
extreme VM load (see the header of mempool.c of the kernel).
But rtrs-srv allocates pages only when creating new session.
There is no need to use the mempool.

With the removal of mempool, rtrs-server no longer need to reserve
huge mount of memory, this will avoid error like this:
https://lore.kernel.org/lkml/20220620020727.GA3669@xsang-OptiPlex-9020/

Link: https://lore.kernel.org/r/20220712103113.617754-6-haris.iqbal@ionos.com
Reported-by: kernel test robot <oliver.sang@intel.com>
Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Acked-by: Guoqing Jiang <guoqing.jiang@linux.dev>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/ulp/rtrs/rtrs-srv.c

index 8278d3600a366227047f2507372cbadb727d32a3..34c03bde50641b5ffcdfb51ec3748925947cd2da 100644 (file)
@@ -11,7 +11,6 @@
 #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt
 
 #include <linux/module.h>
-#include <linux/mempool.h>
 
 #include "rtrs-srv.h"
 #include "rtrs-log.h"
@@ -26,11 +25,7 @@ MODULE_LICENSE("GPL");
 #define DEFAULT_SESS_QUEUE_DEPTH 512
 #define MAX_HDR_SIZE PAGE_SIZE
 
-/* We guarantee to serve 10 paths at least */
-#define CHUNK_POOL_SZ 10
-
 static struct rtrs_rdma_dev_pd dev_pd;
-static mempool_t *chunk_pool;
 struct class *rtrs_dev_class;
 static struct rtrs_srv_ib_ctx ib_ctx;
 
@@ -1358,7 +1353,7 @@ static void free_srv(struct rtrs_srv_sess *srv)
 
        WARN_ON(refcount_read(&srv->refcount));
        for (i = 0; i < srv->queue_depth; i++)
-               mempool_free(srv->chunks[i], chunk_pool);
+               __free_pages(srv->chunks[i], get_order(max_chunk_size));
        kfree(srv->chunks);
        mutex_destroy(&srv->paths_mutex);
        mutex_destroy(&srv->paths_ev_mutex);
@@ -1411,7 +1406,8 @@ static struct rtrs_srv_sess *get_or_create_srv(struct rtrs_srv_ctx *ctx,
                goto err_free_srv;
 
        for (i = 0; i < srv->queue_depth; i++) {
-               srv->chunks[i] = mempool_alloc(chunk_pool, GFP_KERNEL);
+               srv->chunks[i] = alloc_pages(GFP_KERNEL,
+                                            get_order(max_chunk_size));
                if (!srv->chunks[i])
                        goto err_free_chunks;
        }
@@ -1424,7 +1420,7 @@ static struct rtrs_srv_sess *get_or_create_srv(struct rtrs_srv_ctx *ctx,
 
 err_free_chunks:
        while (i--)
-               mempool_free(srv->chunks[i], chunk_pool);
+               __free_pages(srv->chunks[i], get_order(max_chunk_size));
        kfree(srv->chunks);
 
 err_free_srv:
@@ -2273,14 +2269,10 @@ static int __init rtrs_server_init(void)
                       err);
                return err;
        }
-       chunk_pool = mempool_create_page_pool(sess_queue_depth * CHUNK_POOL_SZ,
-                                             get_order(max_chunk_size));
-       if (!chunk_pool)
-               return -ENOMEM;
        rtrs_dev_class = class_create(THIS_MODULE, "rtrs-server");
        if (IS_ERR(rtrs_dev_class)) {
                err = PTR_ERR(rtrs_dev_class);
-               goto out_chunk_pool;
+               goto out_err;
        }
        rtrs_wq = alloc_workqueue("rtrs_server_wq", 0, 0);
        if (!rtrs_wq) {
@@ -2292,9 +2284,7 @@ static int __init rtrs_server_init(void)
 
 out_dev_class:
        class_destroy(rtrs_dev_class);
-out_chunk_pool:
-       mempool_destroy(chunk_pool);
-
+out_err:
        return err;
 }
 
@@ -2302,7 +2292,6 @@ static void __exit rtrs_server_exit(void)
 {
        destroy_workqueue(rtrs_wq);
        class_destroy(rtrs_dev_class);
-       mempool_destroy(chunk_pool);
        rtrs_rdma_dev_pd_deinit(&dev_pd);
 }