Я конешн понимаю, ускорение и всё такое... но юзать рекурсию в ядре это перебор... 843 static void
844 fill_sons_in_loop (const struct loop *loop, basic_block bb,
845 basic_block *tovisit, int *tv)
846 {
847 basic_block son, postpone = NULL;
848
849 tovisit[(*tv)++] = bb;
850 for (son = first_dom_son (CDI_DOMINATORS, bb);
851 son;
852 son = next_dom_son (CDI_DOMINATORS, son))
853 {
854 if (!flow_bb_inside_loop_p (loop, son))
855 continue;
856
857 if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
858 {
859 postpone = son;
860 continue;
861 }
862 fill_sons_in_loop (loop, son, tovisit, tv);
863 }
864
865 if (postpone)
866 fill_sons_in_loop (loop, postpone, tovisit, tv);
867 #ifdef __AMDCPUBUG_DFLY01_AVAILABLE__
868 cpu_amdcpubug_dfly01();
869 #endif
870 }
cpu_amdcpubug_dfly01() - это вот это
static __inline void cpu_amdcpubug(void) {
__asm __volatile("nop" : : : "memory");
}
Драгонфлайщеги изобрели виласипед с названием memory_barrier !!! :)
http://lxr.linux.no/#linux+v3.2.9/include/linux/compiler-gcc...
#if defined(__i386__) || defined(__x86_64__)
#define barrier() asm volatile("" ::: "memory")
#define mb() __sync_synchronize()
#define smp_mb() mb()
# define smp_rmb() barrier()
# define smp_wmb() barrier()
...
Кстати, из того же AMD CPU Programming Guide,
в особых случаях, и в частности на SMP, рекомендуют не забывать про:
#define mb() asm volatile("mfence":::"memory")
#define rmb() asm volatile("lfence":::"memory")
#define wmb() asm volatile("sfence" ::: "memory")