kobject_uevent_env(&audio->device->kobj, KOBJ_CHANGE, uac_event);,然后eudev左闪么
时间: 2024-04-03 19:35:01 浏览: 89
这行代码是用来将一个kobject对象(audio->device->kobj)的状态改变通知给内核事件处理程序,具体来说,它会向内核发送一个KOBJ_CHANGE事件,并将事件的参数uac_event传递给内核事件处理程序。
当这行代码被执行时,会触发内核事件处理程序对该事件进行处理,这可能会导致eudev等用户态程序从内核态被唤醒来处理该事件。因此,您可能会看到eudev等程序的进程状态发生变化,例如左闪等。
需要注意的是,该行代码只是一个通知机制,并不会直接引起eudev等程序的进程状态变化,具体的处理逻辑需要由内核事件处理程序来完成。
相关问题
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);怎么通过中断相互调用
中断通常是由硬件设备引发的,它会打断CPU执行的当前任务,转而去执行中断服务程序。中断服务程序是在中断上下文中运行的,它的执行不能被打断,直到它完成为止。因此,在中断服务程序中,不能直接调用可能会睡眠的函数,否则会导致死锁或系统崩溃。
在这段代码中,如果在中断上下文中调用atomic_notifier_call_chain和kobject_uevent函数,可能会导致睡眠,因为这两个函数都会调用睡眠函数。因此,这两个函数不能在中断上下文中直接调用。
如果需要在中断服务程序中调用这些函数,可以使用工作队列或定时器来完成。将需要在中断上下文中执行的代码放入工作队列或定时器中,然后在合适的时机调度工作队列或定时器,以便在非中断上下文中执行这些代码。这样就可以避免在中断上下文中调用睡眠函数,从而保证系统的稳定性。
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函数,该函数会向用户空间发送一个内核对象的事件通知,通知用户空间有关电源供应设备的属性发生了变化。
阅读全文