atomic_notifier_call_chain(&power_supply_notifier, PSY_EVENT_PROP_CHANGED, psy); kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);代码分析
时间: 2023-12-07 11:05:44 浏览: 38
这段代码主要是用于通知系统中注册了 power_supply_notifier 的回调函数,以及发送内核对象的属性改变事件。
首先,atomic_notifier_call_chain 函数会遍历 power_supply_notifier 链表中的所有回调函数,依次调用它们来处理事件。第一个参数是链表头,第二个参数是事件类型,这里是 PSY_EVENT_PROP_CHANGED,表示属性改变事件,第三个参数是对应的 power_supply 结构体指针。
接着,kobject_uevent 函数会发送一个内核对象的属性改变事件,通知用户空间有关此对象的属性已经发生了改变。第一个参数是内核对象的 kobject,第二个参数是事件类型,这里是 KOBJ_CHANGE。
总的来说,这段代码的作用是在系统中通知有关电源供应的回调函数和用户空间的事件处理程序,在电源供应的属性发生改变时进行相应的处理。
相关问题
atomic_notifier_call_chain(&power_supply_notifier, PSY_EVENT_PROP_CHANGED, psy);代码分析
这段代码是在Linux内核中的电源子系统中使用的,用于通知注册了电源属性变化通知器的所有观察者。其中,`&power_supply_notifier`是一个通知链表头,`PSY_EVENT_PROP_CHANGED`表示属性变化事件,`psy`是一个指向电源设备的指针。`atomic_notifier_call_chain`函数会遍历链表中的所有观察者并调用它们的回调函数来处理这个事件。这个函数是原子操作的,所以多个线程可以同时使用它来通知观察者,而不会导致竞态条件。
static int psy_changed(struct notifier_block *nb, unsigned long evt, void ptr) pd->psy_nb.notifier_call = psy_changed; ret = power_supply_reg_notifier(&pd->psy_nb); if (ret) goto del_inst; / *force read initial power_supply values */ psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, pd->usb_psy); atomic_notifier_call_chain(&power_supply_notifier, PSY_EVENT_PROP_CHANGED, psy); kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);代码之间的关系
这段代码中的关系如下:
1. 首先定义了一个名为psy_changed的函数,该函数会在电源供应设备的属性变化时被调用。
2. 在代码中,pd->psy_nb.notifier_call被设置为psy_changed函数,以便在电源供应设备的属性变化时被调用。
3. 接着调用power_supply_reg_notifier函数,将pd->psy_nb注册为电源供应设备的notifier。如果注册失败,则跳转到del_inst标签处。
4. 为了强制读取电源供应设备的初始值,调用psy_changed函数,并传递PSY_EVENT_PROP_CHANGED和pd->usb_psy作为参数。
5. 接下来,调用atomic_notifier_call_chain函数,该函数会依次调用power_supply_notifier链表中的所有notifier,并传递PSY_EVENT_PROP_CHANGED和psy作为参数。
6. 最后,调用kobject_uevent函数,该函数会向用户空间发送一个内核对象的事件通知,通知用户空间有关电源供应设备的属性发生了变化。