Commit 6a8a8e14bed179f2d415c7f4fee51233c35c10c3
Exists in
master
and in
20 other branches
Pull sem2mutex-ioc4 into release branch
Showing 1 changed file Side-by-side Diff
drivers/sn/ioc4.c
... | ... | @@ -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 |