• Vlastimil Babka's avatar
    mm, sl[aou]b: guarantee natural alignment for kmalloc(power-of-two) · 59bb4798
    Vlastimil Babka authored
    In most configurations, kmalloc() happens to return naturally aligned
    (i.e.  aligned to the block size itself) blocks for power of two sizes.
    
    That means some kmalloc() users might unknowingly rely on that
    alignment, until stuff breaks when the kernel is built with e.g.
    CONFIG_SLUB_DEBUG or CONFIG_SLOB, and blocks stop being aligned.  Then
    developers have to devise workaround such as own kmem caches with
    specified alignment [1], which is not always practical, as recently
    evidenced in [2].
    
    The topic has been discussed at LSF/MM 2019 [3].  Adding a
    'kmalloc_aligned()' variant would not help with code unknowingly relying
    on the implicit alignment.  For slab implementations it would either
    require creating more kmalloc caches, or allocate a larger size and only
    give back part of it.  That would be wasteful, especially with a generic
    alignment parameter (in contrast with a fixed alignment to size).
    
    Ideally we should provide to mm users what they need without difficult
    workarounds or own reimplementations, so let's make the kmalloc()
    alignment to size explicitly guaranteed for power-of-two sizes under all
    configurations.  What this means for the three available allocators?
    
    * SLAB object layout happens to be mostly unchanged by the patch.  The
      implicitly provided alignment could be compromised with
      CONFIG_DEBUG_SLAB due to redzoning, however SLAB disables redzoning for
      caches with alignment larger than unsigned long long.  Practically on at
      least x86 this includes kmalloc caches as they use cache line alignment,
      which is larger than that.  Still, this patch ensures alignment on all
      arches and cache sizes.
    
    * SLUB layout is also unchanged unless redzoning is enabled through
      CONFIG_SLUB_DEBUG and boot parameter for the particular kmalloc cache.
      With this patch, explicit alignment is guaranteed with redzoning as
      well.  This will result in more memory being wasted, but that should be
      acceptable in a debugging scenario.
    
    * SLOB has no implicit alignment so this patch adds it explicitly for
      kmalloc().  The potential downside is increased fragmentation.  While
      pathological allocation scenarios are certainly possible, in my testing,
      after booting a x86_64 kernel+userspace with virtme, around 16MB memory
      was consumed by slab pages both before and after the patch, with
      difference in the noise.
    
    [1] https://lore.kernel.org/linux-btrfs/c3157c8e8e0e7588312b40c853f65c02fe6c957a.1566399731.git.christophe.leroy@c-s.fr/
    [2] https://lore.kernel.org/linux-fsdevel/20190225040904.5557-1-ming.lei@redhat.com/
    [3] https://lwn.net/Articles/787740/
    
    [akpm@linux-foundation.org: documentation fixlet, per Matthew]
    Link: http://lkml.kernel.org/r/20190826111627.7505-3-vbabka@suse.czSigned-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Reviewed-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: David Sterba <dsterba@suse.cz>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Ming Lei <ming.lei@redhat.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: "Darrick J . Wong" <darrick.wong@oracle.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    59bb4798
memory-allocation.rst 6.09 KB