`comedi_is_subdevice_in_error()` is only used by `comedi_read()` and
`comedi_write()` and is only called (soon) after
`comedi_is_subdevice_running()` returns `false` (with extra conditions
in the case of `comedi_write()`).  `comedi_is_subdevice_running()` and
`comedi_get_subdevice_runflags()` both call
`comedi_get_subdevice_runflags()` which uses the subdevice's spin-lock.

Eliminate one use of the subdevice's spin-lock in `comedi_read()` and
`comedi_write()` by calling `comedi_get_subdevice_runflags()` and
checking the runflags directly.  Add a couple of inline functions to
check the runflags: `comedi_is_runflags_running()` and
`comedi_is_runflags_in_error()`.  These do the same test on runflags as
`comedi_is_subdevice_running()` and `comedi_is_subdevice_in_error()` but
get passed the runflags value directly.

`comedi_is_subdevice_in_error()` is no longer used, so remove it.

Signed-off-by: Ian Abbott <abbo...@mev.co.uk>
---
 drivers/staging/comedi/comedi_fops.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/comedi/comedi_fops.c 
b/drivers/staging/comedi/comedi_fops.c
index 2b75b7a1..17ac285 100644
--- a/drivers/staging/comedi/comedi_fops.c
+++ b/drivers/staging/comedi/comedi_fops.c
@@ -623,6 +623,16 @@ static unsigned comedi_get_subdevice_runflags(struct 
comedi_subdevice *s)
        return runflags;
 }
 
+static bool comedi_is_runflags_running(unsigned runflags)
+{
+       return runflags & COMEDI_SRF_RUNNING;
+}
+
+static bool comedi_is_runflags_in_error(unsigned runflags)
+{
+       return runflags & COMEDI_SRF_ERROR;
+}
+
 /**
  * comedi_is_subdevice_running - check if async command running on subdevice
  * @s: comedi_subdevice struct
@@ -634,17 +644,10 @@ bool comedi_is_subdevice_running(struct comedi_subdevice 
*s)
 {
        unsigned runflags = comedi_get_subdevice_runflags(s);
 
-       return (runflags & COMEDI_SRF_RUNNING) ? true : false;
+       return comedi_is_runflags_running(runflags);
 }
 EXPORT_SYMBOL_GPL(comedi_is_subdevice_running);
 
-static bool comedi_is_subdevice_in_error(struct comedi_subdevice *s)
-{
-       unsigned runflags = comedi_get_subdevice_runflags(s);
-
-       return (runflags & COMEDI_SRF_ERROR) ? true : false;
-}
-
 static bool comedi_is_subdevice_idle(struct comedi_subdevice *s)
 {
        unsigned runflags = comedi_get_subdevice_runflags(s);
@@ -2282,13 +2285,16 @@ static ssize_t comedi_write(struct file *file, const 
char __user *buf,
        add_wait_queue(&async->wait_head, &wait);
        on_wait_queue = true;
        while (nbytes > 0 && !retval) {
+               unsigned runflags;
+
                set_current_state(TASK_INTERRUPTIBLE);
 
-               if (!comedi_is_subdevice_running(s)) {
+               runflags = comedi_get_subdevice_runflags(s);
+               if (!comedi_is_runflags_running(runflags)) {
                        if (count == 0) {
                                struct comedi_subdevice *new_s;
 
-                               if (comedi_is_subdevice_in_error(s))
+                               if (comedi_is_runflags_in_error(runflags))
                                        retval = -EPIPE;
                                else
                                        retval = 0;
@@ -2435,8 +2441,10 @@ static ssize_t comedi_read(struct file *file, char 
__user *buf, size_t nbytes,
                        n = m;
 
                if (n == 0) {
-                       if (!comedi_is_subdevice_running(s)) {
-                               if (comedi_is_subdevice_in_error(s))
+                       unsigned runflags = comedi_get_subdevice_runflags(s);
+
+                       if (!comedi_is_runflags_running(runflags)) {
+                               if (comedi_is_runflags_in_error(runflags))
                                        retval = -EPIPE;
                                else
                                        retval = 0;
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to