[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d41c058c-d20f-2e9f-ea2c-0a26bdb5fea3@gmail.com>
Date: Wed, 5 Jan 2022 10:30:54 -0800
From: Florian Fainelli <f.fainelli@...il.com>
To: Vladimir Oltean <vladimir.oltean@....com>, netdev@...r.kernel.org
Cc: "David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>, Andrew Lunn <andrew@...n.ch>,
Vivien Didelot <vivien.didelot@...il.com>
Subject: Re: [PATCH v2 net-next 2/7] net: dsa: merge all bools of struct
dsa_port into a single u8
On 1/5/22 5:21 AM, Vladimir Oltean wrote:
> struct dsa_port has 5 bool members which create quite a number of 7 byte
> holes in the structure layout. By merging them all into bitfields of an
> u8, and placing that u8 in the 1-byte hole after dp->mac and dp->stp_state,
> we can reduce the structure size from 576 bytes to 552 bytes on arm64.
>
> Before:
>
> pahole -C dsa_port net/dsa/slave.o
> struct dsa_port {
> union {
> struct net_device * master; /* 0 8 */
> struct net_device * slave; /* 0 8 */
> }; /* 0 8 */
> const struct dsa_device_ops * tag_ops; /* 8 8 */
> struct dsa_switch_tree * dst; /* 16 8 */
> struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); /* 24 8 */
> enum {
> DSA_PORT_TYPE_UNUSED = 0,
> DSA_PORT_TYPE_CPU = 1,
> DSA_PORT_TYPE_DSA = 2,
> DSA_PORT_TYPE_USER = 3,
> } type; /* 32 4 */
>
> /* XXX 4 bytes hole, try to pack */
>
> struct dsa_switch * ds; /* 40 8 */
> unsigned int index; /* 48 4 */
>
> /* XXX 4 bytes hole, try to pack */
>
> const char * name; /* 56 8 */
> /* --- cacheline 1 boundary (64 bytes) --- */
> struct dsa_port * cpu_dp; /* 64 8 */
> u8 mac[6]; /* 72 6 */
> u8 stp_state; /* 78 1 */
>
> /* XXX 1 byte hole, try to pack */
>
> struct device_node * dn; /* 80 8 */
> unsigned int ageing_time; /* 88 4 */
> bool vlan_filtering; /* 92 1 */
> bool learning; /* 93 1 */
>
> /* XXX 2 bytes hole, try to pack */
>
> struct dsa_bridge * bridge; /* 96 8 */
> struct devlink_port devlink_port; /* 104 288 */
> /* --- cacheline 6 boundary (384 bytes) was 8 bytes ago --- */
> bool devlink_port_setup; /* 392 1 */
>
> /* XXX 7 bytes hole, try to pack */
>
> struct phylink * pl; /* 400 8 */
> struct phylink_config pl_config; /* 408 40 */
> /* --- cacheline 7 boundary (448 bytes) --- */
> struct net_device * lag_dev; /* 448 8 */
> bool lag_tx_enabled; /* 456 1 */
>
> /* XXX 7 bytes hole, try to pack */
>
> struct net_device * hsr_dev; /* 464 8 */
> struct list_head list; /* 472 16 */
> const struct ethtool_ops * orig_ethtool_ops; /* 488 8 */
> const struct dsa_netdevice_ops * netdev_ops; /* 496 8 */
> struct mutex addr_lists_lock; /* 504 32 */
> /* --- cacheline 8 boundary (512 bytes) was 24 bytes ago --- */
> struct list_head fdbs; /* 536 16 */
> struct list_head mdbs; /* 552 16 */
> bool setup; /* 568 1 */
>
> /* size: 576, cachelines: 9, members: 30 */
> /* sum members: 544, holes: 6, sum holes: 25 */
> /* padding: 7 */
> };
>
> After:
>
> pahole -C dsa_port net/dsa/slave.o
> struct dsa_port {
> union {
> struct net_device * master; /* 0 8 */
> struct net_device * slave; /* 0 8 */
> }; /* 0 8 */
> const struct dsa_device_ops * tag_ops; /* 8 8 */
> struct dsa_switch_tree * dst; /* 16 8 */
> struct sk_buff * (*rcv)(struct sk_buff *, struct net_device *); /* 24 8 */
> enum {
> DSA_PORT_TYPE_UNUSED = 0,
> DSA_PORT_TYPE_CPU = 1,
> DSA_PORT_TYPE_DSA = 2,
> DSA_PORT_TYPE_USER = 3,
> } type; /* 32 4 */
>
> /* XXX 4 bytes hole, try to pack */
>
> struct dsa_switch * ds; /* 40 8 */
> unsigned int index; /* 48 4 */
>
> /* XXX 4 bytes hole, try to pack */
>
> const char * name; /* 56 8 */
> /* --- cacheline 1 boundary (64 bytes) --- */
> struct dsa_port * cpu_dp; /* 64 8 */
> u8 mac[6]; /* 72 6 */
> u8 stp_state; /* 78 1 */
> u8 vlan_filtering:1; /* 79: 0 1 */
> u8 learning:1; /* 79: 1 1 */
> u8 lag_tx_enabled:1; /* 79: 2 1 */
> u8 devlink_port_setup:1; /* 79: 3 1 */
> u8 setup:1; /* 79: 4 1 */
>
> /* XXX 3 bits hole, try to pack */
>
> struct device_node * dn; /* 80 8 */
> unsigned int ageing_time; /* 88 4 */
>
> /* XXX 4 bytes hole, try to pack */
>
> struct dsa_bridge * bridge; /* 96 8 */
> struct devlink_port devlink_port; /* 104 288 */
> /* --- cacheline 6 boundary (384 bytes) was 8 bytes ago --- */
> struct phylink * pl; /* 392 8 */
> struct phylink_config pl_config; /* 400 40 */
> struct net_device * lag_dev; /* 440 8 */
> /* --- cacheline 7 boundary (448 bytes) --- */
> struct net_device * hsr_dev; /* 448 8 */
> struct list_head list; /* 456 16 */
> const struct ethtool_ops * orig_ethtool_ops; /* 472 8 */
> const struct dsa_netdevice_ops * netdev_ops; /* 480 8 */
> struct mutex addr_lists_lock; /* 488 32 */
> /* --- cacheline 8 boundary (512 bytes) was 8 bytes ago --- */
> struct list_head fdbs; /* 520 16 */
> struct list_head mdbs; /* 536 16 */
>
> /* size: 552, cachelines: 9, members: 30 */
> /* sum members: 539, holes: 3, sum holes: 12 */
> /* sum bitfield members: 5 bits, bit holes: 1, sum bit holes: 3 bits */
> /* last cacheline: 40 bytes */
> };
>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@....com>
Reviewed-by: Florian Fainelli <f.fainelli@...il.com>
--
Florian
Powered by blists - more mailing lists