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);
}
}
}