static inline void tasklet_enable(struct tasklet_struct *t)和static inline void tasklet_disable(struct tasklet_struct *t)
分别用于使能和禁止tasklet。
其使用的例程如下:
void drv_stop(struct ieee80211_local *local)
{
might_sleep();
if (WARN_ON(!local->started))
return;
trace_drv_stop(local);
local->ops->stop(&local->hw);
trace_drv_return_void(local);
/* sync away all work on the tasklet before clearing started */
tasklet_disable(&local->tasklet);
tasklet_enable(&local->tasklet);
barrier();
local->started = false;
}
其源码分析如下:
static inline void tasklet_enable(struct tasklet_struct *t)
{
smp_mb__before_atomic();
atomic_dec(&t->count);
}
可见tasklet_enable 仅仅是增加tasklet_struct的成员变量count
static inline void tasklet_disable(struct tasklet_struct *t)
{
#与前面的对应减少tasklet_struct的成员变量count
tasklet_disable_nosync(t);
#等待这个task 运行完成
tasklet_unlock_wait(t);
smp_mb();
}
可见disable的时候一定回阻塞当前进程,直到tasklet 运行完成
static inline void tasklet_unlock_wait(struct tasklet_struct *t)
{
while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
}
与tasklet相关的flags最共有两个,分别如下:
enum
{
TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */
TASKLET_STATE_RUN /* Tasklet is running (SMP only) */
};
中断API之tasklet_enable/tasklet_disable
最新推荐文章于 2022-09-12 10:27:24 发布