From patchwork Wed May 3 08:46:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Talat Batheesh X-Patchwork-Id: 758100 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3wJ20k5yZYz9rxj; Thu, 4 May 2017 01:20:38 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="Q+H6T/Pg"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1d5w4t-0006bG-7J; Wed, 03 May 2017 15:20:31 +0000 Received: from mail-ve1eur01on0087.outbound.protection.outlook.com ([104.47.1.87] helo=EUR01-VE1-obe.outbound.protection.outlook.com) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1d5pvY-0000tQ-DL for kernel-team@lists.canonical.com; Wed, 03 May 2017 08:46:28 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=OIkD8cYZ1LpIBfdpCvENcGo/LjAkQm9ljpe+pBXswC8=; b=Q+H6T/PgjAK22HyoprT4EEESCx+mqv1+g7tUWI4GTn+UX3Z3ZKwj3pqPU7su4oUK6adAwFAKFdXefHv4x3mctSu7uqAvqaPGUHzNUA/5yF0gJB0ISHlFTVjzlebUEkiSEowGIuA52FnvOTohPZu4qYI3Gxv3Ry9qpyJb+ogZnLw= Authentication-Results: lists.canonical.com; dkim=none (message not signed) header.d=none; lists.canonical.com; dmarc=none action=none header.from=mellanox.com; Received: from dev-h-vrt-005.mth.labs.mlnx (193.47.165.251) by AM3PR05MB1297.eurprd05.prod.outlook.com (2a01:111:e400:586f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1061.12; Wed, 3 May 2017 08:46:25 +0000 From: Talat Batheesh To: Subject: [PATCH] [Xenial] bonding: allow notifications for bond_set_slave_link_state Date: Wed, 3 May 2017 11:46:02 +0300 Message-ID: <1493801162-13194-1-git-send-email-talatb@mellanox.com> X-Mailer: git-send-email 2.5.0 MIME-Version: 1.0 X-Originating-IP: [193.47.165.251] X-ClientProxiedBy: DB6P191CA0019.EURP191.PROD.OUTLOOK.COM (2603:10a6:6:28::29) To AM3PR05MB1297.eurprd05.prod.outlook.com (2a01:111:e400:586f::22) X-MS-Office365-Filtering-Correlation-Id: 25415e0a-616a-46d2-8d08-08d49200e28f X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:AM3PR05MB1297; X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB1297; 3:Cr0CbQkrKWSnj9J6gOYJpjhCGdveWbu7rH3HFbHk2CX87yk6C/z8WCh6LrUA5A91hhWDb4IFXEh8m9fAQ9by6ykriQNRsdfe3Y3Dc2aY3N/bdj7EhSSzLhBiasVDYGhY7FdIA8O/baU5SQF1L7pUlQ/EycVTnBvVCKvnZF6kMn42NCeQcVYhNs94xIvcBVYTl3gB9Hzh8Iy9pf50aiPddmRV+DYAJXbz6Yjfgshv37v1vkr8g4UtARY40tcTCVE/7DRcOUUep4C0Hwkdb/19x001ECgOidCu4VQQVrxNYpKAcgSvbktnqQJrll3g/HtN7yIWprfRUA90LWo72fsG7UZTSwKF3UocXkGTzXsynrw=; 25:xgWl2TiujuTSe68IT6KRO2T1ttx9QV3RORjuXjulxq4/zCTupLFkvaMudQTd3tIDXnjzkDHBR0wQB7c+YzKcz8FQLVxgQPV8LJ7vohzEXe+jD4FQqnTNt0A1I2wKaMZya9D4k2e96oVN27IIzbt+Byh5+bPgJTLfzhomvkQKL4OZp7BBqaM1PuR9/EpTl/kTG+BZ6gORZM09xJs8+/w7L3ot2ZSN2p3L1J0t/Rz5IMo/n6qlJ1HblDXVWhIZxA8BDek/QWXoGyOmPMsWGigoFAOh9Foha5cWrkBhXhFUqCqQ6pZoW56pzIMjPAgUwa38mn87ngiUx0aJ/AsfyyMIW2sl3H9DzH3q2Q1kVzDgOD5o5rG3AUwCzpqQ1xsxtQAfwXRMG0xm8nE52UuZvdkTe03Wc5Jp2ero95wmbtAzgU/RBnkBsI3k6jriWClBlM0MuiePIcejOf5vgE5DMHwuHQ== X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB1297; 31:GUHkJ7dBO9tgqjRK+G2gmERqTPdg6n/a7qbVqyXvNXYv+jSaa9Awd0t5UxnQzy7NfpOBXGuuyyhpEk27DRSyEh4Fs/UWxxYPUD9rC9JCNxg6CpQamnXT98iHHbFsJeMgoSOH7ThbakaDVabiyjRSLWQdGgLtgSfpdmvdvyIMQcI+6/jFapFJu3qH3NZA8IadP+uNqwezGTnM4Y0fhkUtdoHtokHc9a4d1mKwHkU+nNo=; 20:xgJUlPWiam3UToUkc553nexLyGd5B8ClHNCfw6FWsRQf/u1BpuZci4/fjiLJ+3ZhNZu30WY4kqqGIvMoclDl3sH1Fu7tU4Hjm0k8PNrLAUhM8+ZlLa8+eOIJcDMwfDOmKfXdi89XudbEF6XfCbRwq/4H/AbICBYy8U8a87ZKZ0bmCJiC3RMgqA/yv+JXMP0Tlrq0M+VVmZQ1iM4rsQk7N0bmYPPWTr6oa4oQNrUh7rsfDK3BDkyQ5KssV16weLrgG+zc5QidRkZFNCqmEVvYMP3PjOLGKrhXeM60xOrozUdGzTL3BPuc0HevZAqKR/ffxsGD/0hQVYqFDCf3l/9KlbLpCHuL1fav4RwJFOyrOEQipBFCJ7jwDq2wdZRNz8UfzP/X+GEjgkabEoMWhKsXepLilptC1JVoXl4DnFjHLCBt3/eFkor8+Cgr7Gic5fYsWGPwxU7Nca/JFAiaoEKTerwLLHL5txDF6Ejtmzute6kOEBE28798tsVAVkFRSV3F X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211254476889703)(24339691489775); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(6055026)(6041248)(20161123560025)(20161123555025)(20161123562025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148); SRVR:AM3PR05MB1297; BCL:0; PCL:0; RULEID:; SRVR:AM3PR05MB1297; X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB1297; 4:NPxHbWTcwncmV5ikmiGM/bwLKsXBivuaq4hneiWQTjOyOypBfZFdjLKD0IoAVtXBWvuwSGS8nCZds6wK8pWYOUJQbZD0sYxHuKx95MCkSUG6/ffbHgAs5xofpVitd+0RfJ86GQqvV0NBLICT+76919b13qiWek8jEozn4Qy2ANvMfr/DLpCVwrujFnEZYjQK6ZrI7MxccZoTan/JuFr1alJ4VfLZP9E4DeQnQSFPmDXOHN3GiSY4qE2bSViZw42EFF8M2B0i+Iy+0KVRnBxUVyNXlfb2vGQPGbazc0nPlNPmOdvsHkjgaBgunbKIC6WHge09QYAB+kVItx13DGJw0B64cbgH6PBLn+BEwZd+8ODKWK2mKixuWhW1pUDpsoyzSW/5Su/nCkUZBGDrfFwxo8WLejjXwQA+4bHd6ElpMH2tt20mmmciin+zASgc07VoLIHarvRHohH4iLapYqmIrl3owAiW4yq4td2xfpw/8+n3eBAQfQZIxVjjVreEFf3xWvPubmNjuvCQec3d5vU3tM8funhrABQUVZbql1g4d4OxzoUNnnU7sKWg0QlHpB9EhY8mVtNTYZaDYKIuOX/aie/eJvCiiPbKOQzwY1BL6OVJCf+CMeqbSAemuFZvVGC2wCQxfeAOfCY2qy4Kkc5nHZDndtlMjfA9zmRcOi2/gqUGFhD9gIgoycODgiGFqG+ZkAUjE9g4DZPo9Ox9zQ3mVopjzJCj9Wjq7tsDS9Me3OZbQUERq8yXtWq3Aupwp9AfMSnpwYLmuIp0/0WbWk4zPHu92aC9MLGPVCGxLXB0N0cpKgg731Vt6EjmeiMTpBlXPifemK3VlnhZtXISOrA5sgdg8pJlmDrUqn5PrxMbDqaQCdlPxHPeDmcVWJkB1Nkl X-Forefront-PRVS: 029651C7A1 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39410400002)(39860400002)(39850400002)(39450400003)(39400400002)(39840400002)(6512007)(2420400007)(36756003)(478600001)(45080400002)(305945005)(15650500001)(7736002)(86362001)(189998001)(7110500001)(48376002)(6916009)(38730400002)(6116002)(107886003)(110136004)(4326008)(50466002)(25786009)(3846002)(6666003)(966004)(8676002)(10710500007)(81166006)(6306002)(5003940100001)(33646002)(2351001)(50986999)(5660300001)(2906002)(53936002)(1720100001)(50226002)(6506006)(6486002)(42186005)(66066001)(47776003)(54906002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR05MB1297; H:dev-h-vrt-005.mth.labs.mlnx; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM3PR05MB1297; 23:YH6bXP0n8vzlHsZsoRWNW6Gt7vcLAzCRT1DZGavHm?= =?us-ascii?Q?5yRd3OnvlU/IGfT4G7IlCi1z9qbSyaD4MBPGjPAZsqQTJCj2edAoXw68JXtl?= =?us-ascii?Q?obS1AP88rPEu13oJwt+v0/WeHRCpo9EjKZOi7X4D3Un/0QTLYCO/Y82YwuV4?= =?us-ascii?Q?UD1uk4uaRbRcauYaSeBkGqNspeYdGVtkqW1C9YSa3WOG7SXHaSOj4wNXQJT3?= =?us-ascii?Q?vLnJELeSjheAlMhFJRi6BlVe08aYJWej94OVP9xjPvzEEj553QEXwzHo97yX?= =?us-ascii?Q?nJWl5kiINB9fYvJstOExnVbEPMQgzDwnRHowIXmnSgq8A200rYNclFhznNwQ?= =?us-ascii?Q?dpbWZixhEJZXgRxvmciFgin2bjDWopaonlS+qqpvg9xkaoIMB0LwElTl/qtS?= =?us-ascii?Q?HD8bzBBS47FE4fnewPug3Zx4vWKWJysJSqlHT2bIybJtmO6PetrwoHb9ZpcM?= =?us-ascii?Q?+nBZBBSkSNgrCwYnIpO7WuOE/YI2myhNt38Ia5F3fw9Y7u/ucjgXaRcr+2l+?= =?us-ascii?Q?xLt4NLmuQ3ardIvEFmDFoyh43eZQPoxCbLBbQrcQBMlpYKFyW5zfSPX09lrs?= =?us-ascii?Q?K8a+TxoMqn3HxC40dNRhFn5rjwwffVSggj1TeX0Kb9Ml/WWmHeJrZuU8NNpD?= =?us-ascii?Q?aOtbqgyWZV3MlqxkOd0DJdtZe1fswB2usKLB3X6DOrck2tafgTr2Pbg/EGlU?= =?us-ascii?Q?NJA5nQ3Pxr333+T2PFCtPkFLpF+R/su7HKjr9qhaFigSFobtZCcwbdMNfbGx?= =?us-ascii?Q?HcgmNUV6XxbybI61Mn0ihP5Mpw3NwQZVE3TvtodglgFrbiH6+lNcZSrspcSz?= =?us-ascii?Q?L35C126DxSdBLTOjnwTdCyau7YLRh3TcfaxrNpEsCwXNzP+SZ/bO24CL35Vc?= =?us-ascii?Q?EUv5FoxVA3FZr/0Tsu+afmScSCbcjFiXi2G1kMK3230Yq5xi7vzlC6UmJHXQ?= =?us-ascii?Q?oQXGR7p913fERq9QhbJ01HAFXhJMnr/mDo1YtbpoAwu/DzmA5uCcuXTtrjJQ?= =?us-ascii?Q?8DSkCdLnAjj7Kk60rXP4km6scm0tNufHZk4DdckYNbJ5mZPf4S66z7zUVBMu?= =?us-ascii?Q?Wgwn2zq/jP+SvmemBmMRzGmxQYdtIv18RTnLGD+JRV9qHKdyyqOkTFsyu3wD?= =?us-ascii?Q?k74t/JsuE3fLmJUQFyOKbxnCpxpbzUU/OfzpYpWe6V5lSOFuQuzyrtt4QtMr?= =?us-ascii?Q?UZNHGUutu3LW5qtNM6VGsqvqCfMBqoFJJPtUXf4yuJ3lcDCmuytswc5w9tRy?= =?us-ascii?Q?rdfoO3ymL44KJmqGrpCUYXhZTGnvSXwZfyrbAG2?= X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB1297; 6:0X1/Hv51uRwxUHuH0PB/TppBxFpri3lFCtvBf9z4J/gibl8qeWA80GOW3aYVcRYRmgA6m0fVbusXjEJAyUw4/Q+Dkhmkp0YH4cHG1teBioHrzRyoG6xejqxGaBCoBHcRBYtjH9zJZNA9HZsDU/WmhszqVor5gM/BlsEAZ2M86I8NJ8OfbKnvHC35ro/o2qlQitpx6QhBlAzpioHTfSftr2TV6PFVtCdX1pgEdBR3Zo/HXqsNVUN5Vjdl1DGPVy4yPmN6Pr6xyZyt7kqqXT84CDR/q+knLXCTxurZ2kTql7gXBq1YZV3JPuGGTi1fk08mz0WTHy5iRGqMNRfLJBs8KFqEskEuAjXKm7QzYPa6ZIVsaRS7aUdp1pfghT0tCQ4XswqD2KgiHLOzLun82ULXFU2n0ceUaqpo1b640DETgX2RO1w1Rit7LUvds9CrlodcqXzE14r6lodTxveNHQT+ld1BLh3kKQ75jtWLQf7rsmc/bXE8iHmTob9YPVE4TMfuNSa/MUo/jJceqxjSdFLzi6gGouTh0cO8PRvW4dAxAoM=; 5:xUXl4imUif8c0PCn/Z1NkeRT8B6QXJYBKl6k/BjQjVAWblOUNu67QT1XiSA9anSVACgUDqqqK3hX7i9gqcB6We8GRyOIder2pOUbocLGa5H1cx8j0aIThTQtxbz0L5mrS7JhpdWGSB2T/t8thru8rw==; 24:fB/vjoIR5i8odtjxOcrINT+Xr/6FBu4IABYjFJlJ/824RtPahDSYan1C87XCqZe1JzltsKUDivoa/NmLYY9qnld5SBCpXqoPhYrEOj5C1L4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM3PR05MB1297; 7:Yq9TbnKEHAZFmNBXyB0h6QBvUI9m4yc1wCjWw59W6l2vtaEUbWZICUX1/kEmZ9Foo65y4+SecQeKcsPWEnqP+I0fqQkkqSg3OseFiD/0MlV+mU3AJuxLLOoLKD09NvZRNC733byRDQee61yLwnoE9Sivtn3aI5b4eue10A3KsjYuzVx9j4E+aJawuopyCIWB/OKR7iuSwvDxkJcV3oXXX9uJM5y9aiz7y5l9SxrV5DZfBUFDoQa0cCeQgCoFNeA/3Q/pSmZ+X9bu5b2Etvhp+/YdgpK6iGr7fiW5UY6ga/IwphFAxJ6+O7+29p78YUAwUk1ZiV9o2tSieLK5b5ARmg== X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 May 2017 08:46:25.8702 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR05MB1297 X-Mailman-Approved-At: Wed, 03 May 2017 15:20:30 +0000 Cc: noas@mellanox.com, talatb@mellanox.com, gideonn@mellanox.com X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Jiri Pirko BugLink: http://bugs.launchpad.net/bugs/1687877 Similar to state notifications. We allow caller to indicate if the notification should happen now or later, depending on if he holds rtnl mutex or not. Introduce bond_slave_link_notify function (similar to bond_slave_state_notify) which is later on called with rtnl mutex and goes over slaves and executes delayed notification. Signed-off-by: Jiri Pirko Signed-off-by: David S. Miller (cherry picked from commit 5d397061ca2081d8a99e4bee5792122faa6aaf86) Signed-off-by: Talat Batheesh Signed-off-by: Seth Forshee --- drivers/net/bonding/bond_main.c | 54 +++++++++++++++++++++++++++-------------- include/net/bonding.h | 32 +++++++++++++++++++++--- 2 files changed, 65 insertions(+), 21 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 896537d..36a8769 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -832,7 +832,8 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active) } new_active->delay = 0; - bond_set_slave_link_state(new_active, BOND_LINK_UP); + bond_set_slave_link_state(new_active, BOND_LINK_UP, + BOND_SLAVE_NOTIFY_NOW); if (BOND_MODE(bond) == BOND_MODE_8023AD) bond_3ad_handle_link_change(new_active, BOND_LINK_UP); @@ -1577,21 +1578,26 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) if (bond_check_dev_link(bond, slave_dev, 0) == BMSR_LSTATUS) { if (bond->params.updelay) { bond_set_slave_link_state(new_slave, - BOND_LINK_BACK); + BOND_LINK_BACK, + BOND_SLAVE_NOTIFY_NOW); new_slave->delay = bond->params.updelay; } else { bond_set_slave_link_state(new_slave, - BOND_LINK_UP); + BOND_LINK_UP, + BOND_SLAVE_NOTIFY_NOW); } } else { - bond_set_slave_link_state(new_slave, BOND_LINK_DOWN); + bond_set_slave_link_state(new_slave, BOND_LINK_DOWN, + BOND_SLAVE_NOTIFY_NOW); } } else if (bond->params.arp_interval) { bond_set_slave_link_state(new_slave, (netif_carrier_ok(slave_dev) ? - BOND_LINK_UP : BOND_LINK_DOWN)); + BOND_LINK_UP : BOND_LINK_DOWN), + BOND_SLAVE_NOTIFY_NOW); } else { - bond_set_slave_link_state(new_slave, BOND_LINK_UP); + bond_set_slave_link_state(new_slave, BOND_LINK_UP, + BOND_SLAVE_NOTIFY_NOW); } if (new_slave->link != BOND_LINK_DOWN) @@ -2011,7 +2017,8 @@ static int bond_miimon_inspect(struct bonding *bond) if (link_state) continue; - bond_set_slave_link_state(slave, BOND_LINK_FAIL); + bond_set_slave_link_state(slave, BOND_LINK_FAIL, + BOND_SLAVE_NOTIFY_LATER); slave->delay = bond->params.downdelay; if (slave->delay) { netdev_info(bond->dev, "link status down for %sinterface %s, disabling it in %d ms\n", @@ -2026,7 +2033,8 @@ static int bond_miimon_inspect(struct bonding *bond) case BOND_LINK_FAIL: if (link_state) { /* recovered before downdelay expired */ - bond_set_slave_link_state(slave, BOND_LINK_UP); + bond_set_slave_link_state(slave, BOND_LINK_UP, + BOND_SLAVE_NOTIFY_LATER); slave->last_link_up = jiffies; netdev_info(bond->dev, "link status up again after %d ms for interface %s\n", (bond->params.downdelay - slave->delay) * @@ -2048,7 +2056,8 @@ static int bond_miimon_inspect(struct bonding *bond) if (!link_state) continue; - bond_set_slave_link_state(slave, BOND_LINK_BACK); + bond_set_slave_link_state(slave, BOND_LINK_BACK, + BOND_SLAVE_NOTIFY_LATER); slave->delay = bond->params.updelay; if (slave->delay) { @@ -2062,7 +2071,8 @@ static int bond_miimon_inspect(struct bonding *bond) case BOND_LINK_BACK: if (!link_state) { bond_set_slave_link_state(slave, - BOND_LINK_DOWN); + BOND_LINK_DOWN, + BOND_SLAVE_NOTIFY_LATER); netdev_info(bond->dev, "link status down again after %d ms for interface %s\n", (bond->params.updelay - slave->delay) * bond->params.miimon, @@ -2100,7 +2110,8 @@ static void bond_miimon_commit(struct bonding *bond) continue; case BOND_LINK_UP: - bond_set_slave_link_state(slave, BOND_LINK_UP); + bond_set_slave_link_state(slave, BOND_LINK_UP, + BOND_SLAVE_NOTIFY_NOW); slave->last_link_up = jiffies; primary = rtnl_dereference(bond->primary_slave); @@ -2140,7 +2151,8 @@ static void bond_miimon_commit(struct bonding *bond) if (slave->link_failure_count < UINT_MAX) slave->link_failure_count++; - bond_set_slave_link_state(slave, BOND_LINK_DOWN); + bond_set_slave_link_state(slave, BOND_LINK_DOWN, + BOND_SLAVE_NOTIFY_NOW); if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP || BOND_MODE(bond) == BOND_MODE_8023AD) @@ -2738,7 +2750,8 @@ static void bond_ab_arp_commit(struct bonding *bond) struct slave *current_arp_slave; current_arp_slave = rtnl_dereference(bond->current_arp_slave); - bond_set_slave_link_state(slave, BOND_LINK_UP); + bond_set_slave_link_state(slave, BOND_LINK_UP, + BOND_SLAVE_NOTIFY_NOW); if (current_arp_slave) { bond_set_slave_inactive_flags( current_arp_slave, @@ -2761,7 +2774,8 @@ static void bond_ab_arp_commit(struct bonding *bond) if (slave->link_failure_count < UINT_MAX) slave->link_failure_count++; - bond_set_slave_link_state(slave, BOND_LINK_DOWN); + bond_set_slave_link_state(slave, BOND_LINK_DOWN, + BOND_SLAVE_NOTIFY_NOW); bond_set_slave_inactive_flags(slave, BOND_SLAVE_NOTIFY_NOW); @@ -2840,7 +2854,8 @@ static bool bond_ab_arp_probe(struct bonding *bond) * up when it is actually down */ if (!bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) { - bond_set_slave_link_state(slave, BOND_LINK_DOWN); + bond_set_slave_link_state(slave, BOND_LINK_DOWN, + BOND_SLAVE_NOTIFY_LATER); if (slave->link_failure_count < UINT_MAX) slave->link_failure_count++; @@ -2860,7 +2875,8 @@ static bool bond_ab_arp_probe(struct bonding *bond) if (!new_slave) goto check_state; - bond_set_slave_link_state(new_slave, BOND_LINK_BACK); + bond_set_slave_link_state(new_slave, BOND_LINK_BACK, + BOND_SLAVE_NOTIFY_LATER); bond_set_slave_active_flags(new_slave, BOND_SLAVE_NOTIFY_LATER); bond_arp_send_all(bond, new_slave); new_slave->last_link_up = jiffies; @@ -2868,7 +2884,7 @@ static bool bond_ab_arp_probe(struct bonding *bond) check_state: bond_for_each_slave_rcu(bond, slave, iter) { - if (slave->should_notify) { + if (slave->should_notify || slave->should_notify_link) { should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW; break; } @@ -2923,8 +2939,10 @@ re_arm: if (should_notify_peers) call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, bond->dev); - if (should_notify_rtnl) + if (should_notify_rtnl) { bond_slave_state_notify(bond); + bond_slave_link_notify(bond); + } rtnl_unlock(); } diff --git a/include/net/bonding.h b/include/net/bonding.h index 93abe5f..da10395 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h @@ -165,7 +165,8 @@ struct slave { u8 backup:1, /* indicates backup slave. Value corresponds with BOND_STATE_ACTIVE and BOND_STATE_BACKUP */ inactive:1, /* indicates inactive slave */ - should_notify:1; /* indicateds whether the state changed */ + should_notify:1, /* indicates whether the state changed */ + should_notify_link:1; /* indicates whether the link changed */ u8 duplex; u32 original_mtu; u32 link_failure_count; @@ -505,10 +506,35 @@ static inline bool bond_is_slave_inactive(struct slave *slave) return slave->inactive; } -static inline void bond_set_slave_link_state(struct slave *slave, int state) +static inline void bond_set_slave_link_state(struct slave *slave, int state, + bool notify) { + if (slave->link == state) + return; + slave->link = state; - bond_queue_slave_event(slave); + if (notify) { + bond_queue_slave_event(slave); + slave->should_notify_link = 0; + } else { + if (slave->should_notify_link) + slave->should_notify_link = 0; + else + slave->should_notify_link = 1; + } +} + +static inline void bond_slave_link_notify(struct bonding *bond) +{ + struct list_head *iter; + struct slave *tmp; + + bond_for_each_slave(bond, tmp, iter) { + if (tmp->should_notify_link) { + bond_queue_slave_event(tmp); + tmp->should_notify_link = 0; + } + } } static inline __be32 bond_confirm_addr(struct net_device *dev, __be32 dst, __be32 local)