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>
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 usbduxfast_private *devpriv = dev->private;
int ret;
struct usbduxfast_private *devpriv = dev->private;
int ret;
+ mutex_lock(&devpriv->mut);
ret = usbduxfast_ai_stop(dev, 1);
ret = usbduxfast_ai_stop(dev, 1);
+ mutex_unlock(&devpriv->mut);
if (trig_num != cmd->start_arg)
return -EINVAL;
if (trig_num != cmd->start_arg)
return -EINVAL;
+ mutex_lock(&devpriv->mut);
if (!devpriv->ai_cmd_running) {
devpriv->ai_cmd_running = 1;
if (!devpriv->ai_cmd_running) {
devpriv->ai_cmd_running = 1;
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;
+ 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");
}
+ mutex_unlock(&devpriv->mut);
int j, ret;
long steps, steps_tmp;
int j, ret;
long steps, steps_tmp;
+ mutex_lock(&devpriv->mut);
if (devpriv->ai_cmd_running) {
ret = -EBUSY;
goto cmd_exit;
if (devpriv->ai_cmd_running) {
ret = -EBUSY;
goto cmd_exit;
+ mutex_unlock(&devpriv->mut);
int i, j, n, actual_length;
int ret;
int i, j, n, actual_length;
int ret;
+ 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");
+ mutex_unlock(&devpriv->mut);
ret = usbduxfast_send_cmd(dev, SENDADCOMMANDS);
if (ret < 0) {
ret = usbduxfast_send_cmd(dev, SENDADCOMMANDS);
if (ret < 0) {
+ mutex_unlock(&devpriv->mut);
&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");
+ mutex_unlock(&devpriv->mut);
&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);
+ 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");
+ 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) {
+ mutex_unlock(&devpriv->mut);
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);
+ mutex_lock(&devpriv->mut);
usb_set_intfdata(intf, NULL);
usb_set_intfdata(intf, NULL);
+ mutex_unlock(&devpriv->mut);
}
static struct comedi_driver usbduxfast_driver = {
}
static struct comedi_driver usbduxfast_driver = {