All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Staging: comedi: Use rwsemaphore
@ 2015-10-28  4:23 Ksenija Stanojevic
  2015-10-28  4:46 ` [Outreachy kernel] " Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Ksenija Stanojevic @ 2015-10-28  4:23 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: Ksenija Stanojevic

Functions that use semaphore for locking are divided into read/write
functions, so use locking mechanism that provides similar semantics.

Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
---
 drivers/staging/comedi/drivers/vmk80xx.c | 54 ++++++++++++++++----------------
 1 file changed, 27 insertions(+), 27 deletions(-)

diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c
index 8c7393e..f08976c 100644
--- a/drivers/staging/comedi/drivers/vmk80xx.c
+++ b/drivers/staging/comedi/drivers/vmk80xx.c
@@ -152,7 +152,7 @@ static const struct vmk80xx_board vmk80xx_boardinfo[] = {
 struct vmk80xx_private {
 	struct usb_endpoint_descriptor *ep_rx;
 	struct usb_endpoint_descriptor *ep_tx;
-	struct semaphore limit_sem;
+	struct rw_semaphore limit_sem;
 	unsigned char *usb_rx_buf;
 	unsigned char *usb_tx_buf;
 	enum vmk80xx_model model;
@@ -249,7 +249,7 @@ static int vmk80xx_ai_insn_read(struct comedi_device *dev,
 	int reg[2];
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_read(&devpriv->limit_sem);
 	chan = CR_CHAN(insn->chanspec);
 
 	switch (devpriv->model) {
@@ -282,7 +282,7 @@ static int vmk80xx_ai_insn_read(struct comedi_device *dev,
 		    devpriv->usb_rx_buf[reg[1]];
 	}
 
-	up(&devpriv->limit_sem);
+	up_read(&devpriv->limit_sem);
 
 	return n;
 }
@@ -298,7 +298,7 @@ static int vmk80xx_ao_insn_write(struct comedi_device *dev,
 	int reg;
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 	chan = CR_CHAN(insn->chanspec);
 
 	switch (devpriv->model) {
@@ -323,7 +323,7 @@ static int vmk80xx_ao_insn_write(struct comedi_device *dev,
 			break;
 	}
 
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return n;
 }
@@ -338,7 +338,7 @@ static int vmk80xx_ao_insn_read(struct comedi_device *dev,
 	int reg;
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_read(&devpriv->limit_sem);
 	chan = CR_CHAN(insn->chanspec);
 
 	reg = VMK8061_AO_REG - 1;
@@ -352,7 +352,7 @@ static int vmk80xx_ao_insn_read(struct comedi_device *dev,
 		data[n] = devpriv->usb_rx_buf[reg + chan];
 	}
 
-	up(&devpriv->limit_sem);
+	up_read(&devpriv->limit_sem);
 
 	return n;
 }
@@ -367,7 +367,7 @@ static int vmk80xx_di_insn_bits(struct comedi_device *dev,
 	int reg;
 	int retval;
 
-	down(&devpriv->limit_sem);
+	down_read(&devpriv->limit_sem);
 
 	rx_buf = devpriv->usb_rx_buf;
 
@@ -391,7 +391,7 @@ static int vmk80xx_di_insn_bits(struct comedi_device *dev,
 		retval = 2;
 	}
 
-	up(&devpriv->limit_sem);
+	up_read(&devpriv->limit_sem);
 
 	return retval;
 }
@@ -415,7 +415,7 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev,
 		cmd = VMK8055_CMD_WRT_AD;
 	}
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 
 	if (comedi_dio_update_state(s, data)) {
 		tx_buf[reg] = s->state;
@@ -435,7 +435,7 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev,
 	}
 
 out:
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return ret ? ret : insn->n;
 }
@@ -450,7 +450,7 @@ static int vmk80xx_cnt_insn_read(struct comedi_device *dev,
 	int reg[2];
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_read(&devpriv->limit_sem);
 	chan = CR_CHAN(insn->chanspec);
 
 	switch (devpriv->model) {
@@ -479,7 +479,7 @@ static int vmk80xx_cnt_insn_read(struct comedi_device *dev,
 			    + 256 * devpriv->usb_rx_buf[reg[1] * 2 + 2];
 	}
 
-	up(&devpriv->limit_sem);
+	up_read(&devpriv->limit_sem);
 
 	return n;
 }
@@ -495,7 +495,7 @@ static int vmk80xx_cnt_insn_config(struct comedi_device *dev,
 	int reg;
 	int ret;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 	switch (data[0]) {
 	case INSN_CONFIG_RESET:
 		if (devpriv->model == VMK8055_MODEL) {
@@ -516,7 +516,7 @@ static int vmk80xx_cnt_insn_config(struct comedi_device *dev,
 		ret = -EINVAL;
 		break;
 	}
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return ret ? ret : insn->n;
 }
@@ -533,7 +533,7 @@ static int vmk80xx_cnt_insn_write(struct comedi_device *dev,
 	int cmd;
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 	chan = CR_CHAN(insn->chanspec);
 
 	if (!chan)
@@ -560,7 +560,7 @@ static int vmk80xx_cnt_insn_write(struct comedi_device *dev,
 			break;
 	}
 
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return n;
 }
@@ -576,7 +576,7 @@ static int vmk80xx_pwm_insn_read(struct comedi_device *dev,
 	int reg[2];
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_read(&devpriv->limit_sem);
 
 	tx_buf = devpriv->usb_tx_buf;
 	rx_buf = devpriv->usb_rx_buf;
@@ -593,7 +593,7 @@ static int vmk80xx_pwm_insn_read(struct comedi_device *dev,
 		data[n] = rx_buf[reg[0]] + 4 * rx_buf[reg[1]];
 	}
 
-	up(&devpriv->limit_sem);
+	up_read(&devpriv->limit_sem);
 
 	return n;
 }
@@ -609,7 +609,7 @@ static int vmk80xx_pwm_insn_write(struct comedi_device *dev,
 	int cmd;
 	int n;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 
 	tx_buf = devpriv->usb_tx_buf;
 
@@ -639,7 +639,7 @@ static int vmk80xx_pwm_insn_write(struct comedi_device *dev,
 			break;
 	}
 
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return n;
 }
@@ -707,7 +707,7 @@ static int vmk80xx_init_subdevices(struct comedi_device *dev)
 	int n_subd;
 	int ret;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 
 	if (devpriv->model == VMK8055_MODEL)
 		n_subd = 5;
@@ -715,7 +715,7 @@ static int vmk80xx_init_subdevices(struct comedi_device *dev)
 		n_subd = 6;
 	ret = comedi_alloc_subdevices(dev, n_subd);
 	if (ret) {
-		up(&devpriv->limit_sem);
+		up_write(&devpriv->limit_sem);
 		return ret;
 	}
 
@@ -783,7 +783,7 @@ static int vmk80xx_init_subdevices(struct comedi_device *dev)
 		s->insn_write	= vmk80xx_pwm_insn_write;
 	}
 
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 
 	return 0;
 }
@@ -817,7 +817,7 @@ static int vmk80xx_auto_attach(struct comedi_device *dev,
 	if (ret)
 		return ret;
 
-	sema_init(&devpriv->limit_sem, 8);
+	init_rwsem(&devpriv->limit_sem);
 
 	usb_set_intfdata(intf, devpriv);
 
@@ -835,14 +835,14 @@ static void vmk80xx_detach(struct comedi_device *dev)
 	if (!devpriv)
 		return;
 
-	down(&devpriv->limit_sem);
+	down_write(&devpriv->limit_sem);
 
 	usb_set_intfdata(intf, NULL);
 
 	kfree(devpriv->usb_rx_buf);
 	kfree(devpriv->usb_tx_buf);
 
-	up(&devpriv->limit_sem);
+	up_write(&devpriv->limit_sem);
 }
 
 static struct comedi_driver vmk80xx_driver = {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Outreachy kernel] [PATCH] Staging: comedi: Use rwsemaphore
  2015-10-28  4:23 [PATCH] Staging: comedi: Use rwsemaphore Ksenija Stanojevic
@ 2015-10-28  4:46 ` Greg KH
  2015-10-29 22:20   ` Arnd Bergmann
  0 siblings, 1 reply; 4+ messages in thread
From: Greg KH @ 2015-10-28  4:46 UTC (permalink / raw)
  To: Ksenija Stanojevic; +Cc: outreachy-kernel

On Tue, Oct 27, 2015 at 09:23:16PM -0700, Ksenija Stanojevic wrote:
> Functions that use semaphore for locking are divided into read/write
> functions, so use locking mechanism that provides similar semantics.
> 
> Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>

Unless you can measure the speed differences by switching to such a
lock, never switch to such a lock as they are much more complex and can
actually cause things to go _slower_.

So I can't take this patch unless you have measureable benchmark
numbers.

thanks,

greg k-h


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Outreachy kernel] [PATCH] Staging: comedi: Use rwsemaphore
  2015-10-28  4:46 ` [Outreachy kernel] " Greg KH
@ 2015-10-29 22:20   ` Arnd Bergmann
  2015-10-29 22:33     ` Greg KH
  0 siblings, 1 reply; 4+ messages in thread
From: Arnd Bergmann @ 2015-10-29 22:20 UTC (permalink / raw)
  To: outreachy-kernel; +Cc: Greg KH, Ksenija Stanojevic

On Wednesday 28 October 2015 13:46:25 Greg KH wrote:
> On Tue, Oct 27, 2015 at 09:23:16PM -0700, Ksenija Stanojevic wrote:
> > Functions that use semaphore for locking are divided into read/write
> > functions, so use locking mechanism that provides similar semantics.
> > 
> > Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
> 
> Unless you can measure the speed differences by switching to such a
> lock, never switch to such a lock as they are much more complex and can
> actually cause things to go _slower_.
> 
> So I can't take this patch unless you have measureable benchmark
> numbers.
> 

Agreed. However, changing this driver to use 'struct mutex' would
be an obvious improvement and should be safe as far as I can tell.

	Arnd


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Outreachy kernel] [PATCH] Staging: comedi: Use rwsemaphore
  2015-10-29 22:20   ` Arnd Bergmann
@ 2015-10-29 22:33     ` Greg KH
  0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2015-10-29 22:33 UTC (permalink / raw)
  To: Arnd Bergmann; +Cc: outreachy-kernel, Ksenija Stanojevic

On Thu, Oct 29, 2015 at 11:20:46PM +0100, Arnd Bergmann wrote:
> On Wednesday 28 October 2015 13:46:25 Greg KH wrote:
> > On Tue, Oct 27, 2015 at 09:23:16PM -0700, Ksenija Stanojevic wrote:
> > > Functions that use semaphore for locking are divided into read/write
> > > functions, so use locking mechanism that provides similar semantics.
> > > 
> > > Signed-off-by: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
> > 
> > Unless you can measure the speed differences by switching to such a
> > lock, never switch to such a lock as they are much more complex and can
> > actually cause things to go _slower_.
> > 
> > So I can't take this patch unless you have measureable benchmark
> > numbers.
> > 
> 
> Agreed. However, changing this driver to use 'struct mutex' would
> be an obvious improvement and should be safe as far as I can tell.

Yes, that's fine to do.

greg k-h


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-10-29 22:34 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-28  4:23 [PATCH] Staging: comedi: Use rwsemaphore Ksenija Stanojevic
2015-10-28  4:46 ` [Outreachy kernel] " Greg KH
2015-10-29 22:20   ` Arnd Bergmann
2015-10-29 22:33     ` Greg KH

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.