       -
,      ,   
<asm/softirq.h>.      
   .

/*

*       
 preempt_count

*/

void local bh disable(void)

{

struct thread_info *t = current_thread info();

t->preempt_count += SOFTIRQ_OFFSET;

}

/*

*    preempt count "" 

*   ,     

*

*      ,
   

*/

void local bh enable(void)

{

struct thread info *t = current thread infoO;

t->preempt_count -= SOFTIRQ_OFFSET;

/*

*     preempt_count    
  -   ?

*  ,   
/

if (unlikely(!t->preempt_count &&
softirq pending(smp processor id())))
do_softirq() ;

}

      .    -
    ,      -
     .   
   ""  (,    -
  ),      .  -
       
   ,       .  -
   8  9.

                                       161