notify通知链机制

notifier是一种异步通信机制,比如模块A对事件E感兴趣,但事件E是由模块B产生的,则A可通过通知链机制从B获取事件E。

notifier结构体在文件kernel\include\linux\notifier.h中声明:
notify通知链机制
1. notifier回调函数声明, action即为发生的事件,data为携带的结构数据信息:
notify通知链机制
2.notifier通知链表
3.优先级,数字越大优先级越高,表示任务执行越优先。

因此在一个模块中加入通知链的流程就是:

1. 声明一个通知链:
notify通知链机制
2.给通知链回调成员定义一个回调函数,在事件发生时会执行的函数:
notify通知链机制
notify通知链机制
3.将通知链注册到设备通知链链表:
notify通知链机制
notify通知链机制
这里用到的是原子通知链,原子通知链是指通知链成员的回调函数在中断或原子操作上下文中运行,不允许阻塞。
发送事件到原子通知链上的notifier block:
extern int atomic_notifier_call_chain(struct atomic_notifier_head *nh, unsigned long val, void *v);
还有其他三种通知链:可阻塞通知链,原始通知链,SRCU通知链

4.另一个模块产生事件以触发回调函数:
notify通知链机制
notify通知链机制
回调函数中将val事件赋给bq->usb_event,将任务bq->usb_work添加到工作队列system_power_efficient_wq中,并唤醒相应线程处理,其相应线程根据alloc_workqueue时的第二个参数选定。
notify通知链机制

notify通知链机制
notify通知链机制

workqueue.c:

notify通知链机制