diff mbox series

[v2,net-next,6/7] net: dsa: move dsa_switch_tree :: ports and lags to first cache line

Message ID 20220105132141.2648876-7-vladimir.oltean@nxp.com (mailing list archive)
State Accepted
Delegated to: Netdev Maintainers
Headers show
Series Cleanup to main DSA structures | 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 Series has a cover letter
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: 18 this patch: 18
netdev/cc_maintainers warning 1 maintainers not CCed: olteanv@gmail.com
netdev/build_clang success Errors and warnings before: 26 this patch: 26
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: 20 this patch: 20
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 37 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Vladimir Oltean Jan. 5, 2022, 1:21 p.m. UTC
dst->ports is accessed most notably by dsa_master_find_slave(), which is
invoked in the RX path.

dst->lags is accessed by dsa_lag_dev(), which is invoked in the RX path
of tag_dsa.c.

dst->tag_ops, dst->default_proto and dst->pd don't need to be in the
first cache line, so they are moved out by this change.

Before:

pahole -C dsa_switch_tree net/dsa/slave.o
struct dsa_switch_tree {
        struct list_head           list;                 /*     0    16 */
        struct raw_notifier_head   nh;                   /*    16     8 */
        unsigned int               index;                /*    24     4 */
        struct kref                refcount;             /*    28     4 */
        bool                       setup;                /*    32     1 */

        /* XXX 7 bytes hole, try to pack */

        const struct dsa_device_ops  * tag_ops;          /*    40     8 */
        enum dsa_tag_protocol      default_proto;        /*    48     4 */

        /* XXX 4 bytes hole, try to pack */

        struct dsa_platform_data * pd;                   /*    56     8 */
        /* --- cacheline 1 boundary (64 bytes) --- */
        struct list_head           ports;                /*    64    16 */
        struct list_head           rtable;               /*    80    16 */
        struct net_device * *      lags;                 /*    96     8 */
        unsigned int               lags_len;             /*   104     4 */
        unsigned int               last_switch;          /*   108     4 */

        /* size: 112, cachelines: 2, members: 13 */
        /* sum members: 101, holes: 2, sum holes: 11 */
        /* last cacheline: 48 bytes */
};

After:

pahole -C dsa_switch_tree net/dsa/slave.o
struct dsa_switch_tree {
        struct list_head           list;                 /*     0    16 */
        struct list_head           ports;                /*    16    16 */
        struct raw_notifier_head   nh;                   /*    32     8 */
        unsigned int               index;                /*    40     4 */
        struct kref                refcount;             /*    44     4 */
        struct net_device * *      lags;                 /*    48     8 */
        bool                       setup;                /*    56     1 */

        /* XXX 7 bytes hole, try to pack */

        /* --- cacheline 1 boundary (64 bytes) --- */
        const struct dsa_device_ops  * tag_ops;          /*    64     8 */
        enum dsa_tag_protocol      default_proto;        /*    72     4 */

        /* XXX 4 bytes hole, try to pack */

        struct dsa_platform_data * pd;                   /*    80     8 */
        struct list_head           rtable;               /*    88    16 */
        unsigned int               lags_len;             /*   104     4 */
        unsigned int               last_switch;          /*   108     4 */

        /* size: 112, cachelines: 2, members: 13 */
        /* sum members: 101, holes: 2, sum holes: 11 */
        /* last cacheline: 48 bytes */
};

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
 include/net/dsa.h | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

Comments

Florian Fainelli Jan. 5, 2022, 6:34 p.m. UTC | #1
On 1/5/22 5:21 AM, Vladimir Oltean wrote:
> dst->ports is accessed most notably by dsa_master_find_slave(), which is
> invoked in the RX path.
> 
> dst->lags is accessed by dsa_lag_dev(), which is invoked in the RX path
> of tag_dsa.c.
> 
> dst->tag_ops, dst->default_proto and dst->pd don't need to be in the
> first cache line, so they are moved out by this change.
> 
> Before:
> 
> pahole -C dsa_switch_tree net/dsa/slave.o
> struct dsa_switch_tree {
>         struct list_head           list;                 /*     0    16 */
>         struct raw_notifier_head   nh;                   /*    16     8 */
>         unsigned int               index;                /*    24     4 */
>         struct kref                refcount;             /*    28     4 */
>         bool                       setup;                /*    32     1 */
> 
>         /* XXX 7 bytes hole, try to pack */
> 
>         const struct dsa_device_ops  * tag_ops;          /*    40     8 */
>         enum dsa_tag_protocol      default_proto;        /*    48     4 */
> 
>         /* XXX 4 bytes hole, try to pack */
> 
>         struct dsa_platform_data * pd;                   /*    56     8 */
>         /* --- cacheline 1 boundary (64 bytes) --- */
>         struct list_head           ports;                /*    64    16 */
>         struct list_head           rtable;               /*    80    16 */
>         struct net_device * *      lags;                 /*    96     8 */
>         unsigned int               lags_len;             /*   104     4 */
>         unsigned int               last_switch;          /*   108     4 */
> 
>         /* size: 112, cachelines: 2, members: 13 */
>         /* sum members: 101, holes: 2, sum holes: 11 */
>         /* last cacheline: 48 bytes */
> };
> 
> After:
> 
> pahole -C dsa_switch_tree net/dsa/slave.o
> struct dsa_switch_tree {
>         struct list_head           list;                 /*     0    16 */
>         struct list_head           ports;                /*    16    16 */
>         struct raw_notifier_head   nh;                   /*    32     8 */
>         unsigned int               index;                /*    40     4 */
>         struct kref                refcount;             /*    44     4 */
>         struct net_device * *      lags;                 /*    48     8 */
>         bool                       setup;                /*    56     1 */
> 
>         /* XXX 7 bytes hole, try to pack */
> 
>         /* --- cacheline 1 boundary (64 bytes) --- */
>         const struct dsa_device_ops  * tag_ops;          /*    64     8 */
>         enum dsa_tag_protocol      default_proto;        /*    72     4 */
> 
>         /* XXX 4 bytes hole, try to pack */
> 
>         struct dsa_platform_data * pd;                   /*    80     8 */
>         struct list_head           rtable;               /*    88    16 */
>         unsigned int               lags_len;             /*   104     4 */
>         unsigned int               last_switch;          /*   108     4 */
> 
>         /* size: 112, cachelines: 2, members: 13 */
>         /* sum members: 101, holes: 2, sum holes: 11 */
>         /* last cacheline: 48 bytes */
> };
> 
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff mbox series

Patch

diff --git a/include/net/dsa.h b/include/net/dsa.h
index fef9d8bb5190..cbbac75138d9 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -119,6 +119,9 @@  struct dsa_netdevice_ops {
 struct dsa_switch_tree {
 	struct list_head	list;
 
+	/* List of switch ports */
+	struct list_head ports;
+
 	/* Notifier chain for switch-wide events */
 	struct raw_notifier_head	nh;
 
@@ -128,6 +131,11 @@  struct dsa_switch_tree {
 	/* Number of switches attached to this tree */
 	struct kref refcount;
 
+	/* Maps offloaded LAG netdevs to a zero-based linear ID for
+	 * drivers that need it.
+	 */
+	struct net_device **lags;
+
 	/* Has this tree been applied to the hardware? */
 	bool setup;
 
@@ -145,16 +153,10 @@  struct dsa_switch_tree {
 	 */
 	struct dsa_platform_data	*pd;
 
-	/* List of switch ports */
-	struct list_head ports;
-
 	/* List of DSA links composing the routing table */
 	struct list_head rtable;
 
-	/* Maps offloaded LAG netdevs to a zero-based linear ID for
-	 * drivers that need it.
-	 */
-	struct net_device **lags;
+	/* Length of "lags" array */
 	unsigned int lags_len;
 
 	/* Track the largest switch index within a tree */