Commit 46195de3 authored by Jack Wang's avatar Jack Wang Committed by Leon Romanovsky

RDMA/rtrs-srv: Do not use mempool for page allocation

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.comReported-by: default avatarkernel test robot <oliver.sang@intel.com>
Signed-off-by: default avatarGioh Kim <gi-oh.kim@ionos.com>
Signed-off-by: default avatarJack Wang <jinpu.wang@ionos.com>
Signed-off-by: default avatarMd Haris Iqbal <haris.iqbal@ionos.com>
Acked-by: default avatarGuoqing Jiang <guoqing.jiang@linux.dev>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent c14adff2
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME " L" __stringify(__LINE__) ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/mempool.h>
#include "rtrs-srv.h" #include "rtrs-srv.h"
#include "rtrs-log.h" #include "rtrs-log.h"
...@@ -26,11 +25,7 @@ MODULE_LICENSE("GPL"); ...@@ -26,11 +25,7 @@ MODULE_LICENSE("GPL");
#define DEFAULT_SESS_QUEUE_DEPTH 512 #define DEFAULT_SESS_QUEUE_DEPTH 512
#define MAX_HDR_SIZE PAGE_SIZE #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 struct rtrs_rdma_dev_pd dev_pd;
static mempool_t *chunk_pool;
struct class *rtrs_dev_class; struct class *rtrs_dev_class;
static struct rtrs_srv_ib_ctx ib_ctx; static struct rtrs_srv_ib_ctx ib_ctx;
...@@ -1358,7 +1353,7 @@ static void free_srv(struct rtrs_srv_sess *srv) ...@@ -1358,7 +1353,7 @@ static void free_srv(struct rtrs_srv_sess *srv)
WARN_ON(refcount_read(&srv->refcount)); WARN_ON(refcount_read(&srv->refcount));
for (i = 0; i < srv->queue_depth; i++) 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); kfree(srv->chunks);
mutex_destroy(&srv->paths_mutex); mutex_destroy(&srv->paths_mutex);
mutex_destroy(&srv->paths_ev_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, ...@@ -1411,7 +1406,8 @@ static struct rtrs_srv_sess *get_or_create_srv(struct rtrs_srv_ctx *ctx,
goto err_free_srv; goto err_free_srv;
for (i = 0; i < srv->queue_depth; i++) { 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]) if (!srv->chunks[i])
goto err_free_chunks; goto err_free_chunks;
} }
...@@ -1424,7 +1420,7 @@ static struct rtrs_srv_sess *get_or_create_srv(struct rtrs_srv_ctx *ctx, ...@@ -1424,7 +1420,7 @@ static struct rtrs_srv_sess *get_or_create_srv(struct rtrs_srv_ctx *ctx,
err_free_chunks: err_free_chunks:
while (i--) while (i--)
mempool_free(srv->chunks[i], chunk_pool); __free_pages(srv->chunks[i], get_order(max_chunk_size));
kfree(srv->chunks); kfree(srv->chunks);
err_free_srv: err_free_srv:
...@@ -2273,14 +2269,10 @@ static int __init rtrs_server_init(void) ...@@ -2273,14 +2269,10 @@ static int __init rtrs_server_init(void)
err); err);
return 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"); rtrs_dev_class = class_create(THIS_MODULE, "rtrs-server");
if (IS_ERR(rtrs_dev_class)) { if (IS_ERR(rtrs_dev_class)) {
err = PTR_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); rtrs_wq = alloc_workqueue("rtrs_server_wq", 0, 0);
if (!rtrs_wq) { if (!rtrs_wq) {
...@@ -2292,9 +2284,7 @@ static int __init rtrs_server_init(void) ...@@ -2292,9 +2284,7 @@ static int __init rtrs_server_init(void)
out_dev_class: out_dev_class:
class_destroy(rtrs_dev_class); class_destroy(rtrs_dev_class);
out_chunk_pool: out_err:
mempool_destroy(chunk_pool);
return err; return err;
} }
...@@ -2302,7 +2292,6 @@ static void __exit rtrs_server_exit(void) ...@@ -2302,7 +2292,6 @@ static void __exit rtrs_server_exit(void)
{ {
destroy_workqueue(rtrs_wq); destroy_workqueue(rtrs_wq);
class_destroy(rtrs_dev_class); class_destroy(rtrs_dev_class);
mempool_destroy(chunk_pool);
rtrs_rdma_dev_pd_deinit(&dev_pd); rtrs_rdma_dev_pd_deinit(&dev_pd);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment