Skip to main content

Bonus

Use a Task to schedule a power off after a certain amount of time defined in a module parameter. Use a workqueue.

/// Stores all the possible tasks (Work)
#[pin_data]
struct DeferredWork {
module: &'static ThisModule,
#[pin]
work: Work<DeferredWork>,
}

/// Initializes the possible tasks
impl DeferredWork {
fn new(module: &'static ThisModule) -> Result<Arc<DeferredWork>> {
Arc::pin_init(
pin_init!(DeferredWork {
module,
work <- new_work!("DeferredWork::work"),
}),
GFP_KERNEL,
)
}
}

/// Must be implemented
impl_has_work! {
impl HasWork<Self> for DeferredWork { self.work }
}

/// Implement the task
impl WorkItem for DeferredWork {
type Pointer = Arc<DeferredWork>;

fn run(_this: Self::Pointer) {
// ...
}
}

/// Setup the work
fn setup_work() {
match DeferredWork::new(module) {
Ok(work) => {
let _ = workqueue::system().enqueue(work);
}
Err(err) => {
pr_warn!("Failed to setup work: {:?}", err);
}
}
}