Skip to content
  • zijun_hu's avatar
    percpu: ensure the requested alignment is power of two · 3ca45a46
    zijun_hu authored
    
    
    The percpu allocator expectedly assumes that the requested alignment
    is power of two but hasn't been veryfing the input.  If the specified
    alignment isn't power of two, the allocator can malfunction.  Add the
    sanity check.
    
    The following is detailed analysis of the effects of alignments which
    aren't power of two.
    
     The alignment must be a even at least since the LSB of a chunk->map
     element is used as free/in-use flag of a area; besides, the alignment
     must be a power of 2 too since ALIGN() doesn't work well for other
     alignment always but is adopted by pcpu_fit_in_area().  IOW, the
     current allocator only works well for a power of 2 aligned area
     allocation.
    
     See below opposite example for why an odd alignment doesn't work.
     Let's assume area [16, 36) is free but its previous one is in-use, we
     want to allocate a @size == 8 and @align == 7 area.  The larger area
     [16, 36) is split to three areas [16, 21), [21, 29), [29, 36)
     eventually.  However, due to the usage for a chunk->map element, the
     actual offset of the aim area [21, 29) is 21 but is recorded in
     relevant element as 20; moreover, the residual tail free area [29,
     36) is mistook as in-use and is lost silently
    
     Unlike macro roundup(), ALIGN(x, a) doesn't work if @a isn't a power
     of 2 for example, roundup(10, 6) == 12 but ALIGN(10, 6) == 10, and
     the latter result isn't desired obviously.
    
    tj: Code style and patch description updates.
    
    Signed-off-by: default avatarzijun_hu <zijun_hu@htc.com>
    Suggested-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    3ca45a46