workqueue是一种中断的下半部机制,其可以提供一个进程上下文来推迟工作。
主要有两种使用方法,一种是使用系统默认提供的workqueue,即system_wq
其使用的方法如下:
if (remove) {
INIT_WORK(&entry->delete_netdev, delete_netdev);
schedule_work(&entry->delete_netdev);
}
从schedule_work的源码可以看出是使用的system_wq
static inline bool schedule_work(struct work_struct *work)
{
return queue_work(system_wq, work);
}
通过cancel_work_sync()来取消一个workqueue
在int __init workqueue_init_early(void)中有申请system_wq和system_highpri_wq
而每个cpu都有这两个workqueue,所以percpu定义如下:
static DEFINE_PER_CPU_SHARED_ALIGNED(struct worker_pool [NR_STD_WORKER_POOLS], cpu_worker_pools);
除了提供INIT_WORK外,其他使用system_wq的函数为INIT_DELAYED_WORK,INIT_DEFERRABLE_WORK
第二种是自己通过alloc_workqueue()来自己创建一个workqueue.
例如:创建一个自己的workqueue
iommu_wq = alloc_workqueue("amd_iommu_v2", WQ_MEM_RECLAIM, 0);
if (iommu_wq == NULL)
goto out;
flush queue:
flush_workqueue(iommu_wq);
运行这个queue
queue_work(iommu_wq, &fault->work);
销毁queue
destroy_workqueue(iommu_wq);
workqueue使用小结
最新推荐文章于 2024-07-19 15:34:26 发布