[宏]preempt_disable

 1 //include/linux/preempt.h
 2 #ifdef CONFIG_PREEMPT_COUNT     //如果内核支持抢占
 3 #define preempt_disable() \  
4 do { \ 5 inc_preempt_count(); \ 6 barrier(); \ 7 } while (0) 8 #else //如果不支持抢占,退化成了一个内存屏障 9 #define preempt_disable() barrier() 10 #endif 11 #define inc_preempt_count() add_preempt_count(1) 12 13 14 //一般发行版本不会开启debug配置这里选择else 15 #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER) 16 extern void add_preempt_count(int val); 17 extern void sub_preempt_count(int val); 18 #else 19 # define add_preempt_count(val) do { preempt_count() += (val); } while (0) 20 # define sub_preempt_count(val) do { preempt_count() -= (val); } while (0) 21 #endif 22 23 //这里就是或取了对应线程的thread_info的prempt_count字段 24 #define preempt_count() (current_thread_info()->preempt_count) 25 26 27 28 //arch/x86/include/asm/thread_info.h 29 struct thread_info { 30 int preempt_count; /* 0 => preemptable,<0 => BUG */ 31 }; 32 33 34 /*内存屏障有不同的实现方法,例如gcc可以插入如下汇编实现,在某些特殊的编译器下, 35 提供了其他方法,内存屏障本身不具有运算功能。因此在阅读代码时可以忽略,内存屏障的语意: 36 “指令实际执行时确保存屏障后代码产生的指令开始执行前,内存屏障之前代码产生的指令一定 37 已经执行结束。并且屏障前对内存中变量的访问都已经写入到内存。”gcc的一种实现如下:*/ 38 #define barrier() __asm__ __volatile__("": : :"memory") 39 40 /*总结: 41 1.如果配置没有开启内核抢占配置preempt_disable退化成一个内存屏障 42 2.如果开启了内核抢占功能,preempt_disable一次调用会让当前线程的thread_info.preempt_count字段加1 43 */

 

转载于:https://www.cnblogs.com/DoOrDie/p/9265754.html

你可能感兴趣的:([宏]preempt_disable)