use mutex instead of semaphore in several drivers
cover use mutex instead of semaphore in several drivers
This patchset converts semaphores that are used as mutexes to the mutex API in the following drivers/code:
SPI core/init code
USB gadget serial
ELAN U132 adapter
Adutux
FTDI ELAN
Signature · 10 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
You must have a plan. If you don't have a plan,
you'll become part of somebody else's plan
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-PATCH 1/5 use mutex instead of semaphore in SPI core/init code
The SPI core/init code uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
--
drivers/spi/spi.c +6 -5
@@ -23,6 +23,7 @@#include <linux/device.h> #include <linux/init.h> #include <linux/cache.h> +#include <linux/mutex.h> #include <linux/spi/spi.h>
@@ -185,7 +186,7 @@ struct boardinfo { };static LIST_HEAD (board_list); -static DECLARE_MUTEX (board_lock); +static DEFINE_MUTEX (board_lock);/**
@@ -292,9 +293,9 @@ spi_register_board_info(struct spi_board_info const *info, unsigned n) bi->n_board_info = n;memcpy (bi->board_info, info, n *sizeof *info); -down (&board_lock); +mutex_lock (&board_lock);list_add_tail (&bi->list, &board_list); -up (&board_lock); +mutex_unlock (&board_lock);return 0 ; }
@@ -308,7 +309,7 @@ scan_boardinfo(struct spi_master *master)struct boardinfo *bi;struct device *dev = master->cdev.dev; -down (&board_lock); +mutex_lock (&board_lock);list_for_each_entry (bi, &board_list, list) {struct spi_board_info *chip = bi->board_info;unsigned n;
@@ -330,7 +331,7 @@ scan_boardinfo(struct spi_master *master) (void )spi_new_device (master, chip); } } -up (&board_lock); +mutex_unlock (&board_lock); }/*-------------------------------------------------------------------------*/
Signature · 11 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
Ma patrie est où je suis, où personne ne me dérange, où personne
ne me demande que je suis, d'où je viens et ce que je fais
(B. Traven)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-Re: [PATCH 1/5] use mutex instead of semaphore in SPI core/init code
Quoted 4 lines · Matthias Kaehlcke
The SPI core/init code uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
Signed-off-by Matthias Kaehlcke <[email protected]>
ACK ... and thanks!
Quoted 68 lines
--
drivers/spi/spi.c +6
-5@@ -23,6 +23,7 @@#include <linux/device.h> #include <linux/init.h> #include <linux/cache.h> +#include <linux/mutex.h> #include <linux/spi/spi.h> @@ -185,7 +186,7 @@ struct boardinfo { };static LIST_HEAD (board_list); -static DECLARE_MUTEX (board_lock); +static DEFINE_MUTEX (board_lock);/** @@ -292,9 +293,9 @@ spi_register_board_info(struct spi_board_info const *info, unsigned n) bi->n_board_info = n;memcpy (bi->board_info, info, n *sizeof *info); -down (&board_lock); +mutex_lock (&board_lock);list_add_tail (&bi->list, &board_list); -up (&board_lock); +mutex_unlock (&board_lock);return 0 ; }@@ -308,7 +309,7 @@ scan_boardinfo(struct spi_master *master)struct boardinfo *bi;struct device *dev = master->cdev.dev; -down (&board_lock); +mutex_lock (&board_lock);list_for_each_entry (bi, &board_list, list) {struct spi_board_info *chip = bi->board_info;unsigned n;@@ -330,7 +331,7 @@ scan_boardinfo(struct spi_master *master) (void )spi_new_device (master, chip); } } -up (&board_lock); +mutex_unlock (&board_lock); }/*-------------------------------------------------------------------------*/ Signature · 12 lines
-- Matthias Kaehlcke Linux Application Developer Barcelona Ma patrie est où je suis, où personne ne me dérange, où personne ne me demande que je suis, d'où je viens et ce que je fais (B. Traven) .''`. using free software / Debian GNU/Linux | http://debian.org : :' : `. `'` gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
PATCH 2/5 use mutex instead of semaphore in the USB gadget serial driver
In reply to Matthias KaehlckeThe USB gadget serial driver uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
--
drivers/usb/gadget/serial.c +13 -12
@@ -33,6 +33,7 @@#include <linux/device.h> #include <linux/tty.h> #include <linux/tty_flip.h> +#include <linux/mutex.h> #include <asm/byteorder.h> #include <asm/io.h>
@@ -258,7 +259,7 @@ static const char *EP_IN_NAME;static const char *EP_OUT_NAME ;static const char *EP_NOTIFY_NAME ; -static struct semaphore gs_open_close_sem[GS_NUM_PORTS ]; +static struct mutex gs_open_close_lock[GS_NUM_PORTS ];static unsigned int read_q_size =GS_DEFAULT_READ_Q_SIZE ;static unsigned int write_q_size =GS_DEFAULT_WRITE_Q_SIZE ;
@@ -595,7 +596,7 @@ static int __init gs_module_init(void)tty_set_operations (gs_tty_driver, &gs_tty_ops);for (i=0 ; i <GS_NUM_PORTS ; i++) -sema_init (&gs_open_close_sem[i],1 ); +mutex_init (&gs_open_close_lock[i]); retval =tty_register_driver (gs_tty_driver);if (retval) {
@@ -635,7 +636,7 @@ static int gs_open(struct tty_struct *tty, struct file *file)struct gs_port *port;struct gs_dev *dev;struct gs_buf *buf; -struct semaphore *sem; +struct mutex *mtx;int ret; port_num = tty->index;
@@ -656,10 +657,10 @@ static int gs_open(struct tty_struct *tty, struct file *file)return -ENODEV ; } - sem = &gs_open_close_sem[port_num]; -if (down_interruptible (sem)) { + mtx = &gs_open_close_lock[port_num]; +if (mutex_lock_interruptible (mtx)) {printk (KERN_ERR -"gs_open: (%d,%p,%p) interrupted waiting for semaphore\n" , +"gs_open: (%d,%p,%p) interrupted waiting for mutex\n" , port_num, tty, file);return -ERESTARTSYS ; }
@@ -754,12 +755,12 @@ static int gs_open(struct tty_struct *tty, struct file *file) exit_unlock_port:spin_unlock_irqrestore (&port->port_lock, flags); -up (sem); +mutex_unlock (mtx);return ret; exit_unlock_dev:spin_unlock_irqrestore (&dev->dev_lock, flags); -up (sem); +mutex_unlock (mtx);return ret; }
@@ -781,7 +782,7 @@ exit_unlock_dev:static void gs_close (struct tty_struct *tty,struct file *file) {struct gs_port *port = tty->driver_data; -struct semaphore *sem; +struct mutex *mtx;if (port ==NULL ) {printk (KERN_ERR "gs_close: NULL port pointer\n" );
@@ -790,8 +791,8 @@ static void gs_close(struct tty_struct *tty, struct file *file)gs_debug ("gs_close: (%d,%p,%p)\n" , port->port_num, tty, file); - sem = &gs_open_close_sem[port->port_num]; -down (sem); + mtx = &gs_open_close_lock[port->port_num]; +mutex_lock (mtx);spin_lock_irq (&port->port_lock);
@@ -846,7 +847,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) exit:spin_unlock_irq (&port->port_lock); -up (sem); +mutex_unlock (mtx); }/*
Signature · 11 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
If liberty means anything at all, it means the
right to tell people what they do not want to hear
(George Orwell)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-Re: [PATCH 2/5] use mutex instead of semaphore in the USB gadget serial driver
Quoted 4 lines · Matthias Kaehlcke
The USB gadget serial driver uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
Signed-off-by Matthias Kaehlcke <[email protected]>
ACK (and thanks)
Quoted 114 lines
--
drivers/usb/gadget/serial.c +13
-12@@ -33,6 +33,7 @@#include <linux/device.h> #include <linux/tty.h> #include <linux/tty_flip.h> +#include <linux/mutex.h> #include <asm/byteorder.h> #include <asm/io.h> @@ -258,7 +259,7 @@ static const char *EP_IN_NAME;static const char *EP_OUT_NAME ;static const char *EP_NOTIFY_NAME ; -static struct semaphore gs_open_close_sem[GS_NUM_PORTS ]; +static struct mutex gs_open_close_lock[GS_NUM_PORTS ];static unsigned int read_q_size =GS_DEFAULT_READ_Q_SIZE ;static unsigned int write_q_size =GS_DEFAULT_WRITE_Q_SIZE ;@@ -595,7 +596,7 @@ static int __init gs_module_init(void)tty_set_operations (gs_tty_driver, &gs_tty_ops);for (i=0 ; i <GS_NUM_PORTS ; i++) -sema_init (&gs_open_close_sem[i],1 ); +mutex_init (&gs_open_close_lock[i]); retval =tty_register_driver (gs_tty_driver);if (retval) {@@ -635,7 +636,7 @@ static int gs_open(struct tty_struct *tty, struct file *file)struct gs_port *port;struct gs_dev *dev;struct gs_buf *buf; -struct semaphore *sem; +struct mutex *mtx;int ret; port_num = tty->index;@@ -656,10 +657,10 @@ static int gs_open(struct tty_struct *tty, struct file *file)return -ENODEV ; } - sem = &gs_open_close_sem[port_num]; -if (down_interruptible (sem)) { + mtx = &gs_open_close_lock[port_num]; +if (mutex_lock_interruptible (mtx)) {printk (KERN_ERR -"gs_open: (%d,%p,%p) interrupted waiting for semaphore\n" , +"gs_open: (%d,%p,%p) interrupted waiting for mutex\n" , port_num, tty, file);return -ERESTARTSYS ; }@@ -754,12 +755,12 @@ static int gs_open(struct tty_struct *tty, struct file *file) exit_unlock_port:spin_unlock_irqrestore (&port->port_lock, flags); -up (sem); +mutex_unlock (mtx);return ret; exit_unlock_dev:spin_unlock_irqrestore (&dev->dev_lock, flags); -up (sem); +mutex_unlock (mtx);return ret; }@@ -781,7 +782,7 @@ exit_unlock_dev:static void gs_close (struct tty_struct *tty,struct file *file) {struct gs_port *port = tty->driver_data; -struct semaphore *sem; +struct mutex *mtx;if (port ==NULL ) {printk (KERN_ERR "gs_close: NULL port pointer\n" );@@ -790,8 +791,8 @@ static void gs_close(struct tty_struct *tty, struct file *file)gs_debug ("gs_close: (%d,%p,%p)\n" , port->port_num, tty, file); - sem = &gs_open_close_sem[port->port_num]; -down (sem); + mtx = &gs_open_close_lock[port->port_num]; +mutex_lock (mtx);spin_lock_irq (&port->port_lock);@@ -846,7 +847,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) exit:spin_unlock_irq (&port->port_lock); -up (sem); +mutex_unlock (mtx); }/* Signature · 12 lines
-- Matthias Kaehlcke Linux Application Developer Barcelona If liberty means anything at all, it means the right to tell people what they do not want to hear (George Orwell) .''`. using free software / Debian GNU/Linux | http://debian.org : :' : `. `'` gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-
PATCH 3/5 use mutex instead of semaphore in the ELAN U132 adapter driver
In reply to Matthias KaehlckeThe ELAN U132 adapter driver uses the semaphore u132_module_lock as mutex. Use the mutex API instead of the (binary) semaphore.
--
drivers/usb/host/u132-hcd.c +9 -8
@@ -52,6 +52,7 @@#include <linux/workqueue.h> #include <linux/platform_device.h> #include <linux/pci_ids.h> +#include <linux/mutex.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/system.h>
@@ -83,7 +84,7 @@ static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait);* u132_module_lock exists to protect access to global variables * */ -static struct semaphore u132_module_lock; +static struct mutex u132_module_lock;static int u132_exiting =0 ;static int u132_instances =0 ;static struct list_head u132_static_list;
@@ -258,10 +259,10 @@ static void u132_hcd_delete(struct kref *kref)struct platform_device *pdev = u132->platform_dev;struct usb_hcd *hcd =u132_to_hcd (u132); u132->going +=1 ; -down (&u132_module_lock); +mutex_lock (&u132_module_lock);list_del_init (&u132->u132_list); u132_instances -=1 ; -up (&u132_module_lock); +mutex_unlock (&u132_module_lock);dev_warn (&u132->platform_dev->dev,"FREEING the hcd=%p and thus the u13" "2=%p going=%d pdev=%p\n" , hcd, u132, u132->going, pdev);usb_put_hcd (hcd);
@@ -3111,10 +3112,10 @@ static int __devinit u132_probe(struct platform_device *pdev)int retval =0 ;struct u132 *u132 =hcd_to_u132 (hcd); hcd->rsrc_start =0 ; -down (&u132_module_lock); +mutex_lock (&u132_module_lock);list_add_tail (&u132->u132_list, &u132_static_list); u132->sequence_num = ++u132_instances; -up (&u132_module_lock); +mutex_unlock (&u132_module_lock);u132_u132_init_kref (u132);u132_initialise (u132, pdev); hcd->product_desc ="ELAN U132 Host Controller" ;
@@ -3216,7 +3217,7 @@ static int __init u132_hcd_init(void)INIT_LIST_HEAD (&u132_static_list); u132_instances =0 ; u132_exiting =0 ; -init_MUTEX (&u132_module_lock); +mutex_init (&u132_module_lock);if (usb_disabled ())return -ENODEV ; printk(KERN_INFO "driver %s built at %s on %s\n", hcd_name, __TIME__,
@@ -3232,9 +3233,9 @@ static void __exit u132_hcd_exit(void) {struct u132 *u132;struct u132 *temp; -down (&u132_module_lock); +mutex_lock (&u132_module_lock); u132_exiting +=1 ; -up (&u132_module_lock); +mutex_unlock (&u132_module_lock);list_for_each_entry_safe (u132, temp, &u132_static_list, u132_list) {platform_device_unregister (u132->platform_dev); }platform_driver_unregister (&u132_platform_driver);
Signature · 11 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
The salvation of mankind lies only in making everything the concern of all
(Alexander Solzhenitsyn)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-PATCH 4/5 use mutex instead of semaphore in the Adutux driver
In reply to Matthias KaehlckeThe Adutux driver uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
--
drivers/usb/misc/adutux.c +18 -17
@@ -24,6 +24,7 @@#include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> +#include <linux/mutex.h> #include <asm/uaccess.h> #ifdef CONFIG_USB_DEBUG
@@ -80,7 +81,7 @@ MODULE_DEVICE_TABLE(usb, device_table);/* Structure to hold all of our device specific stuff */ struct adu_device { -struct semaphore sem;/* locks this structure */ +struct mutex mtx;/* locks this structure */ struct usb_device * udev;/* save off the usb device pointer */ struct usb_interface * interface;unsigned char minor;/* the starting minor number for this device */
@@ -269,8 +270,8 @@ static int adu_open(struct inode *inode, struct file *file) }/* lock this device */ -if ((retval =down_interruptible (&dev->sem))) { -dbg (2 ,"%s : sem down failed" , __FUNCTION__); +if ((retval =mutex_lock_interruptible (&dev->mtx))) { +dbg (2 ,"%s : mutex lock failed" , __FUNCTION__); goto exit_no_device; }
@@ -299,7 +300,7 @@ static int adu_open(struct inode *inode, struct file *file)if (retval) --dev->open_count; } -up (&dev->sem); +mutex_unlock (&dev->mtx); exit_no_device:dbg (2 ,"%s : leave, return value %d " , __FUNCTION__, retval);
@@ -347,7 +348,7 @@ static int adu_release(struct inode *inode, struct file *file) }/* lock our device */ -down (&dev->sem);/* not interruptible */ +mutex_lock (&dev->mtx);/* not interruptible */ if (dev->open_count <=0 ) {dbg (1 ," %s : device not opened" , __FUNCTION__);
@@ -357,7 +358,7 @@ static int adu_release(struct inode *inode, struct file *file)if (dev->udev ==NULL ) {/* the device was unplugged before the file was released */ -up (&dev->sem); +mutex_unlock (&dev->mtx);adu_delete (dev); dev =NULL ; }else {
@@ -367,7 +368,7 @@ static int adu_release(struct inode *inode, struct file *file) exit:if (dev) -up (&dev->sem); +mutex_unlock (&dev->mtx);dbg (2 ," %s : leave, return value %d" , __FUNCTION__, retval);return retval; }
@@ -390,7 +391,7 @@ static ssize_t adu_read(struct file *file, __user char *buffer, size_t count, dev = file->private_data;dbg (2 ," %s : dev=%p" , __FUNCTION__, dev);/* lock this object */ -if (down_interruptible (&dev->sem)) +if (mutex_lock_interruptible (&dev->mtx))return -ERESTARTSYS ;/* verify that the device wasn't unplugged */
@@ -522,7 +523,7 @@ static ssize_t adu_read(struct file *file, __user char *buffer, size_t count, exit:/* unlock the device */ -up (&dev->sem); +mutex_unlock (&dev->mtx);dbg (2 ," %s : leave, return value %d" , __FUNCTION__, retval);return retval;
@@ -543,7 +544,7 @@ static ssize_t adu_write(struct file *file, const __user char *buffer, dev = file->private_data;/* lock this object */ - retval =down_interruptible (&dev->sem); + retval =mutex_lock_interruptible (&dev->mtx);if (retval) goto exit_nolock;
@@ -571,9 +572,9 @@ static ssize_t adu_write(struct file *file, const __user char *buffer, retval = -EINTR ; goto exit; } -up (&dev->sem); +mutex_unlock (&dev->mtx); timeout =interruptible_sleep_on_timeout (&dev->write_wait, timeout); - retval =down_interruptible (&dev->sem); + retval =mutex_lock_interruptible (&dev->mtx);if (retval) { retval = bytes_written ? bytes_written : retval; goto exit_nolock;
@@ -638,7 +639,7 @@ static ssize_t adu_write(struct file *file, const __user char *buffer, exit:/* unlock the device */ -up (&dev->sem); +mutex_unlock (&dev->mtx); exit_nolock:dbg (2 ," %s : leave, return value %d" , __FUNCTION__, retval);
@@ -698,7 +699,7 @@ static int adu_probe(struct usb_interface *interface, goto exit; } -init_MUTEX (&dev->sem); +mutex_init (&dev->mtx);spin_lock_init (&dev->buflock); dev->udev = udev;init_waitqueue_head (&dev->read_wait);
@@ -835,16 +836,16 @@ static void adu_disconnect(struct usb_interface *interface)usb_deregister_dev (interface, &adu_class); dev->minor =0 ; -down (&dev->sem);/* not interruptible */ +mutex_lock (&dev->mtx);/* not interruptible */ /* if the device is not opened, then we clean up right now */ dbg (2 ," %s : open count %d" , __FUNCTION__, dev->open_count);if (!dev->open_count) { -up (&dev->sem); +mutex_unlock (&dev->mtx);adu_delete (dev); }else { dev->udev =NULL ; -up (&dev->sem); +mutex_unlock (&dev->mtx); } dev_info(&interface->dev, "ADU device adutux%d now disconnected",
Signature · 10 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
The assumption that what currently exists must necessarily
exist is the acid that corrodes all visionary thinking
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-PATCH 5/5 use mutex instead of semaphore in the FTDI ELAN driver
In reply to Matthias KaehlckeThe FTDI ELAN driver uses a semaphore as mutex. Use the mutex API instead of the (binary) semaphore.
--
drivers/usb/misc/ftdi-elan.c +7 -6
@@ -44,6 +44,7 @@#include <linux/slab.h> #include <linux/module.h> #include <linux/kref.h> +#include <linux/mutex.h> #include <asm/uaccess.h> #include <linux/usb.h> #include <linux/workqueue.h>
@@ -64,7 +65,7 @@ static struct workqueue_struct *respond_queue;* ftdi_module_lock exists to protect access to global variables * */ -static struct semaphore ftdi_module_lock; +static struct mutex ftdi_module_lock;static int ftdi_instances =0 ;static struct list_head ftdi_static_list;/*
@@ -199,10 +200,10 @@ static void ftdi_elan_delete(struct kref *kref)dev_warn (&ftdi->udev->dev,"FREEING ftdi=%p\n" , ftdi);usb_put_dev (ftdi->udev); ftdi->disconnected +=1 ; -down (&ftdi_module_lock); +mutex_lock (&ftdi_module_lock);list_del_init (&ftdi->ftdi_list); ftdi_instances -=1 ; -up (&ftdi_module_lock); +mutex_unlock (&ftdi_module_lock);kfree (ftdi->bulk_in_buffer); ftdi->bulk_in_buffer =NULL ; }
@@ -2780,10 +2781,10 @@ static int ftdi_elan_probe(struct usb_interface *interface,return -ENOMEM ; }memset (ftdi,0x00 ,sizeof (struct usb_ftdi )); -down (&ftdi_module_lock); +mutex_lock (&ftdi_module_lock);list_add_tail (&ftdi->ftdi_list, &ftdi_static_list); ftdi->sequence_num = ++ftdi_instances; -up (&ftdi_module_lock); +mutex_unlock (&ftdi_module_lock);ftdi_elan_init_kref (ftdi);init_MUTEX (&ftdi->sw_lock); ftdi->udev =usb_get_dev (interface_to_usbdev (interface));
@@ -2909,7 +2910,7 @@ static int __init ftdi_elan_init(void)int result;printk (KERN_INFO "driver %s built at %s on %s\n" , ftdi_elan_driver.name, __TIME__, __DATE__); -init_MUTEX (&ftdi_module_lock); +mutex_init (&ftdi_module_lock);INIT_LIST_HEAD (&ftdi_static_list); status_queue =create_singlethread_workqueue ("ftdi-status-control" );if (!status_queue)
Signature · 11 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona
If liberty means anything at all, it means the
right to tell people what they do not want to hear
(George Orwell)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-