diff options
author | Alex Elder <elder@inktank.com> | 2013-05-01 12:43:03 -0500 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-05-02 11:58:30 -0500 |
commit | 868311b1ebc9b203bae0d6d1f012ea5cbdadca03 (patch) | |
tree | 972ef543d655be8729ced0e85641fa2f2660dd33 /drivers/block | |
parent | f907ad55967fec6bc6ec5ee84021070c49cf0bb1 (diff) |
rbd: allocate object requests with a slab allocator
Create a slab cache to manage rbd_obj_request allocation. We aren't
using a constructor, and we'll zero-fill object request structures
when they're allocated.
This is part of:
http://tracker.ceph.com/issues/3926
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/rbd.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index d74be04ceeff..a72842aa3b53 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -346,6 +346,7 @@ static LIST_HEAD(rbd_client_list); /* clients */ static DEFINE_SPINLOCK(rbd_client_list_lock); static struct kmem_cache *rbd_img_request_cache; +static struct kmem_cache *rbd_obj_request_cache; static int rbd_img_request_submit(struct rbd_img_request *img_request); @@ -1762,7 +1763,7 @@ static struct rbd_obj_request *rbd_obj_request_create(const char *object_name, if (!name) return NULL; - obj_request = kzalloc(sizeof (*obj_request), GFP_KERNEL); + obj_request = kmem_cache_zalloc(rbd_obj_request_cache, GFP_KERNEL); if (!obj_request) { kfree(name); return NULL; @@ -1814,7 +1815,8 @@ static void rbd_obj_request_destroy(struct kref *kref) } kfree(obj_request->object_name); - kfree(obj_request); + obj_request->object_name = NULL; + kmem_cache_free(rbd_obj_request_cache, obj_request); } /* @@ -5008,14 +5010,29 @@ static int rbd_slab_init(void) sizeof (struct rbd_img_request), __alignof__(struct rbd_img_request), 0, NULL); - if (rbd_img_request_cache) + if (!rbd_img_request_cache) + return -ENOMEM; + + rbd_assert(!rbd_obj_request_cache); + rbd_obj_request_cache = kmem_cache_create("rbd_obj_request", + sizeof (struct rbd_obj_request), + __alignof__(struct rbd_obj_request), + 0, NULL); + if (rbd_obj_request_cache) return 0; + kmem_cache_destroy(rbd_img_request_cache); + rbd_img_request_cache = NULL; + return -ENOMEM; } static void rbd_slab_exit(void) { + rbd_assert(rbd_obj_request_cache); + kmem_cache_destroy(rbd_obj_request_cache); + rbd_obj_request_cache = NULL; + rbd_assert(rbd_img_request_cache); kmem_cache_destroy(rbd_img_request_cache); rbd_img_request_cache = NULL; |