Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] w1: Use mutexes instead of semaphores.

Use mutexes instead of semaphores.
Patch tested on x86_64 and i386 with test bus master driver.

Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Evgeniy Polyakov and committed by
Greg Kroah-Hartman
abd52a13 46e07f6e

+70 -127
+12 -12
drivers/w1/masters/ds2482.c
··· 125 125 126 126 struct ds2482_data { 127 127 struct i2c_client client; 128 - struct semaphore access_lock; 128 + struct mutex access_lock; 129 129 130 130 /* 1-wire interface(s) */ 131 131 int w1_count; /* 1 or 8 */ ··· 265 265 struct ds2482_data *pdev = pchan->pdev; 266 266 int status = -1; 267 267 268 - down(&pdev->access_lock); 268 + mutex_lock(&pdev->access_lock); 269 269 270 270 /* Select the channel */ 271 271 ds2482_wait_1wire_idle(pdev); ··· 277 277 bit ? 0xFF : 0)) 278 278 status = ds2482_wait_1wire_idle(pdev); 279 279 280 - up(&pdev->access_lock); 280 + mutex_unlock(&pdev->access_lock); 281 281 282 282 return (status & DS2482_REG_STS_SBR) ? 1 : 0; 283 283 } ··· 297 297 struct ds2482_data *pdev = pchan->pdev; 298 298 int status = (3 << 5); 299 299 300 - down(&pdev->access_lock); 300 + mutex_lock(&pdev->access_lock); 301 301 302 302 /* Select the channel */ 303 303 ds2482_wait_1wire_idle(pdev); ··· 309 309 dbit ? 0xFF : 0)) 310 310 status = ds2482_wait_1wire_idle(pdev); 311 311 312 - up(&pdev->access_lock); 312 + mutex_unlock(&pdev->access_lock); 313 313 314 314 /* Decode the status */ 315 315 return (status >> 5); ··· 326 326 struct ds2482_w1_chan *pchan = data; 327 327 struct ds2482_data *pdev = pchan->pdev; 328 328 329 - down(&pdev->access_lock); 329 + mutex_lock(&pdev->access_lock); 330 330 331 331 /* Select the channel */ 332 332 ds2482_wait_1wire_idle(pdev); ··· 336 336 /* Send the write byte command */ 337 337 ds2482_send_cmd_data(pdev, DS2482_CMD_1WIRE_WRITE_BYTE, byte); 338 338 339 - up(&pdev->access_lock); 339 + mutex_unlock(&pdev->access_lock); 340 340 } 341 341 342 342 /** ··· 351 351 struct ds2482_data *pdev = pchan->pdev; 352 352 int result; 353 353 354 - down(&pdev->access_lock); 354 + mutex_lock(&pdev->access_lock); 355 355 356 356 /* Select the channel */ 357 357 ds2482_wait_1wire_idle(pdev); ··· 370 370 /* Read the data byte */ 371 371 result = i2c_smbus_read_byte(&pdev->client); 372 372 373 - up(&pdev->access_lock); 373 + mutex_unlock(&pdev->access_lock); 374 374 375 375 return result; 376 376 } ··· 389 389 int err; 390 390 u8 retval = 1; 391 391 392 - down(&pdev->access_lock); 392 + mutex_lock(&pdev->access_lock); 393 393 394 394 /* Select the channel */ 395 395 ds2482_wait_1wire_idle(pdev); ··· 409 409 0xF0); 410 410 } 411 411 412 - up(&pdev->access_lock); 412 + mutex_unlock(&pdev->access_lock); 413 413 414 414 return retval; 415 415 } ··· 482 482 snprintf(new_client->name, sizeof(new_client->name), "ds2482-%d00", 483 483 data->w1_count); 484 484 485 - init_MUTEX(&data->access_lock); 485 + mutex_init(&data->access_lock); 486 486 487 487 /* Tell the I2C layer a new client has arrived */ 488 488 if ((err = i2c_attach_client(new_client)))
+5 -5
drivers/w1/masters/ds2490.c
··· 169 169 static int ds_send_control_cmd(struct ds_device *, u16, u16); 170 170 171 171 static LIST_HEAD(ds_devices); 172 - static DECLARE_MUTEX(ds_mutex); 172 + static DEFINE_MUTEX(ds_mutex); 173 173 174 174 static struct usb_driver ds_driver = { 175 175 .name = "DS9490R", ··· 887 887 if (err) 888 888 goto err_out_clear; 889 889 890 - down(&ds_mutex); 890 + mutex_lock(&ds_mutex); 891 891 list_add_tail(&dev->ds_entry, &ds_devices); 892 - up(&ds_mutex); 892 + mutex_unlock(&ds_mutex); 893 893 894 894 return 0; 895 895 ··· 909 909 if (!dev) 910 910 return; 911 911 912 - down(&ds_mutex); 912 + mutex_lock(&ds_mutex); 913 913 list_del(&dev->ds_entry); 914 - up(&ds_mutex); 914 + mutex_unlock(&ds_mutex); 915 915 916 916 ds_w1_fini(dev); 917 917
+4 -16
drivers/w1/slaves/w1_ds2433.c
··· 105 105 if ((count = w1_f23_fix_count(off, count, W1_EEPROM_SIZE)) == 0) 106 106 return 0; 107 107 108 - atomic_inc(&sl->refcnt); 109 - if (down_interruptible(&sl->master->mutex)) { 110 - count = 0; 111 - goto out_dec; 112 - } 108 + mutex_lock(&sl->master->mutex); 113 109 114 110 #ifdef CONFIG_W1_F23_CRC 115 111 ··· 136 140 #endif /* CONFIG_W1_F23_CRC */ 137 141 138 142 out_up: 139 - up(&sl->master->mutex); 140 - out_dec: 141 - atomic_dec(&sl->refcnt); 143 + mutex_unlock(&sl->master->mutex); 142 144 143 145 return count; 144 146 } ··· 225 231 } 226 232 #endif /* CONFIG_W1_F23_CRC */ 227 233 228 - atomic_inc(&sl->refcnt); 229 - if (down_interruptible(&sl->master->mutex)) { 230 - count = 0; 231 - goto out_dec; 232 - } 234 + mutex_lock(&sl->master->mutex); 233 235 234 236 /* Can only write data to one page at a time */ 235 237 idx = 0; ··· 243 253 } 244 254 245 255 out_up: 246 - up(&sl->master->mutex); 247 - out_dec: 248 - atomic_dec(&sl->refcnt); 256 + mutex_unlock(&sl->master->mutex); 249 257 250 258 return count; 251 259 }
+2 -10
drivers/w1/slaves/w1_therm.c
··· 165 165 u8 rom[9], crc, verdict; 166 166 int i, max_trying = 10; 167 167 168 - atomic_inc(&sl->refcnt); 169 - smp_mb__after_atomic_inc(); 170 - if (down_interruptible(&sl->master->mutex)) { 171 - count = 0; 172 - goto out_dec; 173 - } 168 + mutex_lock(&sl->master->mutex); 174 169 175 170 if (off > W1_SLAVE_DATA_SIZE) { 176 171 count = 0; ··· 228 233 229 234 count += sprintf(buf + count, "t=%d\n", w1_convert_temp(rom, sl->family->fid)); 230 235 out: 231 - up(&dev->mutex); 232 - out_dec: 233 - smp_mb__before_atomic_inc(); 234 - atomic_dec(&sl->refcnt); 236 + mutex_unlock(&dev->mutex); 235 237 236 238 return count; 237 239 }
+39 -75
drivers/w1/w1.c
··· 54 54 module_param_named(max_slave_count, w1_max_slave_count, int, 0); 55 55 module_param_named(slave_ttl, w1_max_slave_ttl, int, 0); 56 56 57 - DECLARE_MUTEX(w1_mlock); 57 + DEFINE_MUTEX(w1_mlock); 58 58 LIST_HEAD(w1_masters); 59 59 60 60 static struct task_struct *w1_control_thread; ··· 139 139 { 140 140 struct w1_slave *sl = kobj_to_w1_slave(kobj); 141 141 142 - if (down_interruptible(&sl->master->mutex)) { 143 - count = 0; 144 - goto out; 145 - } 146 - 142 + mutex_lock(&sl->master->mutex); 147 143 if (w1_reset_select_slave(sl)) { 148 144 count = 0; 149 145 goto out_up; ··· 148 152 w1_write_block(sl->master, buf, count); 149 153 150 154 out_up: 151 - up(&sl->master->mutex); 152 - out: 155 + mutex_unlock(&sl->master->mutex); 153 156 return count; 154 157 } 155 158 ··· 156 161 { 157 162 struct w1_slave *sl = kobj_to_w1_slave(kobj); 158 163 159 - if (down_interruptible(&sl->master->mutex)) { 160 - count = 0; 161 - goto out; 162 - } 163 - 164 + mutex_lock(&sl->master->mutex); 164 165 w1_read_block(sl->master, buf, count); 165 - 166 - up(&sl->master->mutex); 167 - out: 166 + mutex_unlock(&sl->master->mutex); 168 167 return count; 169 168 } 170 169 ··· 232 243 struct w1_master *md = dev_to_w1_master(dev); 233 244 ssize_t count; 234 245 235 - if (down_interruptible (&md->mutex)) 236 - return -EBUSY; 237 - 246 + mutex_lock(&md->mutex); 238 247 count = sprintf(buf, "%s\n", md->name); 239 - 240 - up(&md->mutex); 248 + mutex_unlock(&md->mutex); 241 249 242 250 return count; 243 251 } ··· 245 259 { 246 260 struct w1_master *md = dev_to_w1_master(dev); 247 261 248 - if (down_interruptible (&md->mutex)) 249 - return -EBUSY; 250 - 262 + mutex_lock(&md->mutex); 251 263 md->search_count = simple_strtol(buf, NULL, 0); 252 - 253 - up(&md->mutex); 264 + mutex_unlock(&md->mutex); 254 265 255 266 return count; 256 267 } ··· 259 276 struct w1_master *md = dev_to_w1_master(dev); 260 277 ssize_t count; 261 278 262 - if (down_interruptible (&md->mutex)) 263 - return -EBUSY; 264 - 279 + mutex_lock(&md->mutex); 265 280 count = sprintf(buf, "%d\n", md->search_count); 266 - 267 - up(&md->mutex); 281 + mutex_unlock(&md->mutex); 268 282 269 283 return count; 270 284 } ··· 271 291 struct w1_master *md = dev_to_w1_master(dev); 272 292 ssize_t count; 273 293 274 - if (down_interruptible(&md->mutex)) 275 - return -EBUSY; 276 - 294 + mutex_lock(&md->mutex); 277 295 count = sprintf(buf, "0x%p\n", md->bus_master); 278 - 279 - up(&md->mutex); 296 + mutex_unlock(&md->mutex); 280 297 return count; 281 298 } 282 299 ··· 289 312 struct w1_master *md = dev_to_w1_master(dev); 290 313 ssize_t count; 291 314 292 - if (down_interruptible(&md->mutex)) 293 - return -EBUSY; 294 - 315 + mutex_lock(&md->mutex); 295 316 count = sprintf(buf, "%d\n", md->max_slave_count); 296 - 297 - up(&md->mutex); 317 + mutex_unlock(&md->mutex); 298 318 return count; 299 319 } 300 320 ··· 300 326 struct w1_master *md = dev_to_w1_master(dev); 301 327 ssize_t count; 302 328 303 - if (down_interruptible(&md->mutex)) 304 - return -EBUSY; 305 - 329 + mutex_lock(&md->mutex); 306 330 count = sprintf(buf, "%lu\n", md->attempts); 307 - 308 - up(&md->mutex); 331 + mutex_unlock(&md->mutex); 309 332 return count; 310 333 } 311 334 ··· 311 340 struct w1_master *md = dev_to_w1_master(dev); 312 341 ssize_t count; 313 342 314 - if (down_interruptible(&md->mutex)) 315 - return -EBUSY; 316 - 343 + mutex_lock(&md->mutex); 317 344 count = sprintf(buf, "%d\n", md->slave_count); 318 - 319 - up(&md->mutex); 345 + mutex_unlock(&md->mutex); 320 346 return count; 321 347 } 322 348 ··· 322 354 struct w1_master *md = dev_to_w1_master(dev); 323 355 int c = PAGE_SIZE; 324 356 325 - if (down_interruptible(&md->mutex)) 326 - return -EBUSY; 357 + mutex_lock(&md->mutex); 327 358 328 359 if (md->slave_count == 0) 329 360 c -= snprintf(buf + PAGE_SIZE - c, c, "not found.\n"); ··· 337 370 } 338 371 } 339 372 340 - up(&md->mutex); 373 + mutex_unlock(&md->mutex); 341 374 342 375 return PAGE_SIZE - c; 343 376 } ··· 587 620 struct w1_master *dev; 588 621 int found = 0; 589 622 590 - down(&w1_mlock); 623 + mutex_lock(&w1_mlock); 591 624 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 592 625 if (dev->bus_master->data == data) { 593 626 found = 1; ··· 595 628 break; 596 629 } 597 630 } 598 - up(&w1_mlock); 631 + mutex_unlock(&w1_mlock); 599 632 600 633 return (found)?dev:NULL; 601 634 } ··· 605 638 struct w1_master *dev; 606 639 int found = 0; 607 640 608 - down(&w1_mlock); 641 + mutex_lock(&w1_mlock); 609 642 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 610 643 if (dev->id == id) { 611 644 found = 1; ··· 613 646 break; 614 647 } 615 648 } 616 - up(&w1_mlock); 649 + mutex_unlock(&w1_mlock); 617 650 618 651 return (found)?dev:NULL; 619 652 } ··· 624 657 struct w1_slave *sl = NULL; 625 658 int found = 0; 626 659 627 - down(&w1_mlock); 660 + mutex_lock(&w1_mlock); 628 661 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 629 - down(&dev->mutex); 662 + mutex_lock(&dev->mutex); 630 663 list_for_each_entry(sl, &dev->slist, w1_slave_entry) { 631 664 if (sl->reg_num.family == id->family && 632 665 sl->reg_num.id == id->id && ··· 637 670 break; 638 671 } 639 672 } 640 - up(&dev->mutex); 673 + mutex_unlock(&dev->mutex); 641 674 642 675 if (found) 643 676 break; 644 677 } 645 - up(&w1_mlock); 678 + mutex_unlock(&w1_mlock); 646 679 647 680 return (found)?sl:NULL; 648 681 } ··· 651 684 { 652 685 struct w1_master *dev; 653 686 654 - down(&w1_mlock); 687 + mutex_lock(&w1_mlock); 655 688 list_for_each_entry(dev, &w1_masters, w1_master_entry) { 656 689 dev_dbg(&dev->dev, "Reconnecting slaves in %s into new family %02x.\n", 657 690 dev->name, f->fid); 658 691 set_bit(W1_MASTER_NEED_RECONNECT, &dev->flags); 659 692 } 660 - up(&w1_mlock); 693 + mutex_unlock(&w1_mlock); 661 694 } 662 695 663 696 static void w1_slave_found(void *data, u64 rn) ··· 812 845 if (kthread_should_stop() || test_bit(W1_MASTER_NEED_EXIT, &dev->flags)) { 813 846 set_bit(W1_MASTER_NEED_EXIT, &dev->flags); 814 847 815 - down(&w1_mlock); 848 + mutex_lock(&w1_mlock); 816 849 list_del(&dev->w1_master_entry); 817 - up(&w1_mlock); 850 + mutex_unlock(&w1_mlock); 818 851 819 - down(&dev->mutex); 852 + mutex_lock(&dev->mutex); 820 853 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { 821 854 w1_slave_detach(sl); 822 855 } 823 856 w1_destroy_master_attributes(dev); 824 - up(&dev->mutex); 857 + mutex_unlock(&dev->mutex); 825 858 atomic_dec(&dev->refcnt); 826 859 continue; 827 860 } 828 861 829 862 if (test_bit(W1_MASTER_NEED_RECONNECT, &dev->flags)) { 830 863 dev_dbg(&dev->dev, "Reconnecting slaves in device %s.\n", dev->name); 831 - down(&dev->mutex); 864 + mutex_lock(&dev->mutex); 832 865 list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) { 833 866 if (sl->family->fid == W1_FAMILY_DEFAULT) { 834 867 struct w1_reg_num rn; ··· 841 874 } 842 875 dev_dbg(&dev->dev, "Reconnecting slaves in device %s has been finished.\n", dev->name); 843 876 clear_bit(W1_MASTER_NEED_RECONNECT, &dev->flags); 844 - up(&dev->mutex); 877 + mutex_unlock(&dev->mutex); 845 878 } 846 879 } 847 880 } ··· 888 921 if (dev->search_count == 0) 889 922 continue; 890 923 891 - if (down_interruptible(&dev->mutex)) 892 - continue; 893 - 924 + mutex_lock(&dev->mutex); 894 925 w1_search_process(dev, W1_SEARCH); 895 - 896 - up(&dev->mutex); 926 + mutex_unlock(&dev->mutex); 897 927 } 898 928 899 929 atomic_dec(&dev->refcnt);
+2 -3
drivers/w1/w1.h
··· 41 41 42 42 #include <linux/completion.h> 43 43 #include <linux/device.h> 44 - 45 - #include <asm/semaphore.h> 44 + #include <linux/mutex.h> 46 45 47 46 #include "w1_family.h" 48 47 ··· 170 171 long flags; 171 172 172 173 struct task_struct *thread; 173 - struct semaphore mutex; 174 + struct mutex mutex; 174 175 175 176 struct device_driver *driver; 176 177 struct device dev;
+4 -4
drivers/w1/w1_int.c
··· 36 36 extern int w1_max_slave_count; 37 37 extern int w1_max_slave_ttl; 38 38 extern struct list_head w1_masters; 39 - extern struct semaphore w1_mlock; 39 + extern struct mutex w1_mlock; 40 40 41 41 extern int w1_process(void *); 42 42 ··· 74 74 atomic_set(&dev->refcnt, 2); 75 75 76 76 INIT_LIST_HEAD(&dev->slist); 77 - init_MUTEX(&dev->mutex); 77 + mutex_init(&dev->mutex); 78 78 79 79 memcpy(&dev->dev, device, sizeof(struct device)); 80 80 snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), ··· 135 135 136 136 dev->initialized = 1; 137 137 138 - down(&w1_mlock); 138 + mutex_lock(&w1_mlock); 139 139 list_add(&dev->w1_master_entry, &w1_masters); 140 - up(&w1_mlock); 140 + mutex_unlock(&w1_mlock); 141 141 142 142 memset(&msg, 0, sizeof(msg)); 143 143 msg.id.mst.id = dev->id;
+2 -2
drivers/w1/w1_netlink.c
··· 171 171 goto out_cont; 172 172 } 173 173 174 - down(&dev->mutex); 174 + mutex_lock(&dev->mutex); 175 175 176 176 if (sl && w1_reset_select_slave(sl)) { 177 177 err = -ENODEV; ··· 198 198 atomic_dec(&dev->refcnt); 199 199 if (sl) 200 200 atomic_dec(&sl->refcnt); 201 - up(&dev->mutex); 201 + mutex_unlock(&dev->mutex); 202 202 out_cont: 203 203 msg->len -= sizeof(struct w1_netlink_msg) + m->len; 204 204 m = (struct w1_netlink_msg *)(((u8 *)m) + sizeof(struct w1_netlink_msg) + m->len);