On Tue, 26 Feb 2019, Ming Lei wrote: > Then something like the following patch should work for all fs, could > anyone comment on this approach? Note that various subsystems have similar implementations. Have a look at drivers/dma/dmaengine.c struct dmaengine_unmap_pool { struct kmem_cache *cache; const char *name; mempool_t *pool; size_t size; }; #define __UNMAP_POOL(x) { .size = x, .name = "dmaengine-unmap-" __stringify(x) } static struct dmaengine_unmap_pool unmap_pool[] = { __UNMAP_POOL(2), #if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) __UNMAP_POOL(16), __UNMAP_POOL(128), __UNMAP_POOL(256), #endif }; Or drivers/md/dm-bufio.c: struct dm_bufio_client { struct mutex lock; struct list_head lru[LIST_SIZE]; unsigned long n_buffers[LIST_SIZE]; struct block_device *bdev; unsigned block_size; s8 sectors_per_block_bits; void (*alloc_callback)(struct dm_buffer *); void (*write_callback)(struct dm_buffer *); struct kmem_cache *slab_buffer; struct kmem_cache *slab_cache; struct dm_io_client *dm_io; struct list_head reserved_buffers; unsigned need_reserved_buffers; unsigned minimum_buffers; struct rb_root buffer_tree; wait_queue_head_t free_buffer_wait; sector_t start; int async_write_error; struct list_head client_list; struct shrinker shrinker; };