Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bonding: remove usage of dev->master

Benefit from new upper dev list and free bonding from dev->master usage.

Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
471cb5a3 7f6e7101

+81 -64
+15 -15
drivers/net/bonding/bond_3ad.c
··· 1127 1127 // INFO_RECEIVED_LOOPBACK_FRAMES 1128 1128 pr_err("%s: An illegal loopback occurred on adapter (%s).\n" 1129 1129 "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", 1130 - port->slave->dev->master->name, port->slave->dev->name); 1130 + port->slave->bond->dev->name, port->slave->dev->name); 1131 1131 return; 1132 1132 } 1133 1133 __update_selected(lacpdu, port); ··· 1306 1306 } 1307 1307 if (!curr_port) { // meaning: the port was related to an aggregator but was not on the aggregator port list 1308 1308 pr_warning("%s: Warning: Port %d (on %s) was related to aggregator %d but was not on its port list\n", 1309 - port->slave->dev->master->name, 1309 + port->slave->bond->dev->name, 1310 1310 port->actor_port_number, 1311 1311 port->slave->dev->name, 1312 1312 port->aggregator->aggregator_identifier); ··· 1386 1386 port->aggregator->aggregator_identifier); 1387 1387 } else { 1388 1388 pr_err("%s: Port %d (on %s) did not find a suitable aggregator\n", 1389 - port->slave->dev->master->name, 1389 + port->slave->bond->dev->name, 1390 1390 port->actor_port_number, port->slave->dev->name); 1391 1391 } 1392 1392 } ··· 1463 1463 1464 1464 default: 1465 1465 pr_warning("%s: Impossible agg select mode %d\n", 1466 - curr->slave->dev->master->name, 1466 + curr->slave->bond->dev->name, 1467 1467 __get_agg_selection_mode(curr->lag_ports)); 1468 1468 break; 1469 1469 } ··· 1571 1571 // check if any partner replys 1572 1572 if (best->is_individual) { 1573 1573 pr_warning("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n", 1574 - best->slave ? best->slave->dev->master->name : "NULL"); 1574 + best->slave ? best->slave->bond->dev->name : "NULL"); 1575 1575 } 1576 1576 1577 1577 best->is_active = 1; ··· 1898 1898 1899 1899 if (bond == NULL) { 1900 1900 pr_err("%s: The slave %s is not attached to its bond\n", 1901 - slave->dev->master->name, slave->dev->name); 1901 + slave->bond->dev->name, slave->dev->name); 1902 1902 return -1; 1903 1903 } 1904 1904 ··· 1973 1973 // if slave is null, the whole port is not initialized 1974 1974 if (!port->slave) { 1975 1975 pr_warning("Warning: %s: Trying to unbind an uninitialized port on %s\n", 1976 - slave->dev->master->name, slave->dev->name); 1976 + slave->bond->dev->name, slave->dev->name); 1977 1977 return; 1978 1978 } 1979 1979 ··· 2009 2009 2010 2010 if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) { 2011 2011 pr_info("%s: Removing an active aggregator\n", 2012 - aggregator->slave->dev->master->name); 2012 + aggregator->slave->bond->dev->name); 2013 2013 // select new active aggregator 2014 2014 select_new_active_agg = 1; 2015 2015 } ··· 2040 2040 ad_agg_selection_logic(__get_first_agg(port)); 2041 2041 } else { 2042 2042 pr_warning("%s: Warning: unbinding aggregator, and could not find a new aggregator for its ports\n", 2043 - slave->dev->master->name); 2043 + slave->bond->dev->name); 2044 2044 } 2045 2045 } else { // in case that the only port related to this aggregator is the one we want to remove 2046 2046 select_new_active_agg = aggregator->is_active; ··· 2048 2048 ad_clear_agg(aggregator); 2049 2049 if (select_new_active_agg) { 2050 2050 pr_info("%s: Removing an active aggregator\n", 2051 - slave->dev->master->name); 2051 + slave->bond->dev->name); 2052 2052 // select new active aggregator 2053 2053 ad_agg_selection_logic(__get_first_agg(port)); 2054 2054 } ··· 2076 2076 ad_clear_agg(temp_aggregator); 2077 2077 if (select_new_active_agg) { 2078 2078 pr_info("%s: Removing an active aggregator\n", 2079 - slave->dev->master->name); 2079 + slave->bond->dev->name); 2080 2080 // select new active aggregator 2081 2081 ad_agg_selection_logic(__get_first_agg(port)); 2082 2082 } ··· 2184 2184 2185 2185 if (!port->slave) { 2186 2186 pr_warning("%s: Warning: port of slave %s is uninitialized\n", 2187 - slave->dev->name, slave->dev->master->name); 2187 + slave->dev->name, slave->bond->dev->name); 2188 2188 return ret; 2189 2189 } 2190 2190 ··· 2240 2240 // if slave is null, the whole port is not initialized 2241 2241 if (!port->slave) { 2242 2242 pr_warning("Warning: %s: speed changed for uninitialized port on %s\n", 2243 - slave->dev->master->name, slave->dev->name); 2243 + slave->bond->dev->name, slave->dev->name); 2244 2244 return; 2245 2245 } 2246 2246 ··· 2268 2268 // if slave is null, the whole port is not initialized 2269 2269 if (!port->slave) { 2270 2270 pr_warning("%s: Warning: duplex changed for uninitialized port on %s\n", 2271 - slave->dev->master->name, slave->dev->name); 2271 + slave->bond->dev->name, slave->dev->name); 2272 2272 return; 2273 2273 } 2274 2274 ··· 2297 2297 // if slave is null, the whole port is not initialized 2298 2298 if (!port->slave) { 2299 2299 pr_warning("Warning: %s: link status changed for uninitialized port on %s\n", 2300 - slave->dev->master->name, slave->dev->name); 2300 + slave->bond->dev->name, slave->dev->name); 2301 2301 return; 2302 2302 } 2303 2303
+3 -3
drivers/net/bonding/bond_alb.c
··· 507 507 client_info->mac_dst); 508 508 if (!skb) { 509 509 pr_err("%s: Error: failed to create an ARP packet\n", 510 - client_info->slave->dev->master->name); 510 + client_info->slave->bond->dev->name); 511 511 continue; 512 512 } 513 513 ··· 517 517 skb = vlan_put_tag(skb, client_info->vlan_id); 518 518 if (!skb) { 519 519 pr_err("%s: Error: failed to insert VLAN tag\n", 520 - client_info->slave->dev->master->name); 520 + client_info->slave->bond->dev->name); 521 521 continue; 522 522 } 523 523 } ··· 1043 1043 if (dev_set_mac_address(dev, &s_addr)) { 1044 1044 pr_err("%s: Error: dev_set_mac_address of dev %s failed!\n" 1045 1045 "ALB mode requires that the base driver support setting the hw address also when the network device's interface is open\n", 1046 - dev->master->name, dev->name); 1046 + slave->bond->dev->name, dev->name); 1047 1047 return -EOPNOTSUPP; 1048 1048 } 1049 1049 return 0;
+55 -39
drivers/net/bonding/bond_main.c
··· 746 746 { 747 747 struct in_device *in_dev; 748 748 749 - rcu_read_lock(); 750 749 in_dev = __in_dev_get_rcu(dev); 751 750 if (in_dev) 752 751 ip_mc_rejoin_groups(in_dev); 753 - rcu_read_unlock(); 754 752 } 755 753 756 754 /* ··· 758 760 */ 759 761 static void bond_resend_igmp_join_requests(struct bonding *bond) 760 762 { 761 - struct net_device *bond_dev, *vlan_dev, *master_dev; 763 + struct net_device *bond_dev, *vlan_dev, *upper_dev; 762 764 struct vlan_entry *vlan; 763 765 766 + rcu_read_lock(); 764 767 read_lock(&bond->lock); 765 768 766 769 bond_dev = bond->dev; ··· 773 774 * if bond is enslaved to a bridge, 774 775 * then rejoin all groups on its master 775 776 */ 776 - master_dev = bond_dev->master; 777 - if (master_dev) 778 - if ((master_dev->priv_flags & IFF_EBRIDGE) 779 - && (bond_dev->priv_flags & IFF_BRIDGE_PORT)) 780 - __bond_resend_igmp_join_requests(master_dev); 777 + upper_dev = netdev_master_upper_dev_get_rcu(bond_dev); 778 + if (upper_dev && upper_dev->priv_flags & IFF_EBRIDGE) 779 + __bond_resend_igmp_join_requests(upper_dev); 781 780 782 781 /* rejoin all groups on vlan devices */ 783 782 list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { 784 - rcu_read_lock(); 785 783 vlan_dev = __vlan_find_dev_deep(bond_dev, 786 784 vlan->vlan_id); 787 - rcu_read_unlock(); 788 785 if (vlan_dev) 789 786 __bond_resend_igmp_join_requests(vlan_dev); 790 787 } ··· 789 794 queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); 790 795 791 796 read_unlock(&bond->lock); 797 + rcu_read_unlock(); 792 798 } 793 799 794 800 static void bond_resend_igmp_join_requests_delayed(struct work_struct *work) 795 801 { 796 802 struct bonding *bond = container_of(work, struct bonding, 797 803 mcast_work.work); 804 + rcu_read_lock(); 798 805 bond_resend_igmp_join_requests(bond); 806 + rcu_read_unlock(); 799 807 } 800 808 801 809 /* ··· 1491 1493 return ret; 1492 1494 } 1493 1495 1496 + static int bond_master_upper_dev_link(struct net_device *bond_dev, 1497 + struct net_device *slave_dev) 1498 + { 1499 + int err; 1500 + 1501 + err = netdev_master_upper_dev_link(slave_dev, bond_dev); 1502 + if (err) 1503 + return err; 1504 + slave_dev->flags |= IFF_SLAVE; 1505 + rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE); 1506 + return 0; 1507 + } 1508 + 1509 + static void bond_upper_dev_unlink(struct net_device *bond_dev, 1510 + struct net_device *slave_dev) 1511 + { 1512 + netdev_upper_dev_unlink(slave_dev, bond_dev); 1513 + slave_dev->flags &= ~IFF_SLAVE; 1514 + rtmsg_ifinfo(RTM_NEWLINK, slave_dev, IFF_SLAVE); 1515 + } 1516 + 1494 1517 /* enslave device <slave> to bond device <master> */ 1495 1518 int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) 1496 1519 { ··· 1674 1655 } 1675 1656 } 1676 1657 1677 - res = netdev_set_bond_master(slave_dev, bond_dev); 1658 + res = bond_master_upper_dev_link(bond_dev, slave_dev); 1678 1659 if (res) { 1679 - pr_debug("Error %d calling netdev_set_bond_master\n", res); 1660 + pr_debug("Error %d calling bond_master_upper_dev_link\n", res); 1680 1661 goto err_restore_mac; 1681 1662 } 1682 1663 ··· 1910 1891 dev_close(slave_dev); 1911 1892 1912 1893 err_unset_master: 1913 - netdev_set_bond_master(slave_dev, NULL); 1894 + bond_upper_dev_unlink(bond_dev, slave_dev); 1914 1895 1915 1896 err_restore_mac: 1916 1897 if (!bond->params.fail_over_mac) { ··· 1955 1936 1956 1937 /* slave is not a slave or master is not master of this slave */ 1957 1938 if (!(slave_dev->flags & IFF_SLAVE) || 1958 - (slave_dev->master != bond_dev)) { 1939 + !netdev_has_upper_dev(slave_dev, bond_dev)) { 1959 1940 pr_err("%s: Error: cannot release %s.\n", 1960 1941 bond_dev->name, slave_dev->name); 1961 1942 return -EINVAL; ··· 2099 2080 netif_addr_unlock_bh(bond_dev); 2100 2081 } 2101 2082 2102 - netdev_set_bond_master(slave_dev, NULL); 2083 + bond_upper_dev_unlink(bond_dev, slave_dev); 2103 2084 2104 2085 slave_disable_netpoll(slave); 2105 2086 ··· 2214 2195 netif_addr_unlock_bh(bond_dev); 2215 2196 } 2216 2197 2217 - netdev_set_bond_master(slave_dev, NULL); 2198 + bond_upper_dev_unlink(bond_dev, slave_dev); 2218 2199 2219 2200 slave_disable_netpoll(slave); 2220 2201 ··· 2278 2259 if (!USES_PRIMARY(bond->params.mode)) 2279 2260 return -EINVAL; 2280 2261 2281 - /* Verify that master_dev is indeed the master of slave_dev */ 2282 - if (!(slave_dev->flags & IFF_SLAVE) || (slave_dev->master != bond_dev)) 2262 + /* Verify that bond_dev is indeed the master of slave_dev */ 2263 + if (!(slave_dev->flags & IFF_SLAVE) || 2264 + !netdev_has_upper_dev(slave_dev, bond_dev)) 2283 2265 return -EINVAL; 2284 2266 2285 2267 read_lock(&bond->lock); ··· 3278 3258 static int bond_slave_netdev_event(unsigned long event, 3279 3259 struct net_device *slave_dev) 3280 3260 { 3281 - struct net_device *bond_dev = slave_dev->master; 3282 - struct bonding *bond = netdev_priv(bond_dev); 3283 - struct slave *slave = NULL; 3261 + struct slave *slave = bond_slave_get_rtnl(slave_dev); 3262 + struct bonding *bond = slave->bond; 3263 + struct net_device *bond_dev = slave->bond->dev; 3264 + u32 old_speed; 3265 + u8 old_duplex; 3284 3266 3285 3267 switch (event) { 3286 3268 case NETDEV_UNREGISTER: 3287 - if (bond_dev) { 3288 - if (bond->setup_by_slave) 3289 - bond_release_and_destroy(bond_dev, slave_dev); 3290 - else 3291 - bond_release(bond_dev, slave_dev); 3292 - } 3269 + if (bond->setup_by_slave) 3270 + bond_release_and_destroy(bond_dev, slave_dev); 3271 + else 3272 + bond_release(bond_dev, slave_dev); 3293 3273 break; 3294 3274 case NETDEV_UP: 3295 3275 case NETDEV_CHANGE: 3296 - slave = bond_get_slave_by_dev(bond, slave_dev); 3297 - if (slave) { 3298 - u32 old_speed = slave->speed; 3299 - u8 old_duplex = slave->duplex; 3276 + old_speed = slave->speed; 3277 + old_duplex = slave->duplex; 3300 3278 3301 - bond_update_speed_duplex(slave); 3279 + bond_update_speed_duplex(slave); 3302 3280 3303 - if (bond->params.mode == BOND_MODE_8023AD) { 3304 - if (old_speed != slave->speed) 3305 - bond_3ad_adapter_speed_changed(slave); 3306 - if (old_duplex != slave->duplex) 3307 - bond_3ad_adapter_duplex_changed(slave); 3308 - } 3281 + if (bond->params.mode == BOND_MODE_8023AD) { 3282 + if (old_speed != slave->speed) 3283 + bond_3ad_adapter_speed_changed(slave); 3284 + if (old_duplex != slave->duplex) 3285 + bond_3ad_adapter_duplex_changed(slave); 3309 3286 } 3310 - 3311 3287 break; 3312 3288 case NETDEV_DOWN: 3313 3289 /*
+7 -7
drivers/net/bonding/bonding.h
··· 258 258 #define bond_slave_get_rcu(dev) \ 259 259 ((struct slave *) rcu_dereference(dev->rx_handler_data)) 260 260 261 + #define bond_slave_get_rtnl(dev) \ 262 + ((struct slave *) rtnl_dereference(dev->rx_handler_data)) 263 + 261 264 /** 262 265 * Returns NULL if the net_device does not belong to any of the bond's slaves 263 266 * ··· 283 280 284 281 static inline struct bonding *bond_get_bond_by_slave(struct slave *slave) 285 282 { 286 - if (!slave || !slave->dev->master) { 283 + if (!slave || !slave->bond) 287 284 return NULL; 288 - } 289 - 290 - return netdev_priv(slave->dev->master); 285 + return slave->bond; 291 286 } 292 287 293 288 static inline bool bond_is_lb(const struct bonding *bond) ··· 361 360 362 361 static inline void bond_set_slave_inactive_flags(struct slave *slave) 363 362 { 364 - struct bonding *bond = netdev_priv(slave->dev->master); 365 - if (!bond_is_lb(bond)) 363 + if (!bond_is_lb(slave->bond)) 366 364 bond_set_backup_slave(slave); 367 - if (!bond->params.all_slaves_active) 365 + if (!slave->bond->params.all_slaves_active) 368 366 slave->inactive = 1; 369 367 } 370 368
+1
net/core/rtnetlink.c
··· 1987 1987 if (err < 0) 1988 1988 rtnl_set_sk_err(net, RTNLGRP_LINK, err); 1989 1989 } 1990 + EXPORT_SYMBOL(rtmsg_ifinfo); 1990 1991 1991 1992 static int nlmsg_populate_fdb_fill(struct sk_buff *skb, 1992 1993 struct net_device *dev,