Skip to main content

ThreadedRegistration

Struct ThreadedRegistration 

Source
pub struct ThreadedRegistration<'a, T: ThreadedHandler> { /* private fields */ }
Expand description

A registration of a threaded IRQ handler for a given IRQ line.

Two callbacks are required: one to handle the IRQ, and one to handle any other work in a separate thread.

The thread handler is only called if the IRQ handler returns ThreadedIrqReturn::WakeThread.

§Examples

The following is an example of using ThreadedRegistration. It uses a Mutex to provide interior mutability.

use core::pin::Pin;
use kernel::{
    irq::{
        self,
        Flags,
        IrqRequest,
        IrqReturn,
        ThreadedHandler,
        ThreadedIrqReturn,
        ThreadedRegistration,
    },
    prelude::*,
    sync::Mutex,
};

// Declare a struct that will be passed in when the interrupt fires. The u32
// merely serves as an example of some internal data.
//
// [`irq::ThreadedHandler::handle`] takes `&self`. This example
// illustrates how interior mutability can be used when sharing the data
// between process context and IRQ context.
#[pin_data]
struct Data {
    #[pin]
    value: Mutex<u32>,
}

impl ThreadedHandler for Data {
    // This will run (in a separate kthread) if and only if
    // [`ThreadedHandler::handle`] returns [`WakeThread`], which it does by
    // default.
    fn handle_threaded(&self) -> IrqReturn {
        let mut data = self.value.lock();
        *data += 1;
        IrqReturn::Handled
    }
}

// Registers a threaded IRQ handler for the given [`IrqRequest`].
//
// This is executing in process context and assumes that `request` was
// previously acquired from a device.
fn register_threaded_irq(
    request: IrqRequest<'_>,
) -> Result<Pin<KBox<ThreadedRegistration<'_, Data>>>> {
    // SAFETY: The returned Registration is not leaked.
    let registration = unsafe {
        ThreadedRegistration::new(
            request,
            Flags::SHARED,
            c"my_device",
            try_pin_init!(Data {
                value <- kernel::new_mutex!(0),
            }? Error),
        )
    };

    let registration = KBox::pin_init(registration, GFP_KERNEL)?;

    {
        // The data can be accessed from process context too.
        let mut data = registration.handler().value.lock();
        *data += 1;
    }

    Ok(registration)
}

§Invariants

  • We own an irq handler registered via request_threaded_irq whose cookie is a pointer to Self.

Implementations§

Source§

impl<'a, T: ThreadedHandler> ThreadedRegistration<'a, T>

Source

pub fn project<'__pin>( self: Pin<&'__pin mut Self>, ) -> ThreadedRegistrationProjection<'__pin, 'a, T>

Pin-projects all fields of Self.

These fields are structurally pinned:

  • handler
  • _pin

These fields are not structurally pinned:

  • request
Source§

impl<'a, T: ThreadedHandler> ThreadedRegistration<'a, T>

Source

pub unsafe fn new( request: IrqRequest<'a>, flags: Flags, name: &'static CStr, handler: impl PinInit<T, Error> + 'a, ) -> impl PinInit<Self, Error> + 'a
where T: 'a,

Registers the IRQ handler with the system for the given IRQ number.

§Safety

Callers must not mem::forget() the returned ThreadedRegistration or otherwise prevent its Drop implementation from running.

Source

pub fn handler(&self) -> &T

Returns a reference to the handler that was registered with the system.

Source

pub fn synchronize(&self)

Wait for pending IRQ handlers on other CPUs.

Trait Implementations§

Source§

impl<'a, T: ThreadedHandler> Drop for ThreadedRegistration<'a, T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
Source§

impl<'a, T: ThreadedHandler> HasPinData for ThreadedRegistration<'a, T>

Source§

type PinData = __ThePinData<'a, T>

Source§

unsafe fn __pin_data() -> Self::PinData

Source§

impl<T: ThreadedHandler> PinnedDrop for ThreadedRegistration<'_, T>

Source§

fn drop(self: Pin<&mut Self>, _: OnlyCallFromDrop)

Executes the pinned destructor of this type. Read more

Auto Trait Implementations§

§

impl<'a, T> !RefUnwindSafe for ThreadedRegistration<'a, T>

§

impl<'a, T> !UnsafeUnpin for ThreadedRegistration<'a, T>

§

impl<'a, T> !UnwindSafe for ThreadedRegistration<'a, T>

§

impl<'a, T> Freeze for ThreadedRegistration<'a, T>
where T: Freeze,

§

impl<'a, T> Send for ThreadedRegistration<'a, T>
where T: Send,

§

impl<'a, T> Sync for ThreadedRegistration<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Init<T> for T

Source§

fn chain<F>(self, f: F) -> ChainInit<Self, F, T, E>
where F: FnOnce(&mut T) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> KnownSize for T

Source§

const MIN_SIZE: usize = const MIN_SIZE: usize = size_of::<T>();

Minimum size of this type known at compile-time.
Source§

const MIN_ALIGN: Alignment = const MIN_ALIGN: Alignment = Alignment::of::<T>();

Minimum alignment of this type known at compile-time.
Source§

fn size(_: *const T) -> usize

Get the size of an object of this type in bytes, with the metadata of the given pointer.
Source§

impl<T> PinInit<T> for T

Source§

unsafe fn __init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>
where F: FnOnce(Pin<&mut T>) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U, const N: u32> TryIntoBounded<T, N> for U
where T: Integer, U: TryInto<T>,

Source§

fn try_into_bounded(self) -> Option<Bounded<T, N>>

Attempts to convert self into a Bounded using N bits. Read more