• Gregory Fong's avatar
    mm: cma: align to physical address, not CMA region position · b5be83e3
    Gregory Fong authored
    The alignment in cma_alloc() was done w.r.t. the bitmap.  This is a
    problem when, for example:
    - a device requires 16M (order 12) alignment
    - the CMA region is not 16 M aligned
    In such a case, can result with the CMA region starting at, say,
    0x2f800000 but any allocation you make from there will be aligned from
    there.  Requesting an allocation of 32 M with 16 M alignment will result
    in an allocation from 0x2f800000 to 0x31800000, which doesn't work very
    well if your strange device requires 16M alignment.
    Change to use bitmap_find_next_zero_area_off() to account for the
    difference in alignment at reserve-time and alloc-time.
    Signed-off-by: default avatarGregory Fong <gregory.0xf0@gmail.com>
    Acked-by: default avatarMichal Nazarewicz <mina86@mina86.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Kukjin Kim <kgene.kim@samsung.com>
    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: Laura Abbott <lauraa@codeaurora.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
cma.c 11.7 KB