hpilo: Replace one-element array with flexible-array member
authorGustavo A. R. Silva <gustavoars@kernel.org>
Tue, 14 Jul 2020 15:44:49 +0000 (10:44 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Jul 2020 16:21:25 +0000 (18:21 +0200)
commitfadbfc38dde26d31e901c3c85cf01332cb6a2224
tree6c5ce00be9ffb81e8e852ad6a55ca3ce4e89b86b
parent3a12c2b5f38227a7104ce9f2be682059c7c93100
hpilo: Replace one-element array with flexible-array member

There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].

For this particular case, it is important to notice that the cachelines
change from 7 to 6 after the flexible-array conversion:

$ pahole -C 'fifo' drivers/misc/hpilo.o
struct fifo {
u64                        nrents;               /*     0     8 */
u64                        imask;                /*     8     8 */
u64                        merge;                /*    16     8 */
u64                        reset;                /*    24     8 */
u8                         pad_0[96];            /*    32    96 */
/* --- cacheline 2 boundary (128 bytes) --- */
u64                        head;                 /*   128     8 */
u8                         pad_1[120];           /*   136   120 */
/* --- cacheline 4 boundary (256 bytes) --- */
u64                        tail;                 /*   256     8 */
u8                         pad_2[120];           /*   264   120 */
/* --- cacheline 6 boundary (384 bytes) --- */
u64                        fifobar[1];           /*   384     8 */

/* size: 392, cachelines: 7, members: 10 */
/* last cacheline: 8 bytes */
};

$ pahole -C 'fifo' drivers/misc/hpilo.o
struct fifo {
u64                        nrents;               /*     0     8 */
u64                        imask;                /*     8     8 */
u64                        merge;                /*    16     8 */
u64                        reset;                /*    24     8 */
u8                         pad_0[96];            /*    32    96 */
/* --- cacheline 2 boundary (128 bytes) --- */
u64                        head;                 /*   128     8 */
u8                         pad_1[120];           /*   136   120 */
/* --- cacheline 4 boundary (256 bytes) --- */
u64                        tail;                 /*   256     8 */
u8                         pad_2[120];           /*   264   120 */
/* --- cacheline 6 boundary (384 bytes) --- */
u64                        fifobar[];            /*   384     0 */

/* size: 384, cachelines: 6, members: 10 */
};

Lastly, remove unnecessary parentheses in fifo_sz() and fix the following
checkpatch.pl warning for the whole fifo structure:

WARNING: please, no spaces at the start of a line

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://github.com/KSPP/linux/issues/79

Tested-by: kernel test robot <lkp@intel.com>
Link: https://github.com/GustavoARSilva/linux-hardening/blob/master/cii/kernel-ci/hpilo-20200714.md
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/20200714154449.GA26153@embeddedor
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/hpilo.c
drivers/misc/hpilo.h