11 tasklet

代码

1 tasklet调度机制

中断上半部执行完后,使能调度下半部;

中断下半部softirq_init中会调用asklet_action,在此函数中会去遍历链表检测符合条件的tasklet选出执行

2 常用API和数据结构

2.1 tasklet_struct

struct tasklet_struct
{
	struct tasklet_struct *next;
	unsigned long state;			/* 调度的状态 */
	atomic_t count;					/* 此tasklet是否使能 */
	void (*func)(unsigned long);
	unsigned long data;
};

state	: 表示tasklet的状态
		  bit0为tasklet是否放入了tasklet队列。(1为已经放入了tasklet队列)
		  bit1为此tasklet是否已经执行完毕。(0表示内核已经调度完成此小任务)
count	: 表示task是否使能。0表示使能

2.2 tasklet_init

/**
 * 初始化task_let,并使能
 */
void tasklet_init(struct tasklet_struct *t,
		  void (*func)(unsigned long), unsigned long data)
{
	t->next = NULL;
	t->state = 0;
	atomic_set(&t->count, 0);
	t->func = func;
	t->data = data;
}

2.3 tasklet_enable、tasklet_disable

/**
 * tasklet使能和禁止
 */
static inline void tasklet_enable(struct tasklet_struct *t);
static inline void tasklet_disable(struct tasklet_struct *t);

2.4 task_schedule

/**
 * 开始taskletd的调度,将tasklet放入tasklet的队列
 */
static inline void tasklet_schedule(struct tasklet_struct *t);

2.5 tasklet_kill

/**
 * 如何一个进程没有被调度(未被放入队列),择将它的调度状态变更为0
 * 如果一个tasklet已经被调度(已经放入队列),择将会等其被执行后再将其调度状态清0
 */
void tasklet_kill(struct tasklet_struct *t);
posted @ 2023-03-19 16:41  人民广场的二道贩子  阅读(18)  评论(0编辑  收藏  举报