diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/bonding/bond_3ad.c | 6 | ||||
-rw-r--r-- | drivers/net/bonding/bond_3ad.h | 2 | ||||
-rw-r--r-- | drivers/net/bonding/bond_alb.c | 6 | ||||
-rw-r--r-- | drivers/net/bonding/bond_alb.h | 2 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 147 | ||||
-rw-r--r-- | drivers/net/bonding/bond_sysfs.c | 63 | ||||
-rw-r--r-- | drivers/net/bonding/bonding.h | 13 |
7 files changed, 117 insertions, 122 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c index 084f0292ea6e..cb3c6faa7888 100644 --- a/drivers/net/bonding/bond_3ad.c +++ b/drivers/net/bonding/bond_3ad.c | |||
@@ -2076,8 +2076,10 @@ void bond_3ad_unbind_slave(struct slave *slave) | |||
2076 | * times out, and it selects an aggregator for the ports that are yet not | 2076 | * times out, and it selects an aggregator for the ports that are yet not |
2077 | * related to any aggregator, and selects the active aggregator for a bond. | 2077 | * related to any aggregator, and selects the active aggregator for a bond. |
2078 | */ | 2078 | */ |
2079 | void bond_3ad_state_machine_handler(struct bonding *bond) | 2079 | void bond_3ad_state_machine_handler(struct work_struct *work) |
2080 | { | 2080 | { |
2081 | struct bonding *bond = container_of(work, struct bonding, | ||
2082 | ad_work.work); | ||
2081 | struct port *port; | 2083 | struct port *port; |
2082 | struct aggregator *aggregator; | 2084 | struct aggregator *aggregator; |
2083 | 2085 | ||
@@ -2128,7 +2130,7 @@ void bond_3ad_state_machine_handler(struct bonding *bond) | |||
2128 | } | 2130 | } |
2129 | 2131 | ||
2130 | re_arm: | 2132 | re_arm: |
2131 | mod_timer(&(BOND_AD_INFO(bond).ad_timer), jiffies + ad_delta_in_ticks); | 2133 | queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); |
2132 | out: | 2134 | out: |
2133 | read_unlock(&bond->lock); | 2135 | read_unlock(&bond->lock); |
2134 | } | 2136 | } |
diff --git a/drivers/net/bonding/bond_3ad.h b/drivers/net/bonding/bond_3ad.h index f16557264944..b5ee45f6d55a 100644 --- a/drivers/net/bonding/bond_3ad.h +++ b/drivers/net/bonding/bond_3ad.h | |||
@@ -276,7 +276,7 @@ struct ad_slave_info { | |||
276 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); | 276 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast); |
277 | int bond_3ad_bind_slave(struct slave *slave); | 277 | int bond_3ad_bind_slave(struct slave *slave); |
278 | void bond_3ad_unbind_slave(struct slave *slave); | 278 | void bond_3ad_unbind_slave(struct slave *slave); |
279 | void bond_3ad_state_machine_handler(struct bonding *bond); | 279 | void bond_3ad_state_machine_handler(struct work_struct *); |
280 | void bond_3ad_adapter_speed_changed(struct slave *slave); | 280 | void bond_3ad_adapter_speed_changed(struct slave *slave); |
281 | void bond_3ad_adapter_duplex_changed(struct slave *slave); | 281 | void bond_3ad_adapter_duplex_changed(struct slave *slave); |
282 | void bond_3ad_handle_link_change(struct slave *slave, char link); | 282 | void bond_3ad_handle_link_change(struct slave *slave, char link); |
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index aea2217c56eb..eb320c3cbdde 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -1375,8 +1375,10 @@ out: | |||
1375 | return 0; | 1375 | return 0; |
1376 | } | 1376 | } |
1377 | 1377 | ||
1378 | void bond_alb_monitor(struct bonding *bond) | 1378 | void bond_alb_monitor(struct work_struct *work) |
1379 | { | 1379 | { |
1380 | struct bonding *bond = container_of(work, struct bonding, | ||
1381 | alb_work.work); | ||
1380 | struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); | 1382 | struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); |
1381 | struct slave *slave; | 1383 | struct slave *slave; |
1382 | int i; | 1384 | int i; |
@@ -1479,7 +1481,7 @@ void bond_alb_monitor(struct bonding *bond) | |||
1479 | } | 1481 | } |
1480 | 1482 | ||
1481 | re_arm: | 1483 | re_arm: |
1482 | mod_timer(&(bond_info->alb_timer), jiffies + alb_delta_in_ticks); | 1484 | queue_delayed_work(bond->wq, &bond->alb_work, alb_delta_in_ticks); |
1483 | out: | 1485 | out: |
1484 | read_unlock(&bond->lock); | 1486 | read_unlock(&bond->lock); |
1485 | } | 1487 | } |
diff --git a/drivers/net/bonding/bond_alb.h b/drivers/net/bonding/bond_alb.h index fd8726429890..50968f8196cf 100644 --- a/drivers/net/bonding/bond_alb.h +++ b/drivers/net/bonding/bond_alb.h | |||
@@ -125,7 +125,7 @@ void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave); | |||
125 | void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); | 125 | void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char link); |
126 | void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); | 126 | void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave); |
127 | int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); | 127 | int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev); |
128 | void bond_alb_monitor(struct bonding *bond); | 128 | void bond_alb_monitor(struct work_struct *); |
129 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); | 129 | int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr); |
130 | void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id); | 130 | void bond_alb_clear_vlan(struct bonding *bond, unsigned short vlan_id); |
131 | #endif /* __BOND_ALB_H__ */ | 131 | #endif /* __BOND_ALB_H__ */ |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 6f85cc31f8a2..ed361d62d702 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -2089,9 +2089,10 @@ static int bond_slave_info_query(struct net_device *bond_dev, struct ifslave *in | |||
2089 | /*-------------------------------- Monitoring -------------------------------*/ | 2089 | /*-------------------------------- Monitoring -------------------------------*/ |
2090 | 2090 | ||
2091 | /* this function is called regularly to monitor each slave's link. */ | 2091 | /* this function is called regularly to monitor each slave's link. */ |
2092 | void bond_mii_monitor(struct net_device *bond_dev) | 2092 | void bond_mii_monitor(struct work_struct *work) |
2093 | { | 2093 | { |
2094 | struct bonding *bond = bond_dev->priv; | 2094 | struct bonding *bond = container_of(work, struct bonding, |
2095 | mii_work.work); | ||
2095 | struct slave *slave, *oldcurrent; | 2096 | struct slave *slave, *oldcurrent; |
2096 | int do_failover = 0; | 2097 | int do_failover = 0; |
2097 | int delta_in_ticks; | 2098 | int delta_in_ticks; |
@@ -2156,7 +2157,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2156 | ": %s: link status down for %s " | 2157 | ": %s: link status down for %s " |
2157 | "interface %s, disabling it in " | 2158 | "interface %s, disabling it in " |
2158 | "%d ms.\n", | 2159 | "%d ms.\n", |
2159 | bond_dev->name, | 2160 | bond->dev->name, |
2160 | IS_UP(slave_dev) | 2161 | IS_UP(slave_dev) |
2161 | ? ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) | 2162 | ? ((bond->params.mode == BOND_MODE_ACTIVEBACKUP) |
2162 | ? ((slave == oldcurrent) | 2163 | ? ((slave == oldcurrent) |
@@ -2189,7 +2190,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2189 | ": %s: link status definitely " | 2190 | ": %s: link status definitely " |
2190 | "down for interface %s, " | 2191 | "down for interface %s, " |
2191 | "disabling it\n", | 2192 | "disabling it\n", |
2192 | bond_dev->name, | 2193 | bond->dev->name, |
2193 | slave_dev->name); | 2194 | slave_dev->name); |
2194 | 2195 | ||
2195 | /* notify ad that the link status has changed */ | 2196 | /* notify ad that the link status has changed */ |
@@ -2215,7 +2216,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2215 | printk(KERN_INFO DRV_NAME | 2216 | printk(KERN_INFO DRV_NAME |
2216 | ": %s: link status up again after %d " | 2217 | ": %s: link status up again after %d " |
2217 | "ms for interface %s.\n", | 2218 | "ms for interface %s.\n", |
2218 | bond_dev->name, | 2219 | bond->dev->name, |
2219 | (bond->params.downdelay - slave->delay) * bond->params.miimon, | 2220 | (bond->params.downdelay - slave->delay) * bond->params.miimon, |
2220 | slave_dev->name); | 2221 | slave_dev->name); |
2221 | } | 2222 | } |
@@ -2235,7 +2236,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2235 | ": %s: link status up for " | 2236 | ": %s: link status up for " |
2236 | "interface %s, enabling it " | 2237 | "interface %s, enabling it " |
2237 | "in %d ms.\n", | 2238 | "in %d ms.\n", |
2238 | bond_dev->name, | 2239 | bond->dev->name, |
2239 | slave_dev->name, | 2240 | slave_dev->name, |
2240 | bond->params.updelay * bond->params.miimon); | 2241 | bond->params.updelay * bond->params.miimon); |
2241 | } | 2242 | } |
@@ -2251,7 +2252,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2251 | printk(KERN_INFO DRV_NAME | 2252 | printk(KERN_INFO DRV_NAME |
2252 | ": %s: link status down again after %d " | 2253 | ": %s: link status down again after %d " |
2253 | "ms for interface %s.\n", | 2254 | "ms for interface %s.\n", |
2254 | bond_dev->name, | 2255 | bond->dev->name, |
2255 | (bond->params.updelay - slave->delay) * bond->params.miimon, | 2256 | (bond->params.updelay - slave->delay) * bond->params.miimon, |
2256 | slave_dev->name); | 2257 | slave_dev->name); |
2257 | } else { | 2258 | } else { |
@@ -2275,7 +2276,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2275 | printk(KERN_INFO DRV_NAME | 2276 | printk(KERN_INFO DRV_NAME |
2276 | ": %s: link status definitely " | 2277 | ": %s: link status definitely " |
2277 | "up for interface %s.\n", | 2278 | "up for interface %s.\n", |
2278 | bond_dev->name, | 2279 | bond->dev->name, |
2279 | slave_dev->name); | 2280 | slave_dev->name); |
2280 | 2281 | ||
2281 | /* notify ad that the link status has changed */ | 2282 | /* notify ad that the link status has changed */ |
@@ -2301,7 +2302,7 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2301 | /* Should not happen */ | 2302 | /* Should not happen */ |
2302 | printk(KERN_ERR DRV_NAME | 2303 | printk(KERN_ERR DRV_NAME |
2303 | ": %s: Error: %s Illegal value (link=%d)\n", | 2304 | ": %s: Error: %s Illegal value (link=%d)\n", |
2304 | bond_dev->name, | 2305 | bond->dev->name, |
2305 | slave->dev->name, | 2306 | slave->dev->name, |
2306 | slave->link); | 2307 | slave->link); |
2307 | goto out; | 2308 | goto out; |
@@ -2331,9 +2332,8 @@ void bond_mii_monitor(struct net_device *bond_dev) | |||
2331 | bond_set_carrier(bond); | 2332 | bond_set_carrier(bond); |
2332 | 2333 | ||
2333 | re_arm: | 2334 | re_arm: |
2334 | if (bond->params.miimon) { | 2335 | if (bond->params.miimon) |
2335 | mod_timer(&bond->mii_timer, jiffies + delta_in_ticks); | 2336 | queue_delayed_work(bond->wq, &bond->mii_work, delta_in_ticks); |
2336 | } | ||
2337 | out: | 2337 | out: |
2338 | read_unlock(&bond->lock); | 2338 | read_unlock(&bond->lock); |
2339 | } | 2339 | } |
@@ -2636,9 +2636,10 @@ out: | |||
2636 | * arp is transmitted to generate traffic. see activebackup_arp_monitor for | 2636 | * arp is transmitted to generate traffic. see activebackup_arp_monitor for |
2637 | * arp monitoring in active backup mode. | 2637 | * arp monitoring in active backup mode. |
2638 | */ | 2638 | */ |
2639 | void bond_loadbalance_arp_mon(struct net_device *bond_dev) | 2639 | void bond_loadbalance_arp_mon(struct work_struct *work) |
2640 | { | 2640 | { |
2641 | struct bonding *bond = bond_dev->priv; | 2641 | struct bonding *bond = container_of(work, struct bonding, |
2642 | arp_work.work); | ||
2642 | struct slave *slave, *oldcurrent; | 2643 | struct slave *slave, *oldcurrent; |
2643 | int do_failover = 0; | 2644 | int do_failover = 0; |
2644 | int delta_in_ticks; | 2645 | int delta_in_ticks; |
@@ -2685,13 +2686,13 @@ void bond_loadbalance_arp_mon(struct net_device *bond_dev) | |||
2685 | printk(KERN_INFO DRV_NAME | 2686 | printk(KERN_INFO DRV_NAME |
2686 | ": %s: link status definitely " | 2687 | ": %s: link status definitely " |
2687 | "up for interface %s, ", | 2688 | "up for interface %s, ", |
2688 | bond_dev->name, | 2689 | bond->dev->name, |
2689 | slave->dev->name); | 2690 | slave->dev->name); |
2690 | do_failover = 1; | 2691 | do_failover = 1; |
2691 | } else { | 2692 | } else { |
2692 | printk(KERN_INFO DRV_NAME | 2693 | printk(KERN_INFO DRV_NAME |
2693 | ": %s: interface %s is now up\n", | 2694 | ": %s: interface %s is now up\n", |
2694 | bond_dev->name, | 2695 | bond->dev->name, |
2695 | slave->dev->name); | 2696 | slave->dev->name); |
2696 | } | 2697 | } |
2697 | } | 2698 | } |
@@ -2715,7 +2716,7 @@ void bond_loadbalance_arp_mon(struct net_device *bond_dev) | |||
2715 | 2716 | ||
2716 | printk(KERN_INFO DRV_NAME | 2717 | printk(KERN_INFO DRV_NAME |
2717 | ": %s: interface %s is now down.\n", | 2718 | ": %s: interface %s is now down.\n", |
2718 | bond_dev->name, | 2719 | bond->dev->name, |
2719 | slave->dev->name); | 2720 | slave->dev->name); |
2720 | 2721 | ||
2721 | if (slave == oldcurrent) { | 2722 | if (slave == oldcurrent) { |
@@ -2745,9 +2746,8 @@ void bond_loadbalance_arp_mon(struct net_device *bond_dev) | |||
2745 | } | 2746 | } |
2746 | 2747 | ||
2747 | re_arm: | 2748 | re_arm: |
2748 | if (bond->params.arp_interval) { | 2749 | if (bond->params.arp_interval) |
2749 | mod_timer(&bond->arp_timer, jiffies + delta_in_ticks); | 2750 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); |
2750 | } | ||
2751 | out: | 2751 | out: |
2752 | read_unlock(&bond->lock); | 2752 | read_unlock(&bond->lock); |
2753 | } | 2753 | } |
@@ -2767,9 +2767,10 @@ out: | |||
2767 | * may have received. | 2767 | * may have received. |
2768 | * see loadbalance_arp_monitor for arp monitoring in load balancing mode | 2768 | * see loadbalance_arp_monitor for arp monitoring in load balancing mode |
2769 | */ | 2769 | */ |
2770 | void bond_activebackup_arp_mon(struct net_device *bond_dev) | 2770 | void bond_activebackup_arp_mon(struct work_struct *work) |
2771 | { | 2771 | { |
2772 | struct bonding *bond = bond_dev->priv; | 2772 | struct bonding *bond = container_of(work, struct bonding, |
2773 | arp_work.work); | ||
2773 | struct slave *slave; | 2774 | struct slave *slave; |
2774 | int delta_in_ticks; | 2775 | int delta_in_ticks; |
2775 | int i; | 2776 | int i; |
@@ -2821,14 +2822,14 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2821 | printk(KERN_INFO DRV_NAME | 2822 | printk(KERN_INFO DRV_NAME |
2822 | ": %s: %s is up and now the " | 2823 | ": %s: %s is up and now the " |
2823 | "active interface\n", | 2824 | "active interface\n", |
2824 | bond_dev->name, | 2825 | bond->dev->name, |
2825 | slave->dev->name); | 2826 | slave->dev->name); |
2826 | netif_carrier_on(bond->dev); | 2827 | netif_carrier_on(bond->dev); |
2827 | } else { | 2828 | } else { |
2828 | printk(KERN_INFO DRV_NAME | 2829 | printk(KERN_INFO DRV_NAME |
2829 | ": %s: backup interface %s is " | 2830 | ": %s: backup interface %s is " |
2830 | "now up\n", | 2831 | "now up\n", |
2831 | bond_dev->name, | 2832 | bond->dev->name, |
2832 | slave->dev->name); | 2833 | slave->dev->name); |
2833 | } | 2834 | } |
2834 | 2835 | ||
@@ -2864,7 +2865,7 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2864 | 2865 | ||
2865 | printk(KERN_INFO DRV_NAME | 2866 | printk(KERN_INFO DRV_NAME |
2866 | ": %s: backup interface %s is now down\n", | 2867 | ": %s: backup interface %s is now down\n", |
2867 | bond_dev->name, | 2868 | bond->dev->name, |
2868 | slave->dev->name); | 2869 | slave->dev->name); |
2869 | } else { | 2870 | } else { |
2870 | read_unlock(&bond->curr_slave_lock); | 2871 | read_unlock(&bond->curr_slave_lock); |
@@ -2899,7 +2900,7 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2899 | printk(KERN_INFO DRV_NAME | 2900 | printk(KERN_INFO DRV_NAME |
2900 | ": %s: link status down for active interface " | 2901 | ": %s: link status down for active interface " |
2901 | "%s, disabling it\n", | 2902 | "%s, disabling it\n", |
2902 | bond_dev->name, | 2903 | bond->dev->name, |
2903 | slave->dev->name); | 2904 | slave->dev->name); |
2904 | 2905 | ||
2905 | write_lock(&bond->curr_slave_lock); | 2906 | write_lock(&bond->curr_slave_lock); |
@@ -2921,7 +2922,7 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2921 | printk(KERN_INFO DRV_NAME | 2922 | printk(KERN_INFO DRV_NAME |
2922 | ": %s: changing from interface %s to primary " | 2923 | ": %s: changing from interface %s to primary " |
2923 | "interface %s\n", | 2924 | "interface %s\n", |
2924 | bond_dev->name, | 2925 | bond->dev->name, |
2925 | slave->dev->name, | 2926 | slave->dev->name, |
2926 | bond->primary_slave->dev->name); | 2927 | bond->primary_slave->dev->name); |
2927 | 2928 | ||
@@ -2985,7 +2986,7 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2985 | printk(KERN_INFO DRV_NAME | 2986 | printk(KERN_INFO DRV_NAME |
2986 | ": %s: backup interface %s is " | 2987 | ": %s: backup interface %s is " |
2987 | "now down.\n", | 2988 | "now down.\n", |
2988 | bond_dev->name, | 2989 | bond->dev->name, |
2989 | slave->dev->name); | 2990 | slave->dev->name); |
2990 | } | 2991 | } |
2991 | } | 2992 | } |
@@ -2994,7 +2995,7 @@ void bond_activebackup_arp_mon(struct net_device *bond_dev) | |||
2994 | 2995 | ||
2995 | re_arm: | 2996 | re_arm: |
2996 | if (bond->params.arp_interval) { | 2997 | if (bond->params.arp_interval) { |
2997 | mod_timer(&bond->arp_timer, jiffies + delta_in_ticks); | 2998 | queue_delayed_work(bond->wq, &bond->arp_work, delta_in_ticks); |
2998 | } | 2999 | } |
2999 | out: | 3000 | out: |
3000 | read_unlock(&bond->lock); | 3001 | read_unlock(&bond->lock); |
@@ -3582,15 +3583,11 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, | |||
3582 | static int bond_open(struct net_device *bond_dev) | 3583 | static int bond_open(struct net_device *bond_dev) |
3583 | { | 3584 | { |
3584 | struct bonding *bond = bond_dev->priv; | 3585 | struct bonding *bond = bond_dev->priv; |
3585 | struct timer_list *mii_timer = &bond->mii_timer; | ||
3586 | struct timer_list *arp_timer = &bond->arp_timer; | ||
3587 | 3586 | ||
3588 | bond->kill_timers = 0; | 3587 | bond->kill_timers = 0; |
3589 | 3588 | ||
3590 | if ((bond->params.mode == BOND_MODE_TLB) || | 3589 | if ((bond->params.mode == BOND_MODE_TLB) || |
3591 | (bond->params.mode == BOND_MODE_ALB)) { | 3590 | (bond->params.mode == BOND_MODE_ALB)) { |
3592 | struct timer_list *alb_timer = &(BOND_ALB_INFO(bond).alb_timer); | ||
3593 | |||
3594 | /* bond_alb_initialize must be called before the timer | 3591 | /* bond_alb_initialize must be called before the timer |
3595 | * is started. | 3592 | * is started. |
3596 | */ | 3593 | */ |
@@ -3599,44 +3596,31 @@ static int bond_open(struct net_device *bond_dev) | |||
3599 | return -1; | 3596 | return -1; |
3600 | } | 3597 | } |
3601 | 3598 | ||
3602 | init_timer(alb_timer); | 3599 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); |
3603 | alb_timer->expires = jiffies + 1; | 3600 | queue_delayed_work(bond->wq, &bond->alb_work, 0); |
3604 | alb_timer->data = (unsigned long)bond; | ||
3605 | alb_timer->function = (void *)&bond_alb_monitor; | ||
3606 | add_timer(alb_timer); | ||
3607 | } | 3601 | } |
3608 | 3602 | ||
3609 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ | 3603 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ |
3610 | init_timer(mii_timer); | 3604 | INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor); |
3611 | mii_timer->expires = jiffies + 1; | 3605 | queue_delayed_work(bond->wq, &bond->mii_work, 0); |
3612 | mii_timer->data = (unsigned long)bond_dev; | ||
3613 | mii_timer->function = (void *)&bond_mii_monitor; | ||
3614 | add_timer(mii_timer); | ||
3615 | } | 3606 | } |
3616 | 3607 | ||
3617 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ | 3608 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ |
3618 | init_timer(arp_timer); | 3609 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) |
3619 | arp_timer->expires = jiffies + 1; | 3610 | INIT_DELAYED_WORK(&bond->arp_work, |
3620 | arp_timer->data = (unsigned long)bond_dev; | 3611 | bond_activebackup_arp_mon); |
3621 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) { | 3612 | else |
3622 | arp_timer->function = (void *)&bond_activebackup_arp_mon; | 3613 | INIT_DELAYED_WORK(&bond->arp_work, |
3623 | } else { | 3614 | bond_loadbalance_arp_mon); |
3624 | arp_timer->function = (void *)&bond_loadbalance_arp_mon; | 3615 | |
3625 | } | 3616 | queue_delayed_work(bond->wq, &bond->arp_work, 0); |
3626 | if (bond->params.arp_validate) | 3617 | if (bond->params.arp_validate) |
3627 | bond_register_arp(bond); | 3618 | bond_register_arp(bond); |
3628 | |||
3629 | add_timer(arp_timer); | ||
3630 | } | 3619 | } |
3631 | 3620 | ||
3632 | if (bond->params.mode == BOND_MODE_8023AD) { | 3621 | if (bond->params.mode == BOND_MODE_8023AD) { |
3633 | struct timer_list *ad_timer = &(BOND_AD_INFO(bond).ad_timer); | 3622 | INIT_DELAYED_WORK(&bond->ad_work, bond_alb_monitor); |
3634 | init_timer(ad_timer); | 3623 | queue_delayed_work(bond->wq, &bond->ad_work, 0); |
3635 | ad_timer->expires = jiffies + 1; | ||
3636 | ad_timer->data = (unsigned long)bond; | ||
3637 | ad_timer->function = (void *)&bond_3ad_state_machine_handler; | ||
3638 | add_timer(ad_timer); | ||
3639 | |||
3640 | /* register to receive LACPDUs */ | 3624 | /* register to receive LACPDUs */ |
3641 | bond_register_lacpdu(bond); | 3625 | bond_register_lacpdu(bond); |
3642 | } | 3626 | } |
@@ -3664,25 +3648,21 @@ static int bond_close(struct net_device *bond_dev) | |||
3664 | 3648 | ||
3665 | write_unlock_bh(&bond->lock); | 3649 | write_unlock_bh(&bond->lock); |
3666 | 3650 | ||
3667 | /* del_timer_sync must run without holding the bond->lock | ||
3668 | * because a running timer might be trying to hold it too | ||
3669 | */ | ||
3670 | |||
3671 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ | 3651 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ |
3672 | del_timer_sync(&bond->mii_timer); | 3652 | cancel_delayed_work(&bond->mii_work); |
3673 | } | 3653 | } |
3674 | 3654 | ||
3675 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ | 3655 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ |
3676 | del_timer_sync(&bond->arp_timer); | 3656 | cancel_delayed_work(&bond->arp_work); |
3677 | } | 3657 | } |
3678 | 3658 | ||
3679 | switch (bond->params.mode) { | 3659 | switch (bond->params.mode) { |
3680 | case BOND_MODE_8023AD: | 3660 | case BOND_MODE_8023AD: |
3681 | del_timer_sync(&(BOND_AD_INFO(bond).ad_timer)); | 3661 | cancel_delayed_work(&bond->ad_work); |
3682 | break; | 3662 | break; |
3683 | case BOND_MODE_TLB: | 3663 | case BOND_MODE_TLB: |
3684 | case BOND_MODE_ALB: | 3664 | case BOND_MODE_ALB: |
3685 | del_timer_sync(&(BOND_ALB_INFO(bond).alb_timer)); | 3665 | cancel_delayed_work(&bond->alb_work); |
3686 | break; | 3666 | break; |
3687 | default: | 3667 | default: |
3688 | break; | 3668 | break; |
@@ -4340,6 +4320,10 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) | |||
4340 | 4320 | ||
4341 | bond->params = *params; /* copy params struct */ | 4321 | bond->params = *params; /* copy params struct */ |
4342 | 4322 | ||
4323 | bond->wq = create_singlethread_workqueue(bond_dev->name); | ||
4324 | if (!bond->wq) | ||
4325 | return -ENOMEM; | ||
4326 | |||
4343 | /* Initialize pointers */ | 4327 | /* Initialize pointers */ |
4344 | bond->first_slave = NULL; | 4328 | bond->first_slave = NULL; |
4345 | bond->curr_active_slave = NULL; | 4329 | bond->curr_active_slave = NULL; |
@@ -4826,10 +4810,32 @@ out_rtnl: | |||
4826 | return res; | 4810 | return res; |
4827 | } | 4811 | } |
4828 | 4812 | ||
4813 | static void bond_work_cancel_all(struct bonding *bond) | ||
4814 | { | ||
4815 | write_lock_bh(&bond->lock); | ||
4816 | bond->kill_timers = 1; | ||
4817 | write_unlock_bh(&bond->lock); | ||
4818 | |||
4819 | if (bond->params.miimon && delayed_work_pending(&bond->mii_work)) | ||
4820 | cancel_delayed_work(&bond->mii_work); | ||
4821 | |||
4822 | if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work)) | ||
4823 | cancel_delayed_work(&bond->arp_work); | ||
4824 | |||
4825 | if (bond->params.mode == BOND_MODE_ALB && | ||
4826 | delayed_work_pending(&bond->alb_work)) | ||
4827 | cancel_delayed_work(&bond->alb_work); | ||
4828 | |||
4829 | if (bond->params.mode == BOND_MODE_8023AD && | ||
4830 | delayed_work_pending(&bond->ad_work)) | ||
4831 | cancel_delayed_work(&bond->ad_work); | ||
4832 | } | ||
4833 | |||
4829 | static int __init bonding_init(void) | 4834 | static int __init bonding_init(void) |
4830 | { | 4835 | { |
4831 | int i; | 4836 | int i; |
4832 | int res; | 4837 | int res; |
4838 | struct bonding *bond, *nxt; | ||
4833 | 4839 | ||
4834 | printk(KERN_INFO "%s", version); | 4840 | printk(KERN_INFO "%s", version); |
4835 | 4841 | ||
@@ -4856,6 +4862,11 @@ static int __init bonding_init(void) | |||
4856 | 4862 | ||
4857 | goto out; | 4863 | goto out; |
4858 | err: | 4864 | err: |
4865 | list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list) { | ||
4866 | bond_work_cancel_all(bond); | ||
4867 | destroy_workqueue(bond->wq); | ||
4868 | } | ||
4869 | |||
4859 | rtnl_lock(); | 4870 | rtnl_lock(); |
4860 | bond_free_all(); | 4871 | bond_free_all(); |
4861 | bond_destroy_sysfs(); | 4872 | bond_destroy_sysfs(); |
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 855dc10ffa1b..19d970e0cbb8 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -662,12 +662,9 @@ static ssize_t bonding_store_arp_interval(struct device *d, | |||
662 | "%s Disabling MII monitoring.\n", | 662 | "%s Disabling MII monitoring.\n", |
663 | bond->dev->name, bond->dev->name); | 663 | bond->dev->name, bond->dev->name); |
664 | bond->params.miimon = 0; | 664 | bond->params.miimon = 0; |
665 | /* Kill MII timer, else it brings bond's link down */ | 665 | if (delayed_work_pending(&bond->mii_work)) { |
666 | if (bond->arp_timer.function) { | 666 | cancel_delayed_work(&bond->mii_work); |
667 | printk(KERN_INFO DRV_NAME | 667 | flush_workqueue(bond->wq); |
668 | ": %s: Kill MII timer, else it brings bond's link down...\n", | ||
669 | bond->dev->name); | ||
670 | del_timer_sync(&bond->mii_timer); | ||
671 | } | 668 | } |
672 | } | 669 | } |
673 | if (!bond->params.arp_targets[0]) { | 670 | if (!bond->params.arp_targets[0]) { |
@@ -682,25 +679,15 @@ static ssize_t bonding_store_arp_interval(struct device *d, | |||
682 | * timer will get fired off when the open function | 679 | * timer will get fired off when the open function |
683 | * is called. | 680 | * is called. |
684 | */ | 681 | */ |
685 | if (bond->arp_timer.function) { | 682 | if (!delayed_work_pending(&bond->arp_work)) { |
686 | /* The timer's already set up, so fire it off */ | 683 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) |
687 | mod_timer(&bond->arp_timer, jiffies + 1); | 684 | INIT_DELAYED_WORK(&bond->arp_work, |
688 | } else { | 685 | bond_activebackup_arp_mon); |
689 | /* Set up the timer. */ | 686 | else |
690 | init_timer(&bond->arp_timer); | 687 | INIT_DELAYED_WORK(&bond->arp_work, |
691 | bond->arp_timer.expires = jiffies + 1; | 688 | bond_loadbalance_arp_mon); |
692 | bond->arp_timer.data = | 689 | |
693 | (unsigned long) bond->dev; | 690 | queue_delayed_work(bond->wq, &bond->arp_work, 0); |
694 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) { | ||
695 | bond->arp_timer.function = | ||
696 | (void *) | ||
697 | &bond_activebackup_arp_mon; | ||
698 | } else { | ||
699 | bond->arp_timer.function = | ||
700 | (void *) | ||
701 | &bond_loadbalance_arp_mon; | ||
702 | } | ||
703 | add_timer(&bond->arp_timer); | ||
704 | } | 691 | } |
705 | } | 692 | } |
706 | 693 | ||
@@ -1056,12 +1043,9 @@ static ssize_t bonding_store_miimon(struct device *d, | |||
1056 | bond->params.arp_validate = | 1043 | bond->params.arp_validate = |
1057 | BOND_ARP_VALIDATE_NONE; | 1044 | BOND_ARP_VALIDATE_NONE; |
1058 | } | 1045 | } |
1059 | /* Kill ARP timer, else it brings bond's link down */ | 1046 | if (delayed_work_pending(&bond->arp_work)) { |
1060 | if (bond->mii_timer.function) { | 1047 | cancel_delayed_work(&bond->arp_work); |
1061 | printk(KERN_INFO DRV_NAME | 1048 | flush_workqueue(bond->wq); |
1062 | ": %s: Kill ARP timer, else it brings bond's link down...\n", | ||
1063 | bond->dev->name); | ||
1064 | del_timer_sync(&bond->arp_timer); | ||
1065 | } | 1049 | } |
1066 | } | 1050 | } |
1067 | 1051 | ||
@@ -1071,18 +1055,11 @@ static ssize_t bonding_store_miimon(struct device *d, | |||
1071 | * timer will get fired off when the open function | 1055 | * timer will get fired off when the open function |
1072 | * is called. | 1056 | * is called. |
1073 | */ | 1057 | */ |
1074 | if (bond->mii_timer.function) { | 1058 | if (!delayed_work_pending(&bond->mii_work)) { |
1075 | /* The timer's already set up, so fire it off */ | 1059 | INIT_DELAYED_WORK(&bond->mii_work, |
1076 | mod_timer(&bond->mii_timer, jiffies + 1); | 1060 | bond_mii_monitor); |
1077 | } else { | 1061 | queue_delayed_work(bond->wq, |
1078 | /* Set up the timer. */ | 1062 | &bond->mii_work, 0); |
1079 | init_timer(&bond->mii_timer); | ||
1080 | bond->mii_timer.expires = jiffies + 1; | ||
1081 | bond->mii_timer.data = | ||
1082 | (unsigned long) bond->dev; | ||
1083 | bond->mii_timer.function = | ||
1084 | (void *) &bond_mii_monitor; | ||
1085 | add_timer(&bond->mii_timer); | ||
1086 | } | 1063 | } |
1087 | } | 1064 | } |
1088 | } | 1065 | } |
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index b8180600a309..a8f2384f550d 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h | |||
@@ -184,8 +184,6 @@ struct bonding { | |||
184 | s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ | 184 | s32 slave_cnt; /* never change this value outside the attach/detach wrappers */ |
185 | rwlock_t lock; | 185 | rwlock_t lock; |
186 | rwlock_t curr_slave_lock; | 186 | rwlock_t curr_slave_lock; |
187 | struct timer_list mii_timer; | ||
188 | struct timer_list arp_timer; | ||
189 | s8 kill_timers; | 187 | s8 kill_timers; |
190 | s8 send_grat_arp; | 188 | s8 send_grat_arp; |
191 | s8 setup_by_slave; | 189 | s8 setup_by_slave; |
@@ -205,6 +203,11 @@ struct bonding { | |||
205 | struct list_head vlan_list; | 203 | struct list_head vlan_list; |
206 | struct vlan_group *vlgrp; | 204 | struct vlan_group *vlgrp; |
207 | struct packet_type arp_mon_pt; | 205 | struct packet_type arp_mon_pt; |
206 | struct workqueue_struct *wq; | ||
207 | struct delayed_work mii_work; | ||
208 | struct delayed_work arp_work; | ||
209 | struct delayed_work alb_work; | ||
210 | struct delayed_work ad_work; | ||
208 | }; | 211 | }; |
209 | 212 | ||
210 | /** | 213 | /** |
@@ -307,9 +310,9 @@ int bond_create_slave_symlinks(struct net_device *master, struct net_device *sla | |||
307 | void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave); | 310 | void bond_destroy_slave_symlinks(struct net_device *master, struct net_device *slave); |
308 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); | 311 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); |
309 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); | 312 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); |
310 | void bond_mii_monitor(struct net_device *bond_dev); | 313 | void bond_mii_monitor(struct work_struct *); |
311 | void bond_loadbalance_arp_mon(struct net_device *bond_dev); | 314 | void bond_loadbalance_arp_mon(struct work_struct *); |
312 | void bond_activebackup_arp_mon(struct net_device *bond_dev); | 315 | void bond_activebackup_arp_mon(struct work_struct *); |
313 | void bond_set_mode_ops(struct bonding *bond, int mode); | 316 | void bond_set_mode_ops(struct bonding *bond, int mode); |
314 | int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl); | 317 | int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl); |
315 | void bond_select_active_slave(struct bonding *bond); | 318 | void bond_select_active_slave(struct bonding *bond); |