diff options
| -rw-r--r-- | drivers/infiniband/hw/ehca/ehca_main.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index bec7e0249358..3b77b674cbf6 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
| @@ -717,6 +717,7 @@ static int __devinit ehca_probe(struct of_device *dev, | |||
| 717 | const u64 *handle; | 717 | const u64 *handle; |
| 718 | struct ib_pd *ibpd; | 718 | struct ib_pd *ibpd; |
| 719 | int ret, i, eq_size; | 719 | int ret, i, eq_size; |
| 720 | unsigned long flags; | ||
| 720 | 721 | ||
| 721 | handle = of_get_property(dev->node, "ibm,hca-handle", NULL); | 722 | handle = of_get_property(dev->node, "ibm,hca-handle", NULL); |
| 722 | if (!handle) { | 723 | if (!handle) { |
| @@ -830,9 +831,9 @@ static int __devinit ehca_probe(struct of_device *dev, | |||
| 830 | ehca_err(&shca->ib_device, | 831 | ehca_err(&shca->ib_device, |
| 831 | "Cannot create device attributes ret=%d", ret); | 832 | "Cannot create device attributes ret=%d", ret); |
| 832 | 833 | ||
| 833 | spin_lock(&shca_list_lock); | 834 | spin_lock_irqsave(&shca_list_lock, flags); |
| 834 | list_add(&shca->shca_list, &shca_list); | 835 | list_add(&shca->shca_list, &shca_list); |
| 835 | spin_unlock(&shca_list_lock); | 836 | spin_unlock_irqrestore(&shca_list_lock, flags); |
| 836 | 837 | ||
| 837 | return 0; | 838 | return 0; |
| 838 | 839 | ||
| @@ -878,6 +879,7 @@ probe1: | |||
| 878 | static int __devexit ehca_remove(struct of_device *dev) | 879 | static int __devexit ehca_remove(struct of_device *dev) |
| 879 | { | 880 | { |
| 880 | struct ehca_shca *shca = dev->dev.driver_data; | 881 | struct ehca_shca *shca = dev->dev.driver_data; |
| 882 | unsigned long flags; | ||
| 881 | int ret; | 883 | int ret; |
| 882 | 884 | ||
| 883 | sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp); | 885 | sysfs_remove_group(&dev->dev.kobj, &ehca_dev_attr_grp); |
| @@ -915,9 +917,9 @@ static int __devexit ehca_remove(struct of_device *dev) | |||
| 915 | 917 | ||
| 916 | ib_dealloc_device(&shca->ib_device); | 918 | ib_dealloc_device(&shca->ib_device); |
| 917 | 919 | ||
| 918 | spin_lock(&shca_list_lock); | 920 | spin_lock_irqsave(&shca_list_lock, flags); |
| 919 | list_del(&shca->shca_list); | 921 | list_del(&shca->shca_list); |
| 920 | spin_unlock(&shca_list_lock); | 922 | spin_unlock_irqrestore(&shca_list_lock, flags); |
| 921 | 923 | ||
| 922 | return ret; | 924 | return ret; |
| 923 | } | 925 | } |
| @@ -975,6 +977,7 @@ static int ehca_mem_notifier(struct notifier_block *nb, | |||
| 975 | unsigned long action, void *data) | 977 | unsigned long action, void *data) |
| 976 | { | 978 | { |
| 977 | static unsigned long ehca_dmem_warn_time; | 979 | static unsigned long ehca_dmem_warn_time; |
| 980 | unsigned long flags; | ||
| 978 | 981 | ||
| 979 | switch (action) { | 982 | switch (action) { |
| 980 | case MEM_CANCEL_OFFLINE: | 983 | case MEM_CANCEL_OFFLINE: |
| @@ -985,12 +988,12 @@ static int ehca_mem_notifier(struct notifier_block *nb, | |||
| 985 | case MEM_GOING_ONLINE: | 988 | case MEM_GOING_ONLINE: |
| 986 | case MEM_GOING_OFFLINE: | 989 | case MEM_GOING_OFFLINE: |
| 987 | /* only ok if no hca is attached to the lpar */ | 990 | /* only ok if no hca is attached to the lpar */ |
| 988 | spin_lock(&shca_list_lock); | 991 | spin_lock_irqsave(&shca_list_lock, flags); |
| 989 | if (list_empty(&shca_list)) { | 992 | if (list_empty(&shca_list)) { |
| 990 | spin_unlock(&shca_list_lock); | 993 | spin_unlock_irqrestore(&shca_list_lock, flags); |
| 991 | return NOTIFY_OK; | 994 | return NOTIFY_OK; |
| 992 | } else { | 995 | } else { |
| 993 | spin_unlock(&shca_list_lock); | 996 | spin_unlock_irqrestore(&shca_list_lock, flags); |
| 994 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, | 997 | if (printk_timed_ratelimit(&ehca_dmem_warn_time, |
| 995 | 30 * 1000)) | 998 | 30 * 1000)) |
| 996 | ehca_gen_err("DMEM operations are not allowed" | 999 | ehca_gen_err("DMEM operations are not allowed" |
