Skip to content
  • Ian Abbott's avatar
    ef4b4b27
    staging: comedi: comedi_fops: extend spin-lock scope in comedi_event() · ef4b4b27
    Ian Abbott authored
    
    
    `comedi_event()` is called from low-level drivers to handle comedi
    asynchronous command event flags.  As a safety check, it checks the
    subdevice's "run" flags to make sure an asynchronous command is running.
    It can also change the run flags to mark the command as no longer
    running (possibly also marking it as terminated with an error).
    Checking the runflags and modifying them involves two uses of the
    subdevice's spin-lock.  It seems better to do it with a single use of
    the spin-lock.  This also avoids possible interactions with
    `do_become_nonbusy()`.
    
    Acquire the subdevice's spin-lock at the start of `comedi_event()` and
    release it near the end, before a possible call to `kill_fasync()` (but
    after it's parameter values have been determined).
    
    Add and make use of few new inline helper functions:
    
    * `__comedi_clear_subdevice_runflags()` -- clears some run flags without
      using the spin-lock
    * `__comedi_set_subdevice_runflags()` -- sets some run flags without
      using the spin-lock
    * `__comedi_get_subdevice_runflags()` -- a spin-lockless version of
      `comedi_get_subdevice_runflags()
    * `__comedi_is_subdevice_running()` -- a spin-lockless version of
    * `comedi_is_subdevice_running()`
    
    Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ef4b4b27
    staging: comedi: comedi_fops: extend spin-lock scope in comedi_event()
    Ian Abbott authored
    
    
    `comedi_event()` is called from low-level drivers to handle comedi
    asynchronous command event flags.  As a safety check, it checks the
    subdevice's "run" flags to make sure an asynchronous command is running.
    It can also change the run flags to mark the command as no longer
    running (possibly also marking it as terminated with an error).
    Checking the runflags and modifying them involves two uses of the
    subdevice's spin-lock.  It seems better to do it with a single use of
    the spin-lock.  This also avoids possible interactions with
    `do_become_nonbusy()`.
    
    Acquire the subdevice's spin-lock at the start of `comedi_event()` and
    release it near the end, before a possible call to `kill_fasync()` (but
    after it's parameter values have been determined).
    
    Add and make use of few new inline helper functions:
    
    * `__comedi_clear_subdevice_runflags()` -- clears some run flags without
      using the spin-lock
    * `__comedi_set_subdevice_runflags()` -- sets some run flags without
      using the spin-lock
    * `__comedi_get_subdevice_runflags()` -- a spin-lockless version of
      `comedi_get_subdevice_runflags()
    * `__comedi_is_subdevice_running()` -- a spin-lockless version of
    * `comedi_is_subdevice_running()`
    
    Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Loading