Skip setting the same hwaddr to a lag port if not needed
diff mbox series

Message ID 1588622293-3463-1-git-send-email-pavel.contrib@gmail.com
State New
Headers show
Series
  • Skip setting the same hwaddr to a lag port if not needed
Related show

Commit Message

Pavel Shirshov May 4, 2020, 7:58 p.m. UTC
Avoid setting the same mac address to a LAG port,
if the LAG port already has the right one.

Benefits:
1. Make libteam avoid changing settings of a link,
which prevents the kernel from sending multiply Netlink
messages. Netlink message listeners don't need to react
to the Netlink messages.

2. Libteam works faster. It doesn't need to use any
syscalls and go deep into libteam functions in the case
when nothing is changed. A straightforward check and
libteam avoid much work.

In the case, when libteam user has hundreds of ports,
and up to a hundred LAGs, this patch saves them significant
CPU time.

Signed-off-by: Pavel Shirshov <pavel.contrib@gmail.com>
---
 teamd/teamd.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Jiri Pirko May 11, 2020, 5:36 a.m. UTC | #1
Mon, May 04, 2020 at 09:58:13PM CEST, pavel.contrib@gmail.com wrote:
>Avoid setting the same mac address to a LAG port,
>if the LAG port already has the right one.
>
>Benefits:
>1. Make libteam avoid changing settings of a link,
>which prevents the kernel from sending multiply Netlink
>messages. Netlink message listeners don't need to react
>to the Netlink messages.
>
>2. Libteam works faster. It doesn't need to use any
>syscalls and go deep into libteam functions in the case
>when nothing is changed. A straightforward check and
>libteam avoid much work.
>
>In the case, when libteam user has hundreds of ports,
>and up to a hundred LAGs, this patch saves them significant
>CPU time.
>
>Signed-off-by: Pavel Shirshov <pavel.contrib@gmail.com>

applied, thanks!

Patch
diff mbox series

diff --git a/teamd/teamd.c b/teamd/teamd.c
index 8cdc16d..f955b19 100644
--- a/teamd/teamd.c
+++ b/teamd/teamd.c
@@ -837,7 +837,14 @@  static int teamd_set_hwaddr(struct teamd_context *ctx)
 		err = -EINVAL;
 		goto free_hwaddr;
 	}
-	err = team_hwaddr_set(ctx->th, ctx->ifindex, hwaddr, hwaddr_len);
+
+	if (memcmp(hwaddr, ctx->hwaddr, hwaddr_len))
+		err = team_hwaddr_set(ctx->th, ctx->ifindex, hwaddr, hwaddr_len);
+	else {
+		err = 0;
+		teamd_log_dbg(ctx, "Skip setting same hwaddr string: \"%s\".", hwaddr_str);
+	}
+
 	if (!err)
 		ctx->hwaddr_explicit = true;
 free_hwaddr: