Skip to content
Snippets Groups Projects
  1. Jan 21, 2013
  2. Jan 17, 2013
  3. Jan 10, 2013
    • Alessandro Rubini's avatar
      bugfix for buffer change (long standing race condition) · 2672b21a
      Alessandro Rubini authored
      
      When the current buffer is changed, there should be no
      users on the channels (otherwise, either a user block
      is being produced/consumed or there's somebody sleeping
      on the wq of the buffer instance).
      
      This prevents changing the buffer if in use, and prevents
      users from opening a channel if the buffer is being changed.
      We use the "disabled" flag for the buffer, not used so far.
      
      We noticed this while working on buffer changes (see previous
      commit). I'm unable to backport this to the proper place in the
      history because it relies on the new locking introduced by this branch.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      2672b21a
    • Alessandro Rubini's avatar
      bugfix for buffer change (bug exposed by this branch) · fb91b7ac
      Alessandro Rubini authored
      
      I'm unable to backport this commit to the proper place (too many
      conflicts). Anyways, this fixes an issue related to changing the
      buffer type (nothing bad happens if you don't change buffer type).
      
      The bug is exposed by the self-timed csets: when a buffer type is
      being changed, the trigger may be armed. This means that a block is
      being used by the device, but the hosting buffer instance is being
      destroyed.
      
      This commit aborts a trigger and keeps it disabled while the buffer
      is being changed. Re-enabling later, unless it was already disabled.
      
      Even without self-timed support there was a tiny window for the race
      to appear. Now it's fixed forever.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      fb91b7ac
    • Alessandro Rubini's avatar
      core and triggers: a trigger should start disabled · 740978cf
      Alessandro Rubini authored
      
      If the trigger is enabled on creation, it may fire before the cset is
      ready.  This happened to me with "modprobe zio-zero trigger=irq".
      For this reason it must start disabled. Also, the create
      method MUST set ti->cset before activating the trigger, because the
      cset lock is needed to access the enable/disable flag.
      
      The commit adds a WARN() if the field is not set after creation, then
      it leaves it zeroed to ensure the system will crash, instead of having
      a subtle race.
      
      Also, add a pair of FIXME notes about the need to allow changing
      a trigger type while leaving the new one disabled.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      740978cf
    • Alessandro Rubini's avatar
      core and doc: fix: the cset spinlock must be called in irqsave mode · 1962a288
      Alessandro Rubini authored
      
      This is a bug fix for overlooks in this same series of commits. I
      won't fix each lock when it is introduced before proposing for master,
      because it takes too much time.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      1962a288
    • Alessandro Rubini's avatar
      core: accept zero-size time csets · 27d0a81a
      Alessandro Rubini authored
      
      This commit allows zero-size channels to exist. The feature is used
      for TDC and DTC (time to digital converters and the opposite).  This
      simple change in the core allows to implement TDC drivers that only
      return the control (which includes a time stamp) and no data.
      
      For DTC to work we need some modification to chardev.c, which are not
      there yet.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      27d0a81a
    • Alessandro Rubini's avatar
      core: support self-timed peripherals · 0f53986f
      Alessandro Rubini authored
      
      This small patch supports self-timed input csets (for example, a TDC)
      by ensuring the input trigger is always armed, waiting for the device.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      0f53986f
    • Alessandro Rubini's avatar
      core: change some internals for triggers · a496ca04
      Alessandro Rubini authored
      
      This is the first step of a series of changes aimed at a cleaner and
      more flexible management of triggers, as well as a really transparent
      "user" trigger.
      
      This commit does the following:
      
      - zio_fire_trigger renamed to zio_arm_trigger: the trigger is
      actually armed by software, and then it fires by hardware. This
      distinction is especially important for the transparent trigger: when
      devices have internal timing, the software trigger must arm it
      immediately (as opposed to the dumb devices, where the software trigger
      really causes I/O to happen).
      
      - ZIO_TI_BUSY renamed to ZIO_TI_ARMED. Also, ZIO_TI_COMPLETING is
      removed. The new, simplified policy is like this: the trigger is armed
      by software (the trigger module), but completion is driven by hardware
      (the device module).  There is no need for a COMPLETING flag, because
      the ARMED flag is only cleared after data_done is over for all channels
      in the cset.
      
      - the cset spinlock is used to protect all changes of the ti flags.
      
      - change_current_trigger completely revised and fixed to match new
      conventions.
      
      - trigger->abort now takes "ti" instead of "cset" as argument; it is
      more natural do do so, and no current trigger implements abort so no
      harm is done.
      
      - the trigger->abort and trigger->change_status methods are now
      always called while holding the cset spinlock. ZIO core calls abort
      when changing the current trigger type, to ensure no pending blocks
      are there.
      
      - zio_trigger_abort is renamed to zio_trigger_abort_disable, with
      an additional argument to state whether the trigger must be atomically
      disabled after the abort is over. This avoids a race condition on
      trigger removal. It returns the previous "disabled" bit, to be used
      when changing a buffer type while preserving trigger status.
      
      - minor unrelated improvements in error management in objects.c.
      
      - documentation update to match the new locking, and a few typos fixed.
      
      Signed-off-by: default avatarAlessandro Rubini <rubini@gnudd.com>
      Acked-by: default avatarFederico Vaga <federico.vaga@gmail.com>
      a496ca04
  4. Jan 08, 2013
  5. Nov 25, 2012
  6. Nov 24, 2012