
  cli()/sti()  (Ingo Molnar <mingo@redhat.com> )
  ----------------------


2.5.28 顢5 Ĥͭ̾ʥޥ SMP Ǻ졢UP ǤäƤĤ
ޤ

    cli()
    sti()
    save_flags(flags)
    save_flags_cli(flags)
    restore_flags(flags)

ޤǤϡcli() ˤꡢɥ饤Хɤߥϥɥ餫ݸ뤳Ȥ
ǽǤϡƱǤϡԥå䥻ޥեȤä
̤ʥ᥽åɤȤɬפޤ

ȤСΤ褦ʤȤäƤɥ饤Х

        struct driver_data;

        irq_handler (...)
        {
                ....
                driver_data.finish = 1;
                driver_data.new_work = 0;
                ....
        }

        ...

        ioctl_func (...)
        {
                ...
                cli();
                ...
                driver_data.finish = 0;
                driver_data.new_work = 2;
                ...
                sti();
                ...
        }

ϡcli() 줿󤬼¹ԤƤ뤢ɤΤ褦ʳߥϥ
ɥؿ ( irq_handler() ⤽ΰ) ¹ԤʤȤ cli()
ؿˤäݾڤƤΤǡSMP ŪΤǤ

줫ϡľŪʥå᥽åɤȤʤФʤޤ

        spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
        struct driver_data;

        irq_handler (...)
        {
                unsigned long flags;
                ....
                spin_lock_irqsave(&driver_lock, flags);
                ....
                driver_data.finish = 1;
                driver_data.new_work = 0;
                ....
                spin_unlock_irqrestore(&driver_lock, flags);
                ....
        }

        ...

        ioctl_func (...)
        {
                ...
                spin_lock_irq(&driver_lock);
                ...
                driver_data.finish = 0;
                driver_data.new_work = 2;
                ...
                spin_unlock_irq(&driver_lock);
                ...
        }

嵭ΥɤˤϡĤɤޤ

- åط򤷤䤹 - ºݤ˥åѤ뤳Ȥˤꡢ
  ƥ륻󤬤Ϥäȼޤcli() λѤϤޤ
  ƤǤ򤷤䤹ʤȤȤϡǥХå䤹ʤȤ
  Ȥ̣ޤ

- ®ʤޤȤΤϡԥåϡṲ̄˻Ѥ
  IRQ å⡢ޤǤ®Ǥäơdriver_lock
  ԥåϥɥ饤ФǤѤƤʤΤǡɥ饤Фϡ㤨
  Ť SCSI ߤλΤԤɬפޤ󡣰 cli() 
  ¿Υɥ饤ФǻѤƤꡢƥ륻 IRQ ϥɥ
  ؿΤؤȹƤΤǡʥåζ߽ФƤޤ

ܹԤưפˤ뤿ᡢUP ƥƤ cli(), sti(),
save_flags(), save_flags_cli(), restore_flags() ޥϤޤĤƤޤ
2.6 ꡼ޤǤˤϡ餬Ѥ뤳Ȥʤʤä
ȤǤ礦

 ( CPU Ǥγ) ̵ˤɥ饤ФǤϡ
 5 ĤΥޥѤǤޤ

    local_irq_disable()
    local_irq_enable()
    local_save_flags(flags)
    local_irq_save(flags)
    local_irq_restore(flags)

ΰ̣ȥޥƥå˥ץˤʤäƤꡢŤ
cli(), sti(), save_flags(flags), restore_flags(flags) ΤΤȤ礭
ۤʤäƤΤդƤSMP Ǥΰ̣ϼΤ褦ˤʤޤ

    local_irq_disable()       =>  IRQ 򥪥դˤޤ

    local_irq_enable()        =>  IRQ 򥪥ˤޤ

    local_save_flags(flags)   => ߤ IRQ ֤ flags ¸ޤ
                                 ֤ϥǤ⥪դǤ⤫ޤޤ
                                 (ƥˤäƤϡۤˤ
                                 ӥåȤޤ)

    local_irq_save(flags)     => ߤ IRQ ֤ flags ¸
                                 ߤ̵ˤޤ

    local_irq_restore(flags)  => flags  IRQ ֤ޤ

(local_irq_save  IRQ ֤ IRQ վ֤ξ¸Ǥޤ
ޤlocal_irq_restore  IRQ ֤ IRQ վ֤Ρɤؤ
Ǥޤ)

⤦ĤδϢѹϡsynchronize_irq() ߤϥѥ᡼Ȥꡢ
synchronize_irq(irq) ȤʤäƤ뤳ȤǤѹˤϤޤSMP Ʊ
̤ˤȤŪ⤢ޤΤǡоݤγߥϥɥ餬
λΤԤĤȤǤޤ¾ IRQ ԤɬפϤޤ


ѹϤʤʤ줿ΤǤ礦 ͳϡcli()/sti() 
󥿡եݻΤƥŪ˽Ų٤ȤʤäƤ
ǤϡȤʤޤߥƥϡǽΨ
Ūˤʤꡢ򤷤䤹ʤꡢǥХå䤹ʤޤޤ®
ʤޤcli()/sti() ѤƤɥ饤ФԥåѤ
褦ѹСƱȤǤ礦 :-)
