ipr: fix EEH recovery
Subsystems (2)
PATCH 1/1 ipr: fix EEH recovery
Hi,
After commits c82f63e411f1b58427c103bd95af2863b1c96dd1 (PCI: check saved state before restore) and 4b77b0a2ba27d64f58f16d8d4d48d8319dda36ff (PCI:
Clear saved_state after the state has been restored) PCI drivers are prevented from restoring the device standard configuration registers twice in a row. These changes introduced a regression on ipr EEH recovery.
The ipr device driver saves the PCI state only during the device probe and restores it on ipr_reset_restore_cfg_space() during IOA resets. This behavior is causing the EEH recovery to fail after the second error detected, since the registers are not being restored.
One possible solution would be saving the registers after restoring them. The problem with this approach is that while recovering from an EEH error if pci_save_state() results in an EEH error, the adapter/slot will be reset, and end up back in ipr_reset_restore_cfg_space(), but it won't have a valid saved state to restore, so pci_restore_state() will fail.
The following patch introduces a workaround for this problem, hacking around the PCI API by setting pdev->state_saved = true before we do the restore. It fixes the EEH regression and prevents that we hit another EEH error during EEH recovery.
Thanks,
Kleber
--- drivers/scsi/ipr.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/scsi/ipr.c +1 -0
@@ -6516,6 +6516,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)int rc;ENTER ; + ioa_cfg->pdev->state_saved = true; rc =pci_restore_state (ioa_cfg->pdev);if (rc !=PCIBIOS_SUCCESSFUL ) {
Signature · 3 lines
-- Kleber S. Souza IBM Linux Technology Center
Quoted 49 lines · Kleber Sacilotto de Souza
Hi,
After commits
c82f63e411f1b58427c103bd95af2863b1c96dd1(PCI: check saved state before restore) and4b77b0a2ba27d64f58f16d8d4d48d8319dda36ff(PCI:
Clearsaved_stateafter the state has been restored) PCI drivers are prevented from restoring the device standard configuration registers twice in a row. These changes introduced a regression on ipr EEH recovery.The ipr device driver saves the PCI state only during the device probe and restores it on
ipr_reset_restore_cfg_space()during IOA resets. This behavior is causing the EEH recovery to fail after the second error detected, since the registers are not being restored.One possible solution would be saving the registers after restoring them. The problem with this approach is that while recovering from an EEH error if
pci_save_state()results in an EEH error, the adapter/slot will be reset, and end up back inipr_reset_restore_cfg_space(), but it won't have a valid saved state to restore, sopci_restore_state()will fail.The following patch introduces a workaround for this problem, hacking around the PCI API by setting
pdev->state_saved= true before we do the restore. It fixes the EEH regression and prevents that we hit another EEH error during EEH recovery.Thanks,
KleberSigned-off-by Kleber Sacilotto de Souza <[email protected]>--- drivers/scsi/ipr.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)drivers/scsi/ipr.c +1
-0@@ -6516,6 +6516,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)int rc;ENTER ; + ioa_cfg->pdev->state_saved = true; rc =pci_restore_state (ioa_cfg->pdev);if (rc !=PCIBIOS_SUCCESSFUL ) {
Signature · 3 lines
Brian King Linux on Power Virtualization IBM Linux Technology Center
Quoted 15 lines · Brian King
Acked-by Brian King <[email protected]>Quoted 13 lines
Signed-off-by Kleber Sacilotto de Souza <[email protected]>--- drivers/scsi/ipr.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)drivers/scsi/ipr.c +0
-0@@ -6516,6 +6516,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)int rc;
Quoted 7 lines
drivers/scsi/ipr.c static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd) · line 6522
Quoted 5 lines
drivers/scsi/ipr.c +1
-0ENTER ; + ioa_cfg->pdev->state_saved = true; rc =pci_restore_state (ioa_cfg->pdev);if (rc !=PCIBIOS_SUCCESSFUL ) {
Since this is a regression, is there any chance to have this patch applied and merged for 2.6.32?
Thanks,
Signature · 2 lines
Kleber S. Souza IBM Linux Technology Center