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)