pciehp: Add missing memory barrier
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Fri, 25 Apr 2008 21:39:02 +0000 (14:39 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 25 Apr 2008 21:39:02 +0000 (14:39 -0700)
Fix the possible race condition between pcie_isr() and pciehp_write_cmd()
because of the lack of memory barrier.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/hotplug/pciehp_hpc.c

index 51a5055f69658f89d5204c4b0424165e9ffec39c..19eba2a2f74649042e34b5d29d69a1f046ee15ef 100644 (file)
@@ -279,6 +279,7 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd, u16 mask)
        slot_ctrl |= ((cmd & mask) | CMD_CMPL_INTR_ENABLE);
 
        ctrl->cmd_busy = 1;
+       smp_mb();
        retval = pciehp_writew(ctrl, SLOTCTRL, slot_ctrl);
        if (retval)
                err("%s: Cannot write to SLOTCTRL register\n", __func__);
@@ -759,6 +760,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
        /* Check Command Complete Interrupt Pending */
        if (intr_loc & CMD_COMPLETED) {
                ctrl->cmd_busy = 0;
+               smp_mb();
                wake_up_interruptible(&ctrl->queue);
        }