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 <ktk...@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 <ktk...@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(-) 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) { _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel