[dm-devel] [PATCH 2/2]: optimize dm-raid1 memory consumption

Jonathan Brassow jbrassow at redhat.com
Thu Feb 5 22:05:07 UTC 2009


Reviewed-but-not-tested-by: Jonathan Brassow <jbrassow at redhat.com>

  brassow

On Feb 4, 2009, at 8:53 PM, Mikulas Patocka wrote:

> With my previous patch to save bio vector, the size of  
> dm_raid1_read_record
> is significantly increased (the vector list takes 3072 bytes on 32- 
> bit machines
> and 4096 bytes on 64-bit machines).
>
> The structure dm_raid1_read_record used to be allocated with kmalloc,
> but kmalloc aligns the size on the next power-of-two --- so an object
> slightly greater than 4096 will allocate 8192 bytes of memory and  
> half of
> that memory will be wasted.
>
> This patch turns kmalloc into a slab cache. Slab cache doesn't have  
> this
> padding, so it will reduce memory consumption per-request.
>
> Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>
>
> ---
> drivers/md/dm-raid1.c |   24 ++++++++++++++++++++----
> 1 file changed, 20 insertions(+), 4 deletions(-)
>
> Index: linux-2.6.29-rc3-devel/drivers/md/dm-raid1.c
> ===================================================================
> --- linux-2.6.29-rc3-devel.orig/drivers/md/dm-raid1.c	2009-02-05  
> 03:26:25.000000000 +0100
> +++ linux-2.6.29-rc3-devel/drivers/md/dm-raid1.c	2009-02-05  
> 03:33:54.000000000 +0100
> @@ -145,6 +145,8 @@ struct dm_raid1_read_record {
> 	struct dm_bio_details details;
> };
>
> +static struct kmem_cache *_dm_raid1_read_record_cache;
> +
> /*
>  * Every mirror should look like this one.
>  */
> @@ -764,9 +766,8 @@ static struct mirror_set *alloc_context(
> 	atomic_set(&ms->suspend, 0);
> 	atomic_set(&ms->default_mirror, DEFAULT_MIRROR);
>
> -	len = sizeof(struct dm_raid1_read_record);
> -	ms->read_record_pool = mempool_create_kmalloc_pool(MIN_READ_RECORDS,
> -							   len);
> +	ms->read_record_pool = mempool_create_slab_pool(MIN_READ_RECORDS,  
> _dm_raid1_read_record_cache);
> +
> 	if (!ms->read_record_pool) {
> 		ti->error = "Error creating mirror read_record_pool";
> 		kfree(ms);
> @@ -1279,16 +1280,31 @@ static int __init dm_mirror_init(void)
> {
> 	int r;
>
> +	_dm_raid1_read_record_cache = KMEM_CACHE(dm_raid1_read_record, 0);
> +	if (!_dm_raid1_read_record_cache) {
> +		DMERR("Can't allocate dm_raid1_read_record cache");
> +		r = -ENOMEM;
> +		goto bad_cache;
> +	}
> +
> 	r = dm_register_target(&mirror_target);
> -	if (r < 0)
> +	if (r < 0) {
> 		DMERR("Failed to register mirror target");
> +		goto bad_target;
> +	}
> +
> +	return 0;
>
> +bad_target:
> +	kmem_cache_destroy(_dm_raid1_read_record_cache);
> +bad_cache:
> 	return r;
> }
>
> static void __exit dm_mirror_exit(void)
> {
> 	dm_unregister_target(&mirror_target);
> +	kmem_cache_destroy(_dm_raid1_read_record_cache);
> }
>
> /* Module hooks */
>
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list