diff options
author | Jan-Bernd Themann <ossthema@de.ibm.com> | 2008-07-03 10:18:45 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-07-04 08:10:06 -0400 |
commit | 5c2cec143ac54c1960e54bc320fa7d13ac8e0f4a (patch) | |
tree | cbb2fa3d146543d116f60611330e97dc62346307 /drivers | |
parent | 97bff0953dd45a633fa69e1a650d612f5610a60b (diff) |
ehea: fix might sleep problem
A mutex has to be replaced by spinlocks as it can be called from
a context which does not allow sleeping.
The kzalloc flag GFP_KERNEL has to be replaced by GFP_ATOMIC
for the same reason.
Signed-off-by: Jan-Bernd Themann <themann@de.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ehea/ehea.h | 2 | ||||
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 22 |
2 files changed, 12 insertions, 12 deletions
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index fe872fbd671..bf57e1532f5 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -452,7 +452,7 @@ struct ehea_bcmc_reg_entry { | |||
452 | struct ehea_bcmc_reg_array { | 452 | struct ehea_bcmc_reg_array { |
453 | struct ehea_bcmc_reg_entry *arr; | 453 | struct ehea_bcmc_reg_entry *arr; |
454 | int num_entries; | 454 | int num_entries; |
455 | struct mutex lock; | 455 | spinlock_t lock; |
456 | }; | 456 | }; |
457 | 457 | ||
458 | #define EHEA_PORT_UP 1 | 458 | #define EHEA_PORT_UP 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 075fd547421..489de9ba5fc 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -241,7 +241,7 @@ static void ehea_update_bcmc_registrations(void) | |||
241 | } | 241 | } |
242 | 242 | ||
243 | if (num_registrations) { | 243 | if (num_registrations) { |
244 | arr = kzalloc(num_registrations * sizeof(*arr), GFP_KERNEL); | 244 | arr = kzalloc(num_registrations * sizeof(*arr), GFP_ATOMIC); |
245 | if (!arr) | 245 | if (!arr) |
246 | return; /* Keep the existing array */ | 246 | return; /* Keep the existing array */ |
247 | } else | 247 | } else |
@@ -301,7 +301,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev) | |||
301 | 301 | ||
302 | memset(stats, 0, sizeof(*stats)); | 302 | memset(stats, 0, sizeof(*stats)); |
303 | 303 | ||
304 | cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL); | 304 | cb2 = kzalloc(PAGE_SIZE, GFP_ATOMIC); |
305 | if (!cb2) { | 305 | if (!cb2) { |
306 | ehea_error("no mem for cb2"); | 306 | ehea_error("no mem for cb2"); |
307 | goto out; | 307 | goto out; |
@@ -1763,7 +1763,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
1763 | 1763 | ||
1764 | memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len); | 1764 | memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len); |
1765 | 1765 | ||
1766 | mutex_lock(&ehea_bcmc_regs.lock); | 1766 | spin_lock(&ehea_bcmc_regs.lock); |
1767 | 1767 | ||
1768 | /* Deregister old MAC in pHYP */ | 1768 | /* Deregister old MAC in pHYP */ |
1769 | if (port->state == EHEA_PORT_UP) { | 1769 | if (port->state == EHEA_PORT_UP) { |
@@ -1785,7 +1785,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
1785 | 1785 | ||
1786 | out_upregs: | 1786 | out_upregs: |
1787 | ehea_update_bcmc_registrations(); | 1787 | ehea_update_bcmc_registrations(); |
1788 | mutex_unlock(&ehea_bcmc_regs.lock); | 1788 | spin_unlock(&ehea_bcmc_regs.lock); |
1789 | out_free: | 1789 | out_free: |
1790 | kfree(cb0); | 1790 | kfree(cb0); |
1791 | out: | 1791 | out: |
@@ -1947,7 +1947,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
1947 | } | 1947 | } |
1948 | ehea_promiscuous(dev, 0); | 1948 | ehea_promiscuous(dev, 0); |
1949 | 1949 | ||
1950 | mutex_lock(&ehea_bcmc_regs.lock); | 1950 | spin_lock(&ehea_bcmc_regs.lock); |
1951 | 1951 | ||
1952 | if (dev->flags & IFF_ALLMULTI) { | 1952 | if (dev->flags & IFF_ALLMULTI) { |
1953 | ehea_allmulti(dev, 1); | 1953 | ehea_allmulti(dev, 1); |
@@ -1978,7 +1978,7 @@ static void ehea_set_multicast_list(struct net_device *dev) | |||
1978 | } | 1978 | } |
1979 | out: | 1979 | out: |
1980 | ehea_update_bcmc_registrations(); | 1980 | ehea_update_bcmc_registrations(); |
1981 | mutex_unlock(&ehea_bcmc_regs.lock); | 1981 | spin_unlock(&ehea_bcmc_regs.lock); |
1982 | return; | 1982 | return; |
1983 | } | 1983 | } |
1984 | 1984 | ||
@@ -2497,7 +2497,7 @@ static int ehea_up(struct net_device *dev) | |||
2497 | } | 2497 | } |
2498 | } | 2498 | } |
2499 | 2499 | ||
2500 | mutex_lock(&ehea_bcmc_regs.lock); | 2500 | spin_lock(&ehea_bcmc_regs.lock); |
2501 | 2501 | ||
2502 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); | 2502 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); |
2503 | if (ret) { | 2503 | if (ret) { |
@@ -2520,7 +2520,7 @@ out: | |||
2520 | ehea_info("Failed starting %s. ret=%i", dev->name, ret); | 2520 | ehea_info("Failed starting %s. ret=%i", dev->name, ret); |
2521 | 2521 | ||
2522 | ehea_update_bcmc_registrations(); | 2522 | ehea_update_bcmc_registrations(); |
2523 | mutex_unlock(&ehea_bcmc_regs.lock); | 2523 | spin_unlock(&ehea_bcmc_regs.lock); |
2524 | 2524 | ||
2525 | ehea_update_firmware_handles(); | 2525 | ehea_update_firmware_handles(); |
2526 | mutex_unlock(&ehea_fw_handles.lock); | 2526 | mutex_unlock(&ehea_fw_handles.lock); |
@@ -2575,7 +2575,7 @@ static int ehea_down(struct net_device *dev) | |||
2575 | 2575 | ||
2576 | mutex_lock(&ehea_fw_handles.lock); | 2576 | mutex_lock(&ehea_fw_handles.lock); |
2577 | 2577 | ||
2578 | mutex_lock(&ehea_bcmc_regs.lock); | 2578 | spin_lock(&ehea_bcmc_regs.lock); |
2579 | ehea_drop_multicast_list(dev); | 2579 | ehea_drop_multicast_list(dev); |
2580 | ehea_broadcast_reg_helper(port, H_DEREG_BCMC); | 2580 | ehea_broadcast_reg_helper(port, H_DEREG_BCMC); |
2581 | 2581 | ||
@@ -2584,7 +2584,7 @@ static int ehea_down(struct net_device *dev) | |||
2584 | port->state = EHEA_PORT_DOWN; | 2584 | port->state = EHEA_PORT_DOWN; |
2585 | 2585 | ||
2586 | ehea_update_bcmc_registrations(); | 2586 | ehea_update_bcmc_registrations(); |
2587 | mutex_unlock(&ehea_bcmc_regs.lock); | 2587 | spin_unlock(&ehea_bcmc_regs.lock); |
2588 | 2588 | ||
2589 | ret = ehea_clean_all_portres(port); | 2589 | ret = ehea_clean_all_portres(port); |
2590 | if (ret) | 2590 | if (ret) |
@@ -3590,7 +3590,7 @@ int __init ehea_module_init(void) | |||
3590 | memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs)); | 3590 | memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs)); |
3591 | 3591 | ||
3592 | mutex_init(&ehea_fw_handles.lock); | 3592 | mutex_init(&ehea_fw_handles.lock); |
3593 | mutex_init(&ehea_bcmc_regs.lock); | 3593 | spin_lock_init(&ehea_bcmc_regs.lock); |
3594 | 3594 | ||
3595 | ret = check_module_parm(); | 3595 | ret = check_module_parm(); |
3596 | if (ret) | 3596 | if (ret) |