sched.cを読み進めたいのだが。。
kernel/sched.c
2960 if (likely(!current->exit_state)) { 2961 if (unlikely(in_atomic())) { 2962 printk(KERN_ERR "scheduling while atomic: " 2963 "%s/0x%08x/%d\n", 2964 current->comm, preempt_count(), current->pid); 2965 dump_stack(); 2966 } 2967 }
in_atomic()って何?って思って探した。
include/linux/hardirq.h
70 #if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL) 71 # define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked()) 72 #else 73 # define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) 74 #endif
preempt_count()は以下。
include/linux/preempt.h
24 #define preempt_count() (current_thread_info()->preempt_count)
PREEMPT_ACTIVEは以下。
include/asm-i386/thread_info.h
55 #define PREEMPT_ACTIVE 0x10000000
kernel_locked()は以下。
include/linux/smp_lock.h
9 #define kernel_locked() (current->lock_depth >= 0)