ĤΥץåȥեǤϡޥåץ I/O ϡ夯դ
Ƥޤ ()Τ褦ʥץåȥեǤϡǥХ
ޥåפ줿ɥ쥹ؤ I/O ߤտޤ֤ϤȤݾڤ
Τϡɥ饤гȯԤǤǤ̾ְʡץǥХ⤷ϥ֥å
쥸ɤ߹ळȤˤꤪʤޤϡɹߤ
αΥǥХؤνߤ I/O åץåȤ˥եå夵ΤǤ
ɥ饤Ф̾ԥåݸ줿ƥ륻󥳡ɤ
ȴľˡεȤޤˤꡢ³ I/O ֤ؤνߤ
(ɹ̿) ԤƤνߤ夹뤳Ȥݾڤޤ
(Хꥢڥ졼 mb() ޤI/O ˴ؤƤǤ)

ŪʥǥХɥ饤ФΡŪϼΤ褦ˤʤޤ

        ...
CPU A:  spin_lock_irqsave(&dev_lock, flags)
CPU A:  val = readl(my_status);
CPU A:  ...
CPU A:  writel(newval, ring_ptr);
CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
        ...
CPU B:  spin_lock_irqsave(&dev_lock, flags)
CPU B:  val = readl(my_status);
CPU B:  ...
CPU B:  writel(newval2, ring_ptr);
CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
        ...

嵭ξ硢ǥХ newval  newval2 ǽ
ޤȤʤǤ礦ľΤϴñǤ

        ...
CPU A:  spin_lock_irqsave(&dev_lock, flags)
CPU A:  val = readl(my_status);
CPU A:  ...
CPU A:  writel(newval, ring_ptr);
CPU A:  (void)readl(safe_register); /* ֤쥸 */
CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
        ...
CPU B:  spin_lock_irqsave(&dev_lock, flags)
CPU B:  val = readl(my_status);
CPU B:  ...
CPU B:  writel(newval2, ring_ptr);
CPU B:  (void)readl(safe_register); /* ֤쥸 */
CPU B:  spin_unlock_irqrestore(&dev_lock, flags)

Ǥϡsafe_register ɤ߹ळȤˤꡢI/O åץåȤˡºݤ
åץåȤɹߤανߤƥեå夹ư
ʤ碌뤿ᡢǡ˲ɤȤǤޤ
