[RHEL8,COMMIT] ploop: Use kmem_cache for struct ploop_cow allocation

Submitted by Konstantin Khorenko on Dec. 10, 2019, 3:33 p.m.

Details

Message ID 201912101533.xBAFXE3U024067@finist_co8.work.ct
State New
Series "ploop: Use kmem_cache for struct ploop_cow allocation"
Headers show

Commit Message

Konstantin Khorenko Dec. 10, 2019, 3:33 p.m.
The commit is pushed to "branch-rh8-4.18.0-80.1.2.vz8.2.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh8-4.18.0-80.1.2.vz8.2.6
------>
commit 46c69401490978aad50ef3608fed75de0ba2be63
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Tue Dec 10 18:33:13 2019 +0300

    ploop: Use kmem_cache for struct ploop_cow allocation
    
    This works better under memory pressure. Also note,
    that target registering in dm_ploop_init() changed
    for convenience.
    
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 drivers/md/dm-ploop-map.c    |  4 ++--
 drivers/md/dm-ploop-target.c | 26 ++++++++++++++++----------
 drivers/md/dm-ploop.h        |  1 +
 3 files changed, 19 insertions(+), 12 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 27ad48c5e16a..a67656b2b01e 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -514,7 +514,7 @@  static void complete_cow(struct ploop_cow *cow, blk_status_t bi_status)
 
 	queue_work(ploop->wq, &ploop->worker);
 	free_bio_with_pages(ploop, cow->cluster_bio);
-	kfree(cow);
+	kmem_cache_free(cow_cache, cow);
 }
 
 static void piwb_discard_completed(struct ploop *ploop, bool success,
@@ -1012,7 +1012,7 @@  int submit_cluster_cow(struct ploop *ploop, unsigned int level,
 	if (!bio)
 		goto err;
 
-	cow = kmalloc(sizeof(*cow), GFP_NOIO);
+	cow = kmem_cache_alloc(cow_cache, GFP_NOIO);
 	if (!cow)
 		goto err;
 
diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c
index 904cacade2db..bdeee2334499 100644
--- a/drivers/md/dm-ploop-target.c
+++ b/drivers/md/dm-ploop-target.c
@@ -13,6 +13,7 @@ 
 #define DM_MSG_PREFIX "ploop"
 
 struct kmem_cache *piocb_cache;
+struct kmem_cache *cow_cache;
 
 static void inflight_bios_ref_exit0(struct percpu_ref *ref)
 {
@@ -297,28 +298,33 @@  static struct target_type ploop_target = {
 
 static int __init dm_ploop_init(void)
 {
-	int r;
+	int r = -ENOMEM;
+
+	piocb_cache = kmem_cache_create("ploop-iocb", sizeof(struct ploop_iocb),
+					0, 0, NULL);
+	cow_cache = kmem_cache_create("ploop-cow", sizeof(struct ploop_cow),
+				      0, 0, NULL);
+	if (!piocb_cache || !cow_cache)
+		goto err;
 
 	r = dm_register_target(&ploop_target);
 	if (r) {
 		DMERR("ploop target registration failed: %d", r);
-		return r;
-	}
-
-	piocb_cache = kmem_cache_create("ploop-iocb", sizeof(struct ploop_iocb),
-					0, 0, NULL);
-	if (!piocb_cache) {
-		dm_unregister_target(&ploop_target);
-		return -ENOMEM;
+		goto err;
 	}
 
 	return 0;
+err:
+	kmem_cache_destroy(piocb_cache);
+	kmem_cache_destroy(cow_cache);
+	return r;
 }
 
 static void __exit dm_ploop_exit(void)
 {
-	kmem_cache_destroy(piocb_cache);
 	dm_unregister_target(&ploop_target);
+	kmem_cache_destroy(cow_cache);
+	kmem_cache_destroy(piocb_cache);
 }
 
 module_init(dm_ploop_init);
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 0571e8fe0e79..1dc29e4f5345 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -273,6 +273,7 @@  struct ploop_cow {
 };
 
 extern struct kmem_cache *piocb_cache;
+extern struct kmem_cache *cow_cache;
 
 static inline bool ploop_is_ro(struct ploop *ploop)
 {