Staging: comedi: Use mutex instead of semaphore in usbduxfast.c
authorKsenija Stanojevic <ksenija.stanojevic@gmail.com>
Fri, 2 Oct 2015 20:07:54 +0000 (22:07 +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/usbduxfast.c

index c6b2a65821271384f9e9d7d1ac5eabdcd86278a4..10f94ec345360681ec11316d5fda6c48581afde8 100644 (file)
@@ -160,7 +160,7 @@ struct usbduxfast_private {
        s8 *inbuf;
        short int ai_cmd_running;       /* asynchronous command is running */
        int ignore;             /* counter which ignores the first buffers */
        s8 *inbuf;
        short int ai_cmd_running;       /* asynchronous command is running */
        int ignore;             /* counter which ignores the first buffers */
-       struct semaphore sem;
+       struct mutex mut;
 };
 
 /*
 };
 
 /*
@@ -221,9 +221,9 @@ static int usbduxfast_ai_cancel(struct comedi_device *dev,
        struct usbduxfast_private *devpriv = dev->private;
        int ret;
 
        struct usbduxfast_private *devpriv = dev->private;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        ret = usbduxfast_ai_stop(dev, 1);
        ret = usbduxfast_ai_stop(dev, 1);
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
 
        return ret;
 }
@@ -444,7 +444,7 @@ static int usbduxfast_ai_inttrig(struct comedi_device *dev,
        if (trig_num != cmd->start_arg)
                return -EINVAL;
 
        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;
 
        if (!devpriv->ai_cmd_running) {
                devpriv->ai_cmd_running = 1;
@@ -452,14 +452,14 @@ static int usbduxfast_ai_inttrig(struct comedi_device *dev,
                if (ret < 0) {
                        dev_err(dev->class_dev, "urbSubmit: err=%d\n", ret);
                        devpriv->ai_cmd_running = 0;
                if (ret < 0) {
                        dev_err(dev->class_dev, "urbSubmit: err=%d\n", ret);
                        devpriv->ai_cmd_running = 0;
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                s->async->inttrig = NULL;
        } else {
                dev_err(dev->class_dev, "ai is already running\n");
        }
                        return ret;
                }
                s->async->inttrig = NULL;
        } else {
                dev_err(dev->class_dev, "ai is already running\n");
        }
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
        return 1;
 }
 
        return 1;
 }
 
@@ -472,7 +472,7 @@ static int usbduxfast_ai_cmd(struct comedi_device *dev,
        int j, ret;
        long steps, steps_tmp;
 
        int j, ret;
        long steps, steps_tmp;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
        if (devpriv->ai_cmd_running) {
                ret = -EBUSY;
                goto cmd_exit;
        if (devpriv->ai_cmd_running) {
                ret = -EBUSY;
                goto cmd_exit;
@@ -751,7 +751,7 @@ static int usbduxfast_ai_cmd(struct comedi_device *dev,
        }
 
 cmd_exit:
        }
 
 cmd_exit:
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return ret;
 }
 
        return ret;
 }
@@ -772,12 +772,12 @@ static int usbduxfast_ai_insn_read(struct comedi_device *dev,
        int i, j, n, actual_length;
        int ret;
 
        int i, j, n, actual_length;
        int ret;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        if (devpriv->ai_cmd_running) {
                dev_err(dev->class_dev,
                        "ai_insn_read not possible, async cmd is running\n");
 
        if (devpriv->ai_cmd_running) {
                dev_err(dev->class_dev,
                        "ai_insn_read not possible, async cmd is running\n");
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return -EBUSY;
        }
 
                return -EBUSY;
        }
 
@@ -799,7 +799,7 @@ static int usbduxfast_ai_insn_read(struct comedi_device *dev,
 
        ret = usbduxfast_send_cmd(dev, SENDADCOMMANDS);
        if (ret < 0) {
 
        ret = usbduxfast_send_cmd(dev, SENDADCOMMANDS);
        if (ret < 0) {
-               up(&devpriv->sem);
+               mutex_unlock(&devpriv->mut);
                return ret;
        }
 
                return ret;
        }
 
@@ -809,7 +809,7 @@ static int usbduxfast_ai_insn_read(struct comedi_device *dev,
                                   &actual_length, 10000);
                if (ret < 0) {
                        dev_err(dev->class_dev, "insn timeout, no data\n");
                                   &actual_length, 10000);
                if (ret < 0) {
                        dev_err(dev->class_dev, "insn timeout, no data\n");
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
        }
                        return ret;
                }
        }
@@ -820,13 +820,13 @@ static int usbduxfast_ai_insn_read(struct comedi_device *dev,
                                   &actual_length, 10000);
                if (ret < 0) {
                        dev_err(dev->class_dev, "insn data error: %d\n", ret);
                                   &actual_length, 10000);
                if (ret < 0) {
                        dev_err(dev->class_dev, "insn data error: %d\n", ret);
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return ret;
                }
                n = actual_length / sizeof(u16);
                if ((n % 16) != 0) {
                        dev_err(dev->class_dev, "insn data packet corrupted\n");
                        return ret;
                }
                n = actual_length / sizeof(u16);
                if ((n % 16) != 0) {
                        dev_err(dev->class_dev, "insn data packet corrupted\n");
-                       up(&devpriv->sem);
+                       mutex_unlock(&devpriv->mut);
                        return -EINVAL;
                }
                for (j = chan; (j < n) && (i < insn->n); j = j + 16) {
                        return -EINVAL;
                }
                for (j = chan; (j < n) && (i < insn->n); j = j + 16) {
@@ -835,7 +835,7 @@ static int usbduxfast_ai_insn_read(struct comedi_device *dev,
                }
        }
 
                }
        }
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 
        return insn->n;
 }
 
        return insn->n;
 }
@@ -930,7 +930,7 @@ static int usbduxfast_auto_attach(struct comedi_device *dev,
        if (!devpriv)
                return -ENOMEM;
 
        if (!devpriv)
                return -ENOMEM;
 
-       sema_init(&devpriv->sem, 1);
+       mutex_init(&devpriv->mut);
        usb_set_intfdata(intf, devpriv);
 
        devpriv->duxbuf = kmalloc(SIZEOFDUXBUF, GFP_KERNEL);
        usb_set_intfdata(intf, devpriv);
 
        devpriv->duxbuf = kmalloc(SIZEOFDUXBUF, GFP_KERNEL);
@@ -989,7 +989,7 @@ static void usbduxfast_detach(struct comedi_device *dev)
        if (!devpriv)
                return;
 
        if (!devpriv)
                return;
 
-       down(&devpriv->sem);
+       mutex_lock(&devpriv->mut);
 
        usb_set_intfdata(intf, NULL);
 
 
        usb_set_intfdata(intf, NULL);
 
@@ -1003,7 +1003,7 @@ static void usbduxfast_detach(struct comedi_device *dev)
 
        kfree(devpriv->duxbuf);
 
 
        kfree(devpriv->duxbuf);
 
-       up(&devpriv->sem);
+       mutex_unlock(&devpriv->mut);
 }
 
 static struct comedi_driver usbduxfast_driver = {
 }
 
 static struct comedi_driver usbduxfast_driver = {
This page took 0.029584 seconds and 5 git commands to generate.