Commit 019b4d123aa7b9fc135b532e021cfde85db7665d

Authored by Richard Kennedy
Committed by Linus Torvalds
1 parent 03affdef4f

fs: buffer_head: remove kmem_cache constructor to reduce memory usage under slub

When using slub, having a kmem_cache constructor forces slub to add a free
pointer to the size of the cached object, which can have a significant
impact to the number of small objects that can fit into a slab.

As buffer_head is relatively small and we can have large numbers of them,
removing the constructor is a definite win.

On x86_64 removing the constructor gives me 39 objects/slab, 3 more than
without the patch.  And on x86_32 73 objects/slab, which is 9 more.

As alloc_buffer_head() already initializes each new object there is very
little difference in actual code run.

Signed-off-by: Richard Kennedy <richard@rsk.demon.co.uk>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Jens Axboe <jens.axboe@oracle.com>
Acked-by: Nick Piggin <npiggin@suse.de>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 2 additions and 11 deletions Side-by-side Diff

... ... @@ -3265,7 +3265,7 @@
3265 3265  
3266 3266 struct buffer_head *alloc_buffer_head(gfp_t gfp_flags)
3267 3267 {
3268   - struct buffer_head *ret = kmem_cache_alloc(bh_cachep, gfp_flags);
  3268 + struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags);
3269 3269 if (ret) {
3270 3270 INIT_LIST_HEAD(&ret->b_assoc_buffers);
3271 3271 get_cpu_var(bh_accounting).nr++;
... ... @@ -3352,15 +3352,6 @@
3352 3352 }
3353 3353 EXPORT_SYMBOL(bh_submit_read);
3354 3354  
3355   -static void
3356   -init_buffer_head(void *data)
3357   -{
3358   - struct buffer_head *bh = data;
3359   -
3360   - memset(bh, 0, sizeof(*bh));
3361   - INIT_LIST_HEAD(&bh->b_assoc_buffers);
3362   -}
3363   -
3364 3355 void __init buffer_init(void)
3365 3356 {
3366 3357 int nrpages;
... ... @@ -3369,7 +3360,7 @@
3369 3360 sizeof(struct buffer_head), 0,
3370 3361 (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
3371 3362 SLAB_MEM_SPREAD),
3372   - init_buffer_head);
  3363 + NULL);
3373 3364  
3374 3365 /*
3375 3366 * Limit the bh occupancy to 10% of ZONE_NORMAL