diff mbox series

[net-next] eth: mtk_eth_soc: silence the GCC 12 array-bounds warning

Message ID 20220520055940.2309280-1-kuba@kernel.org (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next] eth: mtk_eth_soc: silence the GCC 12 array-bounds warning | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers warning 2 maintainers not CCed: linux-mediatek@lists.infradead.org linux-arm-kernel@lists.infradead.org
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 8 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Jakub Kicinski May 20, 2022, 5:59 a.m. UTC
GCC 12 gets upset because in mtk_foe_entry_commit_subflow()
this driver allocates a partial structure. The writes are
within bounds.

Silence these warnings for now, our build bot runs GCC 12
so we won't allow any new instances.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
CC: nbd@nbd.name
CC: john@phrozen.org
CC: sean.wang@mediatek.com
CC: Mark-MC.Lee@mediatek.com
CC: matthias.bgg@gmail.com
---
 drivers/net/ethernet/mediatek/Makefile | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Andrew Lunn May 20, 2022, 1:06 p.m. UTC | #1
On Thu, May 19, 2022 at 10:59:40PM -0700, Jakub Kicinski wrote:
> GCC 12 gets upset because in mtk_foe_entry_commit_subflow()
> this driver allocates a partial structure. The writes are
> within bounds.

I'm wondering if the partial structure is worth it:

struct mtk_flow_entry {
        union {
                struct hlist_node list;
                struct {
                        struct rhash_head l2_node;
                        struct hlist_head l2_flows;
                };
        };
        u8 type;
        s8 wed_index;
        u16 hash;
        union {
                struct mtk_foe_entry data;
                struct {
                        struct mtk_flow_entry *base_flow;
                        struct hlist_node list;
                        struct {} end;
                } l2_data;
        };
        struct rhash_head node;
        unsigned long cookie;
};


It allocates upto l2_data.end

struct rhash contains a single pointer

So this is saving 8 or 16 bytes depending on architecture.

I estimate the structure as a whole is at least 100 bytes on 32bit
systems.

I suppose it might make sense if this makes the allocation go from 129
bytes to <= 128, and the allocater is rounding up to the nearest power
of 2?

	Andrew
Jakub Kicinski May 20, 2022, 4:43 p.m. UTC | #2
On Fri, 20 May 2022 15:06:52 +0200 Andrew Lunn wrote:
> On Thu, May 19, 2022 at 10:59:40PM -0700, Jakub Kicinski wrote:
> > GCC 12 gets upset because in mtk_foe_entry_commit_subflow()
> > this driver allocates a partial structure. The writes are
> > within bounds.  
> 
> I'm wondering if the partial structure is worth it:
> 
> struct mtk_flow_entry {
>         union {
>                 struct hlist_node list;
>                 struct {
>                         struct rhash_head l2_node;
>                         struct hlist_head l2_flows;
>                 };
>         };
>         u8 type;
>         s8 wed_index;
>         u16 hash;
>         union {
>                 struct mtk_foe_entry data;
>                 struct {
>                         struct mtk_flow_entry *base_flow;
>                         struct hlist_node list;
>                         struct {} end;
>                 } l2_data;
>         };
>         struct rhash_head node;
>         unsigned long cookie;
> };
> 
> 
> It allocates upto l2_data.end
> 
> struct rhash contains a single pointer
> 
> So this is saving 8 or 16 bytes depending on architecture.
> 
> I estimate the structure as a whole is at least 100 bytes on 32bit
> systems.
> 
> I suppose it might make sense if this makes the allocation go from 129
> bytes to <= 128, and the allocater is rounding up to the nearest power
> of 2?

Good point, I'm not sure what Felix prefers. I think isolating the
necessary fields into a different structure and encapsulating that
into something with the extra two members (or maybe the GROUP_MEMBER
macro thing?) would be another way forward.

I'd still like explicit feedback on the Makefile hack. Is it too ugly?
We could wait for GCC 12 to get its act together was well, but 
I'm guessing Dave and I are not the only people who will upgrade to
Fedora 36 and enter a world of pain...
diff mbox series

Patch

diff --git a/drivers/net/ethernet/mediatek/Makefile b/drivers/net/ethernet/mediatek/Makefile
index 45ba0970504a..611f7b4d4eb8 100644
--- a/drivers/net/ethernet/mediatek/Makefile
+++ b/drivers/net/ethernet/mediatek/Makefile
@@ -11,3 +11,8 @@  mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o
 endif
 obj-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_ops.o
 obj-$(CONFIG_NET_MEDIATEK_STAR_EMAC) += mtk_star_emac.o
+
+# FIXME: temporarily silence -Warray-bounds on non W=1 builds
+ifndef KBUILD_EXTRA_WARN
+CFLAGS_mtk_ppe.o += $(call cc-disable-warning, array-bounds)
+endif