Skip to content
Snippets Groups Projects
  • Lyude Paul's avatar
    2da7113b
    rust: Introduce irq module · 2da7113b
    Lyude Paul authored
    
    This introduces a module for dealing with interrupt-disabled contexts,
    including the ability to enable and disable interrupts
    (with_irqs_disabled()) - along with the ability to annotate functions as
    expecting that IRQs are already disabled on the local CPU.
    
    Signed-off-by: Lyude Paul's avatarLyude Paul <lyude@redhat.com>
    Reviewed-by: default avatarBenno Lossin <benno.lossin@proton.me>
    Reviewed-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
    Reviewed-by: default avatarGary Guo <gary@garyguo.net>
    
    ---
    
    V2:
    * Actually make it so that we check whether or not we have interrupts
      disabled with debug assertions
    * Fix issues in the documentation (added suggestions, missing periods, made
      sure that all rustdoc examples compile properly)
    * Pass IrqDisabled by value, not reference
    * Ensure that IrqDisabled is !Send and !Sync using
      PhantomData<(&'a (), *mut ())>
    * Add all of the suggested derives from Benno Lossin
    
    V3:
    * Use `impl` for FnOnce bounds in with_irqs_disabled()
    * Use higher-ranked trait bounds for the lifetime of with_irqs_disabled()
    * Wording changes in the documentation for the module itself
    
    V4:
    * Use the actual unsafe constructor for IrqDisabled in
      with_irqs_disabled()
    * Fix comment style in with_irqs_disabled example
    * Check before calling local_irq_restore() in with_irqs_disabled that
      interrupts are still disabled. It would have been nice to do this from a
      Drop implementation like I hoped, but I realized rust doesn't allow that
      for types that implement Copy.
    * Document that interrupts can't be re-enabled within the `cb` provided to
      `with_irqs_disabled`, and link to the github issue I just filed about
      this that describes the solution for this.
    
    V5:
    * Rebase against rust-next for the helpers split
    * Fix typo (enabled -> disabled) - Dirk
    
    V6:
    * s/indicate/require/ in IrqDisabled docs
    * Reword comment above with_irqs_disabled in code example requested by
      Benno
    * Add paragraph to with_irqs_disabled docs requested by Benno
    * Apply the comments from Boqun's review for V4 that I missed
    * Document type invariants of `IrqDisabled`
    
    This patch depends on
    https://lore.kernel.org/rust-for-linux/ZuKNszXSw-LbgW1e@boqun-archlinux/
    2da7113b
    History
    rust: Introduce irq module
    Lyude Paul authored
    
    This introduces a module for dealing with interrupt-disabled contexts,
    including the ability to enable and disable interrupts
    (with_irqs_disabled()) - along with the ability to annotate functions as
    expecting that IRQs are already disabled on the local CPU.
    
    Signed-off-by: Lyude Paul's avatarLyude Paul <lyude@redhat.com>
    Reviewed-by: default avatarBenno Lossin <benno.lossin@proton.me>
    Reviewed-by: default avatarDaniel Almeida <daniel.almeida@collabora.com>
    Reviewed-by: default avatarGary Guo <gary@garyguo.net>
    
    ---
    
    V2:
    * Actually make it so that we check whether or not we have interrupts
      disabled with debug assertions
    * Fix issues in the documentation (added suggestions, missing periods, made
      sure that all rustdoc examples compile properly)
    * Pass IrqDisabled by value, not reference
    * Ensure that IrqDisabled is !Send and !Sync using
      PhantomData<(&'a (), *mut ())>
    * Add all of the suggested derives from Benno Lossin
    
    V3:
    * Use `impl` for FnOnce bounds in with_irqs_disabled()
    * Use higher-ranked trait bounds for the lifetime of with_irqs_disabled()
    * Wording changes in the documentation for the module itself
    
    V4:
    * Use the actual unsafe constructor for IrqDisabled in
      with_irqs_disabled()
    * Fix comment style in with_irqs_disabled example
    * Check before calling local_irq_restore() in with_irqs_disabled that
      interrupts are still disabled. It would have been nice to do this from a
      Drop implementation like I hoped, but I realized rust doesn't allow that
      for types that implement Copy.
    * Document that interrupts can't be re-enabled within the `cb` provided to
      `with_irqs_disabled`, and link to the github issue I just filed about
      this that describes the solution for this.
    
    V5:
    * Rebase against rust-next for the helpers split
    * Fix typo (enabled -> disabled) - Dirk
    
    V6:
    * s/indicate/require/ in IrqDisabled docs
    * Reword comment above with_irqs_disabled in code example requested by
      Benno
    * Add paragraph to with_irqs_disabled docs requested by Benno
    * Apply the comments from Boqun's review for V4 that I missed
    * Document type invariants of `IrqDisabled`
    
    This patch depends on
    https://lore.kernel.org/rust-for-linux/ZuKNszXSw-LbgW1e@boqun-archlinux/