If the per-device-cache patch is accepted, here is a corresponding one for 2.4. --- linux-2.4.20a/drivers/md/dm.c 2003/01/10 20:11:44 +++ linux-2.4.20b/drivers/md/dm.c 2003/01/13 16:11:51 @@ -65,11 +65,11 @@ /* * io objects are allocated from here. */ + kmem_cache_t *io_cache; mempool_t *io_pool; }; #define MIN_IOS 256 -static kmem_cache_t *_io_cache; /* block device arrays */ static int _block_size[MAX_DEVICES]; @@ -85,18 +85,10 @@ { int r; - /* allocate a slab for the dm_ios */ - _io_cache = kmem_cache_create("dm io", - sizeof(struct dm_io), 0, 0, NULL, NULL); - - if (!_io_cache) - return -ENOMEM; - _major = major; r = register_blkdev(_major, _name, &dm_blk_dops); if (r < 0) { DMERR("register_blkdev failed"); - kmem_cache_destroy(_io_cache); return r; } @@ -116,8 +108,6 @@ static void local_exit(void) { - kmem_cache_destroy(_io_cache); - if (unregister_blkdev(_major, _name) < 0) DMERR("devfs_unregister_blkdev failed"); @@ -585,6 +575,7 @@ static struct mapped_device *alloc_dev(int minor) { struct mapped_device *md = kmalloc(sizeof(*md), GFP_KERNEL); + char name[15]; if (!md) { DMWARN("unable to allocate device, out of memory."); @@ -601,9 +592,19 @@ DMWARN("allocating minor %d.", minor); memset(md, 0, sizeof(*md)); + snprintf(name, 15, "dm io %d", minor); + md->io_cache = kmem_cache_create(name, sizeof(struct dm_io), + 0, 0, NULL, NULL); + if (!md->io_cache) { + free_minor(minor); + kfree(md); + return NULL; + } + md->io_pool = mempool_create(MIN_IOS, mempool_alloc_slab, - mempool_free_slab, _io_cache); + mempool_free_slab, md->io_cache); if (!md->io_pool) { + kmem_cache_destroy(md->io_cache); free_minor(minor); kfree(md); return NULL; @@ -622,6 +623,7 @@ { free_minor(minor(md->dev)); mempool_destroy(md->io_pool); + kmem_cache_destroy(md->io_cache); kfree(md); }