Commit 6a8a8e14bed179f2d415c7f4fee51233c35c10c3

Authored by Tony Luck

Pull sem2mutex-ioc4 into release branch

Showing 1 changed file Side-by-side Diff

... ... @@ -31,7 +31,7 @@
31 31 #include <linux/ioc4.h>
32 32 #include <linux/mmtimer.h>
33 33 #include <linux/rtc.h>
34   -#include <linux/rwsem.h>
  34 +#include <linux/mutex.h>
35 35 #include <asm/sn/addrs.h>
36 36 #include <asm/sn/clksupport.h>
37 37 #include <asm/sn/shub_mmr.h>
38 38  
39 39  
... ... @@ -54,11 +54,10 @@
54 54 * Submodule management *
55 55 ************************/
56 56  
57   -static LIST_HEAD(ioc4_devices);
58   -static DECLARE_RWSEM(ioc4_devices_rwsem);
  57 +static DEFINE_MUTEX(ioc4_mutex);
59 58  
  59 +static LIST_HEAD(ioc4_devices);
60 60 static LIST_HEAD(ioc4_submodules);
61   -static DECLARE_RWSEM(ioc4_submodules_rwsem);
62 61  
63 62 /* Register an IOC4 submodule */
64 63 int
65 64  
66 65  
67 66  
... ... @@ -66,15 +65,13 @@
66 65 {
67 66 struct ioc4_driver_data *idd;
68 67  
69   - down_write(&ioc4_submodules_rwsem);
  68 + mutex_lock(&ioc4_mutex);
70 69 list_add(&is->is_list, &ioc4_submodules);
71   - up_write(&ioc4_submodules_rwsem);
72 70  
73 71 /* Initialize submodule for each IOC4 */
74 72 if (!is->is_probe)
75   - return 0;
  73 + goto out;
76 74  
77   - down_read(&ioc4_devices_rwsem);
78 75 list_for_each_entry(idd, &ioc4_devices, idd_list) {
79 76 if (is->is_probe(idd)) {
80 77 printk(KERN_WARNING
... ... @@ -84,8 +81,8 @@
84 81 pci_name(idd->idd_pdev));
85 82 }
86 83 }
87   - up_read(&ioc4_devices_rwsem);
88   -
  84 + out:
  85 + mutex_unlock(&ioc4_mutex);
89 86 return 0;
90 87 }
91 88  
92 89  
93 90  
94 91  
... ... @@ -95,15 +92,13 @@
95 92 {
96 93 struct ioc4_driver_data *idd;
97 94  
98   - down_write(&ioc4_submodules_rwsem);
  95 + mutex_lock(&ioc4_mutex);
99 96 list_del(&is->is_list);
100   - up_write(&ioc4_submodules_rwsem);
101 97  
102 98 /* Remove submodule for each IOC4 */
103 99 if (!is->is_remove)
104   - return;
  100 + goto out;
105 101  
106   - down_read(&ioc4_devices_rwsem);
107 102 list_for_each_entry(idd, &ioc4_devices, idd_list) {
108 103 if (is->is_remove(idd)) {
109 104 printk(KERN_WARNING
... ... @@ -113,7 +108,8 @@
113 108 pci_name(idd->idd_pdev));
114 109 }
115 110 }
116   - up_read(&ioc4_devices_rwsem);
  111 + out:
  112 + mutex_unlock(&ioc4_mutex);
117 113 }
118 114  
119 115 /*********************
120 116  
121 117  
... ... @@ -312,12 +308,11 @@
312 308 /* Track PCI-device specific data */
313 309 idd->idd_serial_data = NULL;
314 310 pci_set_drvdata(idd->idd_pdev, idd);
315   - down_write(&ioc4_devices_rwsem);
  311 +
  312 + mutex_lock(&ioc4_mutex);
316 313 list_add(&idd->idd_list, &ioc4_devices);
317   - up_write(&ioc4_devices_rwsem);
318 314  
319 315 /* Add this IOC4 to all submodules */
320   - down_read(&ioc4_submodules_rwsem);
321 316 list_for_each_entry(is, &ioc4_submodules, is_list) {
322 317 if (is->is_probe && is->is_probe(idd)) {
323 318 printk(KERN_WARNING
... ... @@ -327,7 +322,7 @@
327 322 pci_name(idd->idd_pdev));
328 323 }
329 324 }
330   - up_read(&ioc4_submodules_rwsem);
  325 + mutex_unlock(&ioc4_mutex);
331 326  
332 327 return 0;
333 328  
... ... @@ -351,7 +346,7 @@
351 346 idd = pci_get_drvdata(pdev);
352 347  
353 348 /* Remove this IOC4 from all submodules */
354   - down_read(&ioc4_submodules_rwsem);
  349 + mutex_lock(&ioc4_mutex);
355 350 list_for_each_entry(is, &ioc4_submodules, is_list) {
356 351 if (is->is_remove && is->is_remove(idd)) {
357 352 printk(KERN_WARNING
... ... @@ -361,7 +356,7 @@
361 356 pci_name(idd->idd_pdev));
362 357 }
363 358 }
364   - up_read(&ioc4_submodules_rwsem);
  359 + mutex_unlock(&ioc4_mutex);
365 360  
366 361 /* Release resources */
367 362 iounmap(idd->idd_misc_regs);
368 363  
... ... @@ -377,9 +372,9 @@
377 372 pci_disable_device(pdev);
378 373  
379 374 /* Remove and free driver data */
380   - down_write(&ioc4_devices_rwsem);
  375 + mutex_lock(&ioc4_mutex);
381 376 list_del(&idd->idd_list);
382   - up_write(&ioc4_devices_rwsem);
  377 + mutex_unlock(&ioc4_mutex);
383 378 kfree(idd);
384 379 }
385 380