[PATCH] ath79/ag71xx: rearrange ag71xx structs to remove holes
Adrian Schmutzler
mail at adrianschmutzler.de
Fri Sep 24 14:28:33 PDT 2021
> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces at lists.openwrt.org]
> On Behalf Of Rui Salvaterra
> Sent: Sonntag, 19. September 2021 12:39
> To: openwrt-devel at lists.openwrt.org
> Cc: rosenp at gmail.com; Rui Salvaterra <rsalvaterra at gmail.com>
> Subject: [PATCH] ath79/ag71xx: rearrange ag71xx structs to remove holes
Commit title prefix should be "ath79: ag71xx:" or just "ath79:".
Apart from that, I can contribute nothing useful :-(
Best
Adrian
>
> From: Rosen Penev <rosenp at gmail.com>
>
> Remove ____cacheline_aligned attribute to ring structs. This actually
causes
> holes in the ag71xx struct as well as lower performance.
>
> Rearrange struct members to fall within respective cachelines. The RX ring
> struct now does not share a cacheline with the TX ring. The NAPI struct
now
> takes up its own cachelines and does not share.
>
> According to pahole -C ag71xx -c 32
>
> Before:
>
> struct ag71xx {
> /* size: 384, cachelines: 12, members: 22 */
> /* sum members: 375, holes: 2, sum holes: 9 */
>
> After:
>
> struct ag71xx {
> /* size: 376, cachelines: 12, members: 22 */
> /* last cacheline: 24 bytes */
>
> Signed-off-by: Rosen Penev <rosenp at gmail.com> [Fix typos in the patch
> description]
> Signed-off-by: Rui Salvaterra <rsalvaterra at gmail.com>
> ---
> The ag71xx_ring changes are already part of the upstream driver. However,
> since we're not using it at all yet, let's apply this to our driver for
the time
> being, as David explicitly requests performance numbers before applying it
> upstream [1] (and rightly so, in my opinion).
>
> [1]
> https://lore.kernel.org/netdev/20190725.112108.2287417619951369896.dave
> m at davemloft.net/
>
> .../net/ethernet/atheros/ag71xx/ag71xx.h | 32 ++++++++++---------
> 1 file changed, 17 insertions(+), 15 deletions(-)
>
> diff --git
> a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h
> b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h
> index 5ff9439f0d..6ed1f78459 100644
> ---
> a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h
> +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71x
> +++ x.h
> @@ -107,13 +107,16 @@ struct ag71xx_buf { };
>
> struct ag71xx_ring {
> - struct ag71xx_buf *buf;
> - u8 *descs_cpu;
> - dma_addr_t descs_dma;
> - u16 desc_split;
> - u16 order;
> + /* "Hot" fields in the data path. */
> unsigned int curr;
> unsigned int dirty;
> +
> + /* "Cold" fields - not used in the data path. */
> + struct ag71xx_buf *buf;
> + u16 order;
> + u16 desc_split;
> + dma_addr_t descs_dma;
> + u8 *descs_cpu;
> };
>
> struct ag71xx_int_stats {
> @@ -151,21 +154,20 @@ struct ag71xx {
> * Critical data related to the per-packet data path are clustered
> * early in this structure to help improve the D-cache footprint.
> */
> - struct ag71xx_ring rx_ring ____cacheline_aligned;
> - struct ag71xx_ring tx_ring ____cacheline_aligned;
> + struct ag71xx_ring rx_ring;
> + u16 rx_buf_size;
> + u16 rx_buf_offset;
> + u32 msg_enable;
>
> + struct ag71xx_ring tx_ring;
> int mac_idx;
> -
> u16 desc_pktlen_mask;
> - u16 rx_buf_size;
> - u8 rx_buf_offset;
> u8 tx_hang_workaround:1;
>
> + struct napi_struct napi;
> struct net_device *dev;
> struct platform_device *pdev;
> spinlock_t lock;
> - struct napi_struct napi;
> - u32 msg_enable;
>
> /*
> * From this point onwards we're not looking at per-packet fields.
> @@ -188,12 +190,12 @@ struct ag71xx {
> unsigned int speed;
> int duplex;
>
> - struct delayed_work restart_work;
> - struct timer_list oom_timer;
> -
> struct reset_control *mac_reset;
> struct reset_control *mdio_reset;
>
> + struct delayed_work restart_work;
> + struct timer_list oom_timer;
> +
> u32 fifodata[3];
> u32 plldata[3];
> u32 pllreg[3];
> --
> 2.33.0
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list