From patchwork Fri Sep 21 11:51:59 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 185714 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 401F62C0085 for ; Fri, 21 Sep 2012 21:52:11 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752186Ab2IULwF (ORCPT ); Fri, 21 Sep 2012 07:52:05 -0400 Received: from mail-wg0-f44.google.com ([74.125.82.44]:37666 "EHLO mail-wg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751436Ab2IULwD (ORCPT ); Fri, 21 Sep 2012 07:52:03 -0400 Received: by wgbdr13 with SMTP id dr13so1370681wgb.1 for ; Fri, 21 Sep 2012 04:52:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=9+2bN+XZWdFwNGADQrAQkH/kaohmaRD5n88XPRvxKfU=; b=jXWZ7t1A7bkQKIo5mo7GIqEyP/tW4WPhnRbMwNwCUUCSY15vUlEATTxc/siJD1KI07 HoyJebRI0ofyTTBOwAXxhlvMpu/veR20k66o2tcC+HMkAua6WlV7fhlYuy9RB3v3+Apj ZXpIImuf2pHo3Wqci3YkDtwyVmzrq59TUGUTDpLKdBlYgDDBRSGOI0Kf9MgUWp7nag/Z FUWqeT32WGE7EPjjUWBMttcYr0wsXZyJK6fBX3ap1Y17QivncIonlY5qSMQ8g8aQ5EKH gOdW2tyylNQ5dv9yvn+JSqZa5HlWbTPLS3pJ0NKLMJGd6O+7sBRryXB3xDmyTNbKrgbU 0M5A== Received: by 10.216.240.3 with SMTP id d3mr2967328wer.87.1348228322277; Fri, 21 Sep 2012 04:52:02 -0700 (PDT) Received: from localhost (ip-89-102-4-38.net.upcbroadband.cz. [89.102.4.38]) by mx.google.com with ESMTPS id bc2sm16264624wib.0.2012.09.21.04.52.00 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 21 Sep 2012 04:52:01 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net Subject: [patch net-next] team: send port changed when added Date: Fri, 21 Sep 2012 13:51:59 +0200 Message-Id: <1348228319-11453-1-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 1.7.11.4 X-Gm-Message-State: ALoCoQkTxfI1kTXwHcp1UdZYXDJ2mBgkzAjahShHWt8xP6vFxZ4zKSChlWWBGJK7ls45Hl/p5qLM Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On some hw, link is not up during adding iface to team. That causes event not being sent to userspace and that may cause confusion. Fix this bug by sending port changed event once it's added to team. Signed-off-by: Jiri Pirko --- drivers/net/team/team.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 266af7b..9ce0c51 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -966,7 +966,8 @@ static struct netpoll_info *team_netpoll_info(struct team *team) } #endif -static void __team_port_change_check(struct team_port *port, bool linkup); +static void __team_port_change_port_added(struct team_port *port, bool linkup); + static int team_dev_type_check_change(struct net_device *dev, struct net_device *port_dev); @@ -1079,7 +1080,7 @@ static int team_port_add(struct team *team, struct net_device *port_dev) team_port_enable(team, port); list_add_tail_rcu(&port->list, &team->port_list); __team_compute_features(team); - __team_port_change_check(port, !!netif_carrier_ok(port_dev)); + __team_port_change_port_added(port, !!netif_carrier_ok(port_dev)); __team_options_change_check(team); netdev_info(dev, "Port device %s added\n", portname); @@ -1114,6 +1115,8 @@ err_set_mtu: return err; } +static void __team_port_change_port_removed(struct team_port *port); + static int team_port_del(struct team *team, struct net_device *port_dev) { struct net_device *dev = team->dev; @@ -1130,8 +1133,7 @@ static int team_port_del(struct team *team, struct net_device *port_dev) __team_option_inst_mark_removed_port(team, port); __team_options_change_check(team); __team_option_inst_del_port(team, port); - port->removed = true; - __team_port_change_check(port, false); + __team_port_change_port_removed(port); team_port_disable(team, port); list_del_rcu(&port->list); netdev_rx_handler_unregister(port_dev); @@ -2499,13 +2501,11 @@ static void __team_options_change_check(struct team *team) } /* rtnl lock is held */ -static void __team_port_change_check(struct team_port *port, bool linkup) + +static void __team_port_change_send(struct team_port *port, bool linkup) { int err; - if (!port->removed && port->state.linkup == linkup) - return; - port->changed = true; port->state.linkup = linkup; team_refresh_port_linkup(port); @@ -2530,6 +2530,23 @@ send_event: } +static void __team_port_change_check(struct team_port *port, bool linkup) +{ + if (port->state.linkup != linkup) + __team_port_change_send(port, linkup); +} + +static void __team_port_change_port_added(struct team_port *port, bool linkup) +{ + __team_port_change_send(port, linkup); +} + +static void __team_port_change_port_removed(struct team_port *port) +{ + port->removed = true; + __team_port_change_send(port, false); +} + static void team_port_change_check(struct team_port *port, bool linkup) { struct team *team = port->team;