Skip to content
  • Kees Cook's avatar
    lib/bch: Remove VLA usage · 02361bc7
    Kees Cook authored
    In the quest to remove all stack VLA usage from the kernel[1], this
    allocates a fixed size stack array to cover the range needed for
    bch. This was done instead of a preallocation on the SLAB due to
    performance reasons, shown by Ivan Djelic:
    
     little-endian, type sizes: int=4 long=8 longlong=8
     cpu: Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
     calibration: iter=4.9143µs niter=2034 nsamples=200 m=13 t=4
    
       Buffer allocation |  Encoding throughput (Mbit/s)
     ---------------------------------------------------
      on-stack, VLA      |   3988
      on-stack, fixed    |   4494
      kmalloc            |   1967
    
    So this change actually improves performance too, it seems.
    
    The resulting stack allocation can get rather large; without
    CONFIG_BCH_CONST_PARAMS, it will allocate 4096 bytes, which
    trips the stack size checking:
    
    lib/bch.c: In function ‘encode_bch’:
    lib/bch.c:261:1: warning: the frame size of 4432 bytes is larger than 2048 bytes [-Wframe-larger-than=]
    
    Even the default case for "allmodconfig" (with CONFIG_BCH_CONST_M=14 and
    CONFIG_BCH_CONST_T=4) would have started throwing a warning:
    
    lib/bch.c: In function ‘encode_bch’:
    lib/bch.c:261:1: warning: the frame size of 2288 bytes is larger than 2048 bytes [-Wframe-larger-than=]
    
    But this is how large it's always been; it was just hidden from
    the checker because it was a VLA. So the Makefile has been adjusted to
    silence this warning for anything smaller than 4500 bytes, which should
    provide room for normal cases, but still low enough to catch any future
    pathological situations.
    
    [1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
    
    
    
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Reviewed-by: default avatarIvan Djelic <ivan.djelic@parrot.com>
    Tested-by: default avatarIvan Djelic <ivan.djelic@parrot.com>
    Acked-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
    02361bc7