请教与tasklet的几个问题
时间:2010-08-28
来源:互联网
1)书上说,tasklet_schedule()用于注册一个tasklet,那么该tasklet被调度之后由谁来注销呢?
2)书上说,tasklet用状态TASKLET_STATE_RUN来保护tasklet在多个处理器上并发执行(一次最多只能有一个CPU执行同一个tasklet函数);但是tasklet注册之后,是存放在per-cpu的一个链表中的,怎么可能有多个CPU执行同一个tasklet函数呢?
附上相关代码(v2.6.24)
复制代码
2)书上说,tasklet用状态TASKLET_STATE_RUN来保护tasklet在多个处理器上并发执行(一次最多只能有一个CPU执行同一个tasklet函数);但是tasklet注册之后,是存放在per-cpu的一个链表中的,怎么可能有多个CPU执行同一个tasklet函数呢?
附上相关代码(v2.6.24)
- static inline void tasklet_schedule(struct tasklet_struct *t)
- {
- if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
- __tasklet_schedule(t);
- }
-
- void fastcall __tasklet_schedule(struct tasklet_struct *t)
- {
- unsigned long flags;
-
- local_irq_save(flags);
- t->next = __get_cpu_var(tasklet_vec).list;
- __get_cpu_var(tasklet_vec).list = t;
- raise_softirq_irqoff(TASKLET_SOFTIRQ);
- local_irq_restore(flags);
- }
-
- static void tasklet_action(struct softirq_action *a)
- {
- struct tasklet_struct *list;
-
- local_irq_disable();
- list = __get_cpu_var(tasklet_vec).list;
- __get_cpu_var(tasklet_vec).list = NULL;
- local_irq_enable();
-
- while (list) {
- struct tasklet_struct *t = list;
-
- list = list->next;
-
- if (tasklet_trylock(t)) {
- if (!atomic_read(&t->count)) {
- if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
- BUG();
- t->func(t->data);
- tasklet_unlock(t);
- continue;
- }
- tasklet_unlock(t);
- }
-
- local_irq_disable();
- t->next = __get_cpu_var(tasklet_vec).list;
- __get_cpu_var(tasklet_vec).list = t;
- __raise_softirq_irqoff(TASKLET_SOFTIRQ);
- local_irq_enable();
- }
- }
作者: rc_hz 发布时间: 2010-08-28
一个tasklet只 会在一个CPU上执行。LKD上已经说了。
作者: smalloc 发布时间: 2010-08-28
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28