On Fri, Mar 26, 2021 at 3:17 AM Li Yang <leoyang...@nxp.com> wrote: > On Tue, Mar 23, 2021 at 8:17 AM Arnd Bergmann <a...@kernel.org> wrote: > > > > From: Arnd Bergmann <a...@arndb.de> > > > > When building with W=1, gcc points out that the __packed attribute > > on struct qm_eqcr_entry conflicts with the 8-byte alignment > > attribute on struct qm_fd inside it: > > > > drivers/soc/fsl/qbman/qman.c:189:1: error: alignment 1 of 'struct > > qm_eqcr_entry' is less than 8 [-Werror=packed-not-aligned] > > > > I assume that the alignment attribute is the correct one, and > > that qm_eqcr_entry cannot actually be unaligned in memory, > > so add the same alignment on the outer struct. > > > > Fixes: c535e923bb97 ("soc/fsl: Introduce DPAA 1.x QMan device driver") > > Signed-off-by: Arnd Bergmann <a...@arndb.de> > > --- > > drivers/soc/fsl/qbman/qman.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c > > index a1b9be1d105a..fde4edd83c14 100644 > > --- a/drivers/soc/fsl/qbman/qman.c > > +++ b/drivers/soc/fsl/qbman/qman.c > > @@ -186,7 +186,7 @@ struct qm_eqcr_entry { > > __be32 tag; > > struct qm_fd fd; > > u8 __reserved3[32]; > > -} __packed; > > +} __packed __aligned(8); > > The EQCR structure is actually aligned on 64-byte from the manual. > But probably 8 is enough to let the compiler not complain.
The important bit is that all members inside are at most 8-byte long and naturally aligned, so the compiler can now optimize the accesses because it can assume that each member can be updated atomically. Marking a structure as unaligned with the __packed attribute can lead to rather unoptimized code, which is particularly important when the structure is mapped as uncached -- accessing it one byte at a time means you have eight times the latency for a simple read. I think on arm64, the compiler doesn't actually have to do that, but at least if you run a 32-bit kernel, the packing would prevent the use of ldrd or ldm instructions that need an aligned word. Arnd