diff options
author | Ian Abbott | 2015-03-27 16:13:01 +0100 |
---|---|---|
committer | Greg Kroah-Hartman | 2015-04-03 13:11:53 +0200 |
commit | b183a836fe02a59c2b55273655196ba288f3adb7 (patch) | |
tree | 2e28d77dabde4062feaebb605b5c235c05000cb3 /drivers/staging/comedi/comedi_fops.c | |
parent | staging: comedi: comedi_fops: rename comedi_set_subdevice_runflags() (diff) | |
download | kernel-qcow2-linux-b183a836fe02a59c2b55273655196ba288f3adb7.tar.gz kernel-qcow2-linux-b183a836fe02a59c2b55273655196ba288f3adb7.tar.xz kernel-qcow2-linux-b183a836fe02a59c2b55273655196ba288f3adb7.zip |
staging: comedi: comedi_fops: eliminate a use of subdevice spin-lock
`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 <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/comedi_fops.c')
-rw-r--r-- | drivers/staging/comedi/comedi_fops.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index 2b75b7a1cee0..17ac2858205d 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; |