Staging: comedi: Use mutex instead of semaphore in usbduxsigma.c
authorKsenija Stanojevic <ksenija.stanojevic@gmail.com>
Fri, 2 Oct 2015 20:04:22 +0000 (22:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Oct 2015 08:32:56 +0000 (09:32 +0100)
Replace binary semaphore with mutex because mutex gives better
performance.
This change is safe because the thread that decrements the value of semaphore
is also the one that increments it, and acts like a mutex where owner of the
lock is the only one that can release the lock.

Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/usbduxsigma.c

index d49147bc27869dc5485e0f8359ad0580d77a3d9c..456e9f13becb828a5da171d318d7cf466d20fa77 100644 (file)
@@ -173,7 +173,7 @@ struct usbduxsigma_private {
        unsigned int ai_interval;
        /* commands */
        u8 *dux_commands;
-       struct semaphore sem;
+       struct mutex mut;
 };
 
 static void usbduxsigma_unlink_urbs(struct urb **urbs, int num_urbs)
@@ -199,10 +199,10 @@ static int usbduxsigma_ai_cancel(struct comedi_device *dev,
 {
        struct usbduxsigma_private *devpriv = dev->private;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        /* unlink only if it is really running */
        usbduxsigma_ai_stop(dev, devpriv->ai_cmd_running);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -325,10 +325,10 @@ static int usbduxsigma_ao_cancel(struct comedi_device *dev,
 {
        struct usbduxsigma_private *devpriv = dev->private;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        /* unlink only if it is really running */
        usbduxsigma_ao_stop(dev, devpriv->ao_cmd_running);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -609,19 +609,19 @@ static int usbduxsigma_ai_inttrig(struct comedi_device *dev,
        if (trig_num != cmd->start_arg)
                return -EINVAL;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        if (!devpriv->ai_cmd_running) {
                devpriv->ai_cmd_running = 1;
                ret = usbduxsigma_submit_urbs(dev, devpriv->ai_urbs,
                                              devpriv->n_ai_urbs, 1);
                if (ret < 0) {
                        devpriv->ai_cmd_running = 0;
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->async->inttrig = NULL;
        }
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 1;
 }
@@ -638,7 +638,7 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,
        int ret;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->high_speed) {
                /*
@@ -673,7 +673,7 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,
 
        ret = usbbuxsigma_send_cmd(dev, USBBUXSIGMA_AD_CMD);
        if (ret < 0) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return ret;
        }
 
@@ -686,7 +686,7 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,
                                              devpriv->n_ai_urbs, 1);
                if (ret < 0) {
                        devpriv->ai_cmd_running = 0;
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->async->inttrig = NULL;
@@ -694,7 +694,7 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,
                s->async->inttrig = usbduxsigma_ai_inttrig;
        }
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -712,9 +712,9 @@ static int usbduxsigma_ai_insn_read(struct comedi_device *dev,
        int ret;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        if (devpriv->ai_cmd_running) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return -EBUSY;
        }
 
@@ -731,7 +731,7 @@ static int usbduxsigma_ai_insn_read(struct comedi_device *dev,
        /* adc commands */
        ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
        if (ret < 0) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return ret;
        }
 
@@ -740,7 +740,7 @@ static int usbduxsigma_ai_insn_read(struct comedi_device *dev,
 
                ret = usbduxsigma_receive_cmd(dev, USBDUXSIGMA_SINGLE_AD_CMD);
                if (ret < 0) {
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
 
@@ -750,7 +750,7 @@ static int usbduxsigma_ai_insn_read(struct comedi_device *dev,
                val &= 0x00ffffff;      /* strip status byte */
                data[i] = comedi_offset_munge(s, val);
        }
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return insn->n;
 }
@@ -763,9 +763,9 @@ static int usbduxsigma_ao_insn_read(struct comedi_device *dev,
        struct usbduxsigma_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        ret = comedi_readback_insn_read(dev, s, insn, data);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -780,9 +780,9 @@ static int usbduxsigma_ao_insn_write(struct comedi_device *dev,
        int ret;
        int i;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        if (devpriv->ao_cmd_running) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return -EBUSY;
        }
 
@@ -792,12 +792,12 @@ static int usbduxsigma_ao_insn_write(struct comedi_device *dev,
                devpriv->dux_commands[3] = chan;        /* channel number */
                ret = usbbuxsigma_send_cmd(dev, USBDUXSIGMA_DA_CMD);
                if (ret < 0) {
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->readback[chan] = data[i];
        }
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return insn->n;
 }
@@ -813,19 +813,19 @@ static int usbduxsigma_ao_inttrig(struct comedi_device *dev,
        if (trig_num != cmd->start_arg)
                return -EINVAL;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        if (!devpriv->ao_cmd_running) {
                devpriv->ao_cmd_running = 1;
                ret = usbduxsigma_submit_urbs(dev, devpriv->ao_urbs,
                                              devpriv->n_ao_urbs, 0);
                if (ret < 0) {
                        devpriv->ao_cmd_running = 0;
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->async->inttrig = NULL;
        }
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 1;
 }
@@ -856,7 +856,7 @@ static int usbduxsigma_ao_cmdtest(struct comedi_device *dev,
        err |= comedi_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE);
 
        if (err) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return 1;
        }
 
@@ -905,7 +905,7 @@ static int usbduxsigma_ao_cmd(struct comedi_device *dev,
        struct comedi_cmd *cmd = &s->async->cmd;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        /*
         * For now, only "scan" timing is supported.  A future version may
@@ -924,7 +924,7 @@ static int usbduxsigma_ao_cmd(struct comedi_device *dev,
                                              devpriv->n_ao_urbs, 0);
                if (ret < 0) {
                        devpriv->ao_cmd_running = 0;
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->async->inttrig = NULL;
@@ -932,7 +932,7 @@ static int usbduxsigma_ao_cmd(struct comedi_device *dev,
                s->async->inttrig = usbduxsigma_ao_inttrig;
        }
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return 0;
 }
@@ -963,7 +963,7 @@ static int usbduxsigma_dio_insn_bits(struct comedi_device *dev,
        struct usbduxsigma_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        comedi_dio_update_state(s, data);
 
@@ -990,7 +990,7 @@ static int usbduxsigma_dio_insn_bits(struct comedi_device *dev,
        ret = insn->n;
 
 done:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
@@ -1462,7 +1462,7 @@ static int usbduxsigma_auto_attach(struct comedi_device *dev,
        if (!devpriv)
                return -ENOMEM;
 
-       sema_init(&devpriv->sem, 1);
+       mutex_init(&devpriv->mut);
 
        usb_set_intfdata(intf, devpriv);
 
@@ -1576,7 +1576,7 @@ static void usbduxsigma_detach(struct comedi_device *dev)
        if (!devpriv)
                return;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        /* force unlink all urbs */
        usbduxsigma_ai_stop(dev, 1);
@@ -1585,7 +1585,7 @@ static void usbduxsigma_detach(struct comedi_device *dev)
 
        usbduxsigma_free_usb_buffers(dev);
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 }
 
 static struct comedi_driver usbduxsigma_driver = {