提交 feccada9 编写于 作者: W wenxiong@linux.vnet.ibm.com 提交者: James Bottomley

[SCSI] ipr: possible irq lock inversion dependency detected

When enable lockdep, seeing "possible irq lock inversion dependency detected"
error. This patch fixes the issue.
Signed-off-by: NWen Xiong <wenxiong@linux.vnet.ibm.com>
Acked-by: NBrian King <brking@linux.vnet.ibm.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 3bd3e8bf
...@@ -9392,7 +9392,7 @@ static int ipr_probe_ioa(struct pci_dev *pdev, ...@@ -9392,7 +9392,7 @@ static int ipr_probe_ioa(struct pci_dev *pdev,
void __iomem *ipr_regs; void __iomem *ipr_regs;
int rc = PCIBIOS_SUCCESSFUL; int rc = PCIBIOS_SUCCESSFUL;
volatile u32 mask, uproc, interrupts; volatile u32 mask, uproc, interrupts;
unsigned long lock_flags; unsigned long lock_flags, driver_lock_flags;
ENTER; ENTER;
...@@ -9615,9 +9615,9 @@ static int ipr_probe_ioa(struct pci_dev *pdev, ...@@ -9615,9 +9615,9 @@ static int ipr_probe_ioa(struct pci_dev *pdev,
} else } else
ioa_cfg->reset = ipr_reset_start_bist; ioa_cfg->reset = ipr_reset_start_bist;
spin_lock(&ipr_driver_lock); spin_lock_irqsave(&ipr_driver_lock, driver_lock_flags);
list_add_tail(&ioa_cfg->queue, &ipr_ioa_head); list_add_tail(&ioa_cfg->queue, &ipr_ioa_head);
spin_unlock(&ipr_driver_lock); spin_unlock_irqrestore(&ipr_driver_lock, driver_lock_flags);
LEAVE; LEAVE;
out: out:
...@@ -9700,6 +9700,7 @@ static void __ipr_remove(struct pci_dev *pdev) ...@@ -9700,6 +9700,7 @@ static void __ipr_remove(struct pci_dev *pdev)
unsigned long host_lock_flags = 0; unsigned long host_lock_flags = 0;
struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
int i; int i;
unsigned long driver_lock_flags;
ENTER; ENTER;
spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
...@@ -9723,9 +9724,9 @@ static void __ipr_remove(struct pci_dev *pdev) ...@@ -9723,9 +9724,9 @@ static void __ipr_remove(struct pci_dev *pdev)
INIT_LIST_HEAD(&ioa_cfg->used_res_q); INIT_LIST_HEAD(&ioa_cfg->used_res_q);
spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
spin_lock(&ipr_driver_lock); spin_lock_irqsave(&ipr_driver_lock, driver_lock_flags);
list_del(&ioa_cfg->queue); list_del(&ioa_cfg->queue);
spin_unlock(&ipr_driver_lock); spin_unlock_irqrestore(&ipr_driver_lock, driver_lock_flags);
if (ioa_cfg->sdt_state == ABORT_DUMP) if (ioa_cfg->sdt_state == ABORT_DUMP)
ioa_cfg->sdt_state = WAIT_FOR_DUMP; ioa_cfg->sdt_state = WAIT_FOR_DUMP;
...@@ -9991,12 +9992,12 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf) ...@@ -9991,12 +9992,12 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf)
{ {
struct ipr_cmnd *ipr_cmd; struct ipr_cmnd *ipr_cmd;
struct ipr_ioa_cfg *ioa_cfg; struct ipr_ioa_cfg *ioa_cfg;
unsigned long flags = 0; unsigned long flags = 0, driver_lock_flags;
if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF)
return NOTIFY_DONE; return NOTIFY_DONE;
spin_lock(&ipr_driver_lock); spin_lock_irqsave(&ipr_driver_lock, driver_lock_flags);
list_for_each_entry(ioa_cfg, &ipr_ioa_head, queue) { list_for_each_entry(ioa_cfg, &ipr_ioa_head, queue) {
spin_lock_irqsave(ioa_cfg->host->host_lock, flags); spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
...@@ -10014,7 +10015,7 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf) ...@@ -10014,7 +10015,7 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf)
ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
} }
spin_unlock(&ipr_driver_lock); spin_unlock_irqrestore(&ipr_driver_lock, driver_lock_flags);
return NOTIFY_OK; return NOTIFY_OK;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册