From: Liu Yuan <tailai...@taobao.com> Though it won't help the performance much, but let's do our best for performance
Signed-off-by: Liu Yuan <namei.u...@gmail.com> --- sbd/sbd.h | 2 ++ sbd/sheep.c | 38 +++++++++++++++++++++++++++++++------- sbd/sheep_block_device.c | 13 ++++++++++--- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/sbd/sbd.h b/sbd/sbd.h index 5625867..ee8f07d 100644 --- a/sbd/sbd.h +++ b/sbd/sbd.h @@ -108,6 +108,8 @@ int sheep_setup_vdi(struct sbd_device *dev); struct sheep_aiocb *sheep_aiocb_setup(struct request *req); int sheep_aiocb_submit(struct sheep_aiocb *aiocb); int sheep_handle_reply(struct sbd_device *dev); +int sheep_slab_create(void); +void sheep_slab_destroy(void); static inline int sbd_dev_id_to_minor(int id) { diff --git a/sbd/sheep.c b/sbd/sheep.c index 9644907..e4d34e8 100644 --- a/sbd/sheep.c +++ b/sbd/sheep.c @@ -12,6 +12,8 @@ #include "sbd.h" static DEFINE_MUTEX(socket_mutex); +static struct kmem_cache *sheep_aiocb_pool; +static struct kmem_cache *sheep_request_pool; void socket_shutdown(struct socket *sock) { @@ -312,7 +314,7 @@ err: static inline void free_sheep_aiocb(struct sheep_aiocb *aiocb) { vfree(aiocb->buf); - kfree(aiocb); + kmem_cache_free(sheep_aiocb_pool, aiocb); } static void aio_write_done(struct sheep_aiocb *aiocb) @@ -349,7 +351,8 @@ static void aio_read_done(struct sheep_aiocb *aiocb) struct sheep_aiocb *sheep_aiocb_setup(struct request *req) { - struct sheep_aiocb *aiocb = kmalloc(sizeof(*aiocb), SBD_GFP_FLAGS); + struct sheep_aiocb *aiocb = kmem_cache_alloc(sheep_aiocb_pool, + SBD_GFP_FLAGS); struct req_iterator iter; struct bio_vec *bvec; int len = 0; @@ -366,7 +369,7 @@ struct sheep_aiocb *sheep_aiocb_setup(struct request *req) atomic_set(&aiocb->nr_requests, 0); if (!aiocb->buf) { - kfree(aiocb); + kmem_cache_free(sheep_aiocb_pool, aiocb); return ERR_PTR(-ENOMEM); } @@ -401,7 +404,8 @@ static struct sheep_request *alloc_sheep_request(struct sheep_aiocb *aiocb, u64 oid, int len, int offset) { - struct sheep_request *req = kmalloc(sizeof(*req), SBD_GFP_FLAGS); + struct sheep_request *req = kmem_cache_alloc(sheep_request_pool, + SBD_GFP_FLAGS); struct sbd_device *dev = sheep_aiocb_to_device(aiocb); if (!req) @@ -425,7 +429,7 @@ static struct sheep_request *alloc_sheep_request(struct sheep_aiocb *aiocb, default: /* impossible case */ WARN_ON(1); - kfree(req); + kmem_cache_free(sheep_request_pool, req); return ERR_PTR(-EINVAL); } @@ -445,7 +449,7 @@ static void end_sheep_request(struct sheep_request *req) if (atomic_dec_return(&aiocb->nr_requests) <= 0) aiocb->aio_done_func(aiocb); BUG_ON(!list_empty(&req->list)); - kfree(req); + kmem_cache_free(sheep_request_pool, req); } static struct sheep_request *find_inflight_request_oid(struct sbd_device *dev, @@ -617,7 +621,7 @@ int sheep_handle_reply(struct sbd_device *dev) switch (req->type) { case SHEEP_CREATE: /* We need to update inode for create */ - new = kmalloc(sizeof(*new), SBD_GFP_FLAGS); + new = kmem_cache_alloc(sheep_request_pool, SBD_GFP_FLAGS); if (!new) { ret = -ENOMEM; req->aiocb->ret = EIO; @@ -654,3 +658,23 @@ end_request: err: return ret; } + +int sheep_slab_create(void) +{ + sheep_aiocb_pool = KMEM_CACHE(sheep_aiocb, 0); + if (!sheep_aiocb_pool) + return -ENOMEM; + + sheep_request_pool = KMEM_CACHE(sheep_request, 0); + if (!sheep_request_pool) { + kmem_cache_destroy(sheep_aiocb_pool); + return -ENOMEM; + } + return 0; +} + +void sheep_slab_destroy(void) +{ + kmem_cache_destroy(sheep_aiocb_pool); + kmem_cache_destroy(sheep_aiocb_pool); +} diff --git a/sbd/sheep_block_device.c b/sbd/sheep_block_device.c index 3e81de5..a155cf3 100644 --- a/sbd/sheep_block_device.c +++ b/sbd/sheep_block_device.c @@ -204,10 +204,14 @@ static ssize_t sbd_add(struct bus_type *bus, const char *buf, goto err_put; } + ret = sheep_slab_create(); + if (ret < 0) + goto err_free_dev; + if (sscanf(buf, "%s %d %s", dev->vdi.ip, &dev->vdi.port, dev->vdi.name) != 3) { ret = -EINVAL; - goto err_put; + goto err_free_slab; } spin_lock_init(&dev->queue_lock); @@ -229,7 +233,7 @@ static ssize_t sbd_add(struct bus_type *bus, const char *buf, ret = sheep_setup_vdi(dev); if (ret < 0) - goto err_free_dev; + goto err_free_slab; dev->id = new_id; snprintf(name, DEV_NAME_LEN, DRV_NAME "%d", dev->id); @@ -237,7 +241,7 @@ static ssize_t sbd_add(struct bus_type *bus, const char *buf, dev->minor = sbd_dev_id_to_minor(dev->id); dev->reaper = kthread_run(sbd_request_reaper, dev, "sbd_reaper"); if (IS_ERR(dev->reaper)) - goto err_free_dev; + goto err_free_slab; dev->submiter = kthread_run(sbd_request_submiter, dev, "sbd_submiter"); if (IS_ERR(dev->submiter)) goto err_stop_reaper; @@ -259,6 +263,8 @@ err_stop_kthreads: err_stop_reaper: kthread_stop(dev->reaper); wake_up(&dev->reaper_wq); +err_free_slab: + sheep_slab_destroy(); err_free_dev: free_sbd_device(dev); err_put: @@ -406,6 +412,7 @@ void __exit sbd_exit(void) { sbd_sysfs_cleanup(); unregister_blkdev(sbd_major, DRV_NAME); + sheep_slab_destroy(); pr_info("%s: Sheepdog block device unloaded\n", DRV_NAME); } -- 1.8.1.2 -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog