进程调度API之preempt_notifier_register/preempt_notifier_unregister
2017-12-19 17:12
453 查看
void preempt_notifier_register(struct preempt_notifier *notifier) 用于简单thread是否被抢占或者重新调度 形参preempt_notifier的定义如下: struct preempt_notifier { struct hlist_node link; struct preempt_ops *ops; }; 其中 struct preempt_ops { void (*sched_in)(struct preempt_notifier *notifier, int cpu); void (*sched_out)(struct preempt_notifier *notifier, struct task_struct *next); }; 可以看到这个函数可以分别检测thread被sched_in和sched_out的时间点,这样应该就可以计算函数被执行的时间 其源码分析如下: void preempt_notifier_register(struct preempt_notifier *notifier) { if (!static_key_false(&preempt_notifier_key)) WARN(1, "registering preempt_notifier while notifiers disabled\n"); hlist_add_head(¬ifier->link, ¤t->preempt_notifiers); } 可以看到首先要notifier enable,也即是preempt_notifier_key 为true。然后调用hlist_add_head 将形参的notifier添加到当前进程的preempt_notifiers 中,这样当前进程被sched_in和sched_out 的时候就会分别调用preempt_ops 中的sched_in和sched_out函数. 与preempt_notifier_register 对应的是preempt_notifier_unregister。其源码如下: void preempt_notifier_unregister(struct preempt_notifier *notifier) { hlist_del(¬ifier->link); } 仅仅是调用hlist_del 删除notifier->link,并没有修改current->preempt_notifiers。所以 preempt_notifier_register 只能在当前thread中调用,而preempt_notifier_unregister 可以在任何thread中调用.
相关文章推荐
- 进程调度API之preempt_schedule
- 进程调度API之preempt_count_add/preempt_count_sub
- 进程调度API之preempt_count_add(val)/preempt_count_sub(val)
- 进程调度API之preempt_count_dec_and_test
- 进程调度API之add_wait_queue/remove_wait_queue
- 进程调度API之autoremove_wake_function
- 进程调度API之__wake_up_sync
- 进程调度API之prepare_to_wait/prepare_to_wait_exclusive
- 进程调度API之complete
- 进程调度API之sleep_on_spinunlock
- 进程调度API之add_wait_queue_exclusive
- 进程调度API之wait_for_completion_x
- 进程调度API之task_nice
- 进程调度API之init_waitqueue_head
- 进程调度API之prepare_to_wait
- 进程调度API之finish_wait
- 进程调度API之task_cpu
- 内核文件系统API之register_filesystem和unregister_filesystem
- 模块API之register_module_notifier
- 进程调度API之yield