Re: [PATCH] xfs: allocate sector sized IO buffer via page_frag_alloc

Christopher Lameter
2019-02-26T15:32:20Z

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;
};