在理解linux中osq的实现时需要注意的问题:
1.在调用osq_lock()函数之前是需要调用preempt_disable()的。即禁止抢占
linux5.0 osq_lock.c的注释
2.在osq_lock()函数中调用了need_resched()检查当前进程是否需要被抢占,以免当前进程占着cpu不放。注意:抢占的条件是在中断返回前需要同时满足设置了TIF_NEED_RESCHED和preempt_count等于0。
3.结合上面两条可以理解osq_node是全局per cpu变量。
static DEFINE_PER_CPU_SHARED_ALIGNED(struct optimistic_spin_node, osq_node);
因为在osq_lock无法成功持有锁的时候并且当前进程检测到了TIF_NEED_RESCHED时,需要把当前进程所在的cpu的osq_node解放出来。



