blob: 3e03c8968fa30cfc319f6b565baa221bc4c31c89 [file] [log] [blame]
Todd Foggoaa292c8c2016-04-06 09:57:01 -04001From a2f08a919c72af29c56b937e6c92eb104037fed5 Mon Sep 17 00:00:00 2001
2From: Nelson Escobar <neescoba@cisco.com>
3Date: Tue, 22 Mar 2016 13:42:08 -0700
4Subject: [PATCH 22/22] bonding: fix bond link detect in non-interrupt mode
John Lo23650e62016-03-29 16:14:35 -04005
John Lo23650e62016-03-29 16:14:35 -04006 Stopping then re-starting a bond interface containing slaves that
7 used polling for link detection caused the bond to think all slave
8 links were down and inactive.
Todd Foggoaa292c8c2016-04-06 09:57:01 -04009
John Lo23650e62016-03-29 16:14:35 -040010 Move the start of the polling for link from slave_add() to
11 bond_ethdev_start() and in bond_ethdev_stop() make sure we clear
12 the last_link_status of the slaves.
Todd Foggoaa292c8c2016-04-06 09:57:01 -040013
John Lo23650e62016-03-29 16:14:35 -040014 Signed-off-by: Nelson Escobar <neescoba@cisco.com>
15 Signed-off-by: John Daley <johndale@cisco.com>
Todd Foggoaa292c8c2016-04-06 09:57:01 -040016---
17 drivers/net/bonding/rte_eth_bond_pmd.c | 27 +++++++++++++++++----------
18 1 file changed, 17 insertions(+), 10 deletions(-)
John Lo23650e62016-03-29 16:14:35 -040019
20diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
Todd Foggoaa292c8c2016-04-06 09:57:01 -040021index b1373c6..d32c6f5 100644
John Lo23650e62016-03-29 16:14:35 -040022--- a/drivers/net/bonding/rte_eth_bond_pmd.c
23+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
Todd Foggoaa292c8c2016-04-06 09:57:01 -040024@@ -1447,18 +1447,11 @@ slave_add(struct bond_dev_private *internals,
John Lo23650e62016-03-29 16:14:35 -040025 slave_details->port_id = slave_eth_dev->data->port_id;
26 slave_details->last_link_status = 0;
27
28- /* If slave device doesn't support interrupts then we need to enabled
29- * polling to monitor link status */
30+ /* Mark slave devices that don't support interrupts so we can
31+ * compensate when we start the bond
32+ */
33 if (!(slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)) {
34 slave_details->link_status_poll_enabled = 1;
35-
36- if (!internals->link_status_polling_enabled) {
37- internals->link_status_polling_enabled = 1;
38-
39- rte_eal_alarm_set(internals->link_status_polling_interval_ms * 1000,
40- bond_ethdev_slave_link_status_change_monitor,
41- (void *)&rte_eth_devices[internals->port_id]);
42- }
43 }
44
45 slave_details->link_status_wait_to_complete = 0;
Todd Foggoaa292c8c2016-04-06 09:57:01 -040046@@ -1543,6 +1536,18 @@ bond_ethdev_start(struct rte_eth_dev *eth_dev)
John Lo23650e62016-03-29 16:14:35 -040047 eth_dev->data->port_id, internals->slaves[i].port_id);
48 return -1;
49 }
50+ /* We will need to poll for link status if any slave doesn't
51+ * support interrupts
52+ */
53+ if (internals->slaves[i].link_status_poll_enabled)
54+ internals->link_status_polling_enabled = 1;
55+ }
56+ /* start polling if needed */
57+ if (internals->link_status_polling_enabled) {
58+ rte_eal_alarm_set(
59+ internals->link_status_polling_interval_ms * 1000,
60+ bond_ethdev_slave_link_status_change_monitor,
61+ (void *)&rte_eth_devices[internals->port_id]);
62 }
63
64 if (internals->user_defined_primary_port)
Todd Foggoaa292c8c2016-04-06 09:57:01 -040065@@ -1615,6 +1620,8 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev)
John Lo23650e62016-03-29 16:14:35 -040066
67 internals->active_slave_count = 0;
68 internals->link_status_polling_enabled = 0;
69+ for (i = 0; i < internals->slave_count; i++)
70+ internals->slaves[i].last_link_status = 0;
71
72 eth_dev->data->dev_link.link_status = 0;
73 eth_dev->data->dev_started = 0;
Todd Foggoaa292c8c2016-04-06 09:57:01 -040074--
751.9.1
76