preempt_count_add(val)/preempt_count_sub(val)分别用于增加和减小当前进程的引用计数
如果治理的val等于1的话,则等同于下面这两个宏
#define preempt_count_inc() preempt_count_add(1)
#define preempt_count_dec() preempt_count_sub(1)
使用的例子如下:
例如我们一般在进入irq 处理函数的时候会调用preempt_count_add 来增加当前进程的引用计数,
如果引用计数不为0的话,则可以防止内核抢占。
#define __irq_enter() \
do { \
account_irq_enter_time(current); \
preempt_count_add(HARDIRQ_OFFSET); \
trace_hardirq_enter(); \
} while (0)
其源码分析如下:
#define preempt_count_add(val) __preempt_count_add(val)
#define preempt_count_sub(val) __preempt_count_sub(val)
static __always_inline void __preempt_count_add(int val)
{
*preempt_count_ptr() += val;
}
static __always_inline void __preempt_count_sub(int val)
{
*preempt_count_ptr() -= val;
}
这里分别调用preempt_count_ptr的返回值增加或者减小val
而preempt_count_ptr 定义如下:
static __always_inline volatile int *preempt_count_ptr(void)
{
return ¤t_thread_info()->preempt_count;
}
可见值直接操作当前thread的preempt_count
进程调度API之preempt_count_add(val)/preempt_count_sub(val)
最新推荐文章于 2024-01-14 08:00:00 发布