Tue, Sep 01, 2020 at 07:59:27AM CEST, lucien.xin(a)gmail.com wrote:
This reverts commit deadb5b715227429a1879b187f5906b39151eca9.
As Patrick noticed, with that commit, teamd_port_check_enable()
would set the team port to the new state unconditionally, which
triggers another change message from kernel to userspace, then
teamd_port_check_enable() is called again to set the team port
to the new state.
This would go around and around to update the team port state,
and even cause teamd to consume 100% cpu.
As the issue caused by that commit is serious, it has to be
reverted. As for the issued fixed by that commit, I would
propose a new fix later.
Hi Xin. Any progress with the fix? I would like to do a libteam release
soon but I'm happy to wait couple of days if the fix is in pipes.
> teamd/teamd_per_port.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>diff --git a/teamd/teamd_per_port.c b/teamd/teamd_per_port.c
>index 166da57..d429753 100644
>@@ -442,14 +442,18 @@ int teamd_port_check_enable(struct teamd_context *ctx,
> bool should_enable, bool should_disable)
> bool new_enabled_state;
>+ bool curr_enabled_state;
> int err;
> if (!teamd_port_present(ctx, tdport))
> return 0;
>+ err = teamd_port_enabled(ctx, tdport, &curr_enabled_state);
>+ if (err)
>+ return err;
>- if (should_enable)
>+ if (!curr_enabled_state && should_enable)
> new_enabled_state = true;
>- else if (should_disable)
>+ else if (curr_enabled_state && should_disable)
> new_enabled_state = false;
> return 0;