diff options
author | Alex Elder <elder@inktank.com> | 2013-05-01 13:43:04 -0400 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-05-02 12:58:41 -0400 |
commit | 5522ae0b68421e2645303ff010e27afc5292e0ab (patch) | |
tree | 200ec4895513e032a6ce9e844a457150f22b0708 /net/ceph | |
parent | 81b36be4c56299ac4c4c786908cb117ad232b62e (diff) |
libceph: use slab cache for osd client requests
Create a slab cache to manage allocation of ceph_osdc_request
structures.
This resolves:
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 'net/ceph')
-rw-r--r-- | net/ceph/ceph_common.c | 7 | ||||
-rw-r--r-- | net/ceph/osd_client.c | 27 |
2 files changed, 32 insertions, 2 deletions
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index e65e6e4be38b..34b11ee8124e 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
@@ -606,11 +606,17 @@ static int __init init_ceph_lib(void) | |||
606 | if (ret < 0) | 606 | if (ret < 0) |
607 | goto out_crypto; | 607 | goto out_crypto; |
608 | 608 | ||
609 | ret = ceph_osdc_setup(); | ||
610 | if (ret < 0) | ||
611 | goto out_msgr; | ||
612 | |||
609 | pr_info("loaded (mon/osd proto %d/%d)\n", | 613 | pr_info("loaded (mon/osd proto %d/%d)\n", |
610 | CEPH_MONC_PROTOCOL, CEPH_OSDC_PROTOCOL); | 614 | CEPH_MONC_PROTOCOL, CEPH_OSDC_PROTOCOL); |
611 | 615 | ||
612 | return 0; | 616 | return 0; |
613 | 617 | ||
618 | out_msgr: | ||
619 | ceph_msgr_exit(); | ||
614 | out_crypto: | 620 | out_crypto: |
615 | ceph_crypto_shutdown(); | 621 | ceph_crypto_shutdown(); |
616 | out_debugfs: | 622 | out_debugfs: |
@@ -622,6 +628,7 @@ out: | |||
622 | static void __exit exit_ceph_lib(void) | 628 | static void __exit exit_ceph_lib(void) |
623 | { | 629 | { |
624 | dout("exit_ceph_lib\n"); | 630 | dout("exit_ceph_lib\n"); |
631 | ceph_osdc_cleanup(); | ||
625 | ceph_msgr_exit(); | 632 | ceph_msgr_exit(); |
626 | ceph_crypto_shutdown(); | 633 | ceph_crypto_shutdown(); |
627 | ceph_debugfs_cleanup(); | 634 | ceph_debugfs_cleanup(); |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 57d8db5b055a..a3395fdfbd4f 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #define OSD_OP_FRONT_LEN 4096 | 22 | #define OSD_OP_FRONT_LEN 4096 |
23 | #define OSD_OPREPLY_FRONT_LEN 512 | 23 | #define OSD_OPREPLY_FRONT_LEN 512 |
24 | 24 | ||
25 | static struct kmem_cache *ceph_osd_request_cache; | ||
26 | |||
25 | static const struct ceph_connection_operations osd_con_ops; | 27 | static const struct ceph_connection_operations osd_con_ops; |
26 | 28 | ||
27 | static void __send_queued(struct ceph_osd_client *osdc); | 29 | static void __send_queued(struct ceph_osd_client *osdc); |
@@ -315,7 +317,8 @@ void ceph_osdc_release_request(struct kref *kref) | |||
315 | if (req->r_mempool) | 317 | if (req->r_mempool) |
316 | mempool_free(req, req->r_osdc->req_mempool); | 318 | mempool_free(req, req->r_osdc->req_mempool); |
317 | else | 319 | else |
318 | kfree(req); | 320 | kmem_cache_free(ceph_osd_request_cache, req); |
321 | |||
319 | } | 322 | } |
320 | EXPORT_SYMBOL(ceph_osdc_release_request); | 323 | EXPORT_SYMBOL(ceph_osdc_release_request); |
321 | 324 | ||
@@ -346,7 +349,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | |||
346 | req = mempool_alloc(osdc->req_mempool, gfp_flags); | 349 | req = mempool_alloc(osdc->req_mempool, gfp_flags); |
347 | memset(req, 0, sizeof(*req)); | 350 | memset(req, 0, sizeof(*req)); |
348 | } else { | 351 | } else { |
349 | req = kzalloc(sizeof(*req), gfp_flags); | 352 | req = kmem_cache_zalloc(ceph_osd_request_cache, gfp_flags); |
350 | } | 353 | } |
351 | if (req == NULL) | 354 | if (req == NULL) |
352 | return NULL; | 355 | return NULL; |
@@ -2365,6 +2368,26 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino, | |||
2365 | } | 2368 | } |
2366 | EXPORT_SYMBOL(ceph_osdc_writepages); | 2369 | EXPORT_SYMBOL(ceph_osdc_writepages); |
2367 | 2370 | ||
2371 | int ceph_osdc_setup(void) | ||
2372 | { | ||
2373 | BUG_ON(ceph_osd_request_cache); | ||
2374 | ceph_osd_request_cache = kmem_cache_create("ceph_osd_request", | ||
2375 | sizeof (struct ceph_osd_request), | ||
2376 | __alignof__(struct ceph_osd_request), | ||
2377 | 0, NULL); | ||
2378 | |||
2379 | return ceph_osd_request_cache ? 0 : -ENOMEM; | ||
2380 | } | ||
2381 | EXPORT_SYMBOL(ceph_osdc_setup); | ||
2382 | |||
2383 | void ceph_osdc_cleanup(void) | ||
2384 | { | ||
2385 | BUG_ON(!ceph_osd_request_cache); | ||
2386 | kmem_cache_destroy(ceph_osd_request_cache); | ||
2387 | ceph_osd_request_cache = NULL; | ||
2388 | } | ||
2389 | EXPORT_SYMBOL(ceph_osdc_cleanup); | ||
2390 | |||
2368 | /* | 2391 | /* |
2369 | * handle incoming message | 2392 | * handle incoming message |
2370 | */ | 2393 | */ |