11. linux 驱动工作队列相关API

不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者不要延时。

需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列。

  • 创建工作队列

每个工作队列有一个专门的线程,所有来自运行队列的任务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。

//创建工作队列
struct workqueue_struct *create_workqueue(const char *name);
  • 创建工作队列的任务

工作队列任务可以在编译时或者运行时创建

//编译是创建
DECLARE_WORK(name, void (*function)(void *), void *data);
//运行时创建
INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
  • 将任务添加到工作队列中
//添加到指定工作队列
int queue_work(struct workqueue_struct *queue, struct work_struct *work);
        <br>
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct
        <br>
*work, unsigned long delay);


//添加到内核默认工作队列
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);

说明

delay: 保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。

  • 队列和任务的清除操作
//取消任务
int cancel_delayed_work(struct work_struct *work);


//清空队列中的所有任务
void flush_workqueue(struct workqueue_struct *queue);


//销毁工作队列
void destroy_workqueue(struct workqueue_struct *queue);

原文地址:https://www.cnblogs.com/standardzero/p/12551116.html