* [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover()
@ 2016-04-27 1:14 Gavin Shan
2016-04-27 1:14 ` [PATCH v3 2/4] powerpc/eeh: Restore initial state " Gavin Shan
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Gavin Shan @ 2016-04-27 1:14 UTC (permalink / raw)
To: linuxppc-dev; +Cc: alistair, ruscur, mpe, Gavin Shan
The function eeh_pe_reset_and_recover() is used to recover EEH
error when the passthrough device are transferred to guest and
backwards, meaning the device's driver is vfio-pci or none.
When the driver is vfio-pci that provides error_detected() error
handler only, the handler simply stops the guest and it's not
expected behaviour. On the other hand, no error handlers will
be called if we don't have a bound driver.
This ignores the error handler in eeh_pe_reset_and_recover()
that reports the error to device driver to avoid the exceptional
behaviour.
Fixes: 5cfb20b9 ("powerpc/eeh: Emulate EEH recovery for VFIO devices")
Cc: stable@vger.kernel.org #v3.18+
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: Russell Currey <ruscur@russell.cc>
---
v3: Split from PATCH[v2 1/3] according to David's comment
---
arch/powerpc/kernel/eeh_driver.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index fb6207d..3ce16da 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -564,9 +564,6 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe)
/* Save states */
eeh_pe_dev_traverse(pe, eeh_dev_save_state, NULL);
- /* Report error */
- eeh_pe_dev_traverse(pe, eeh_report_error, &result);
-
/* Issue reset */
ret = eeh_reset_pe(pe);
if (ret) {
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/4] powerpc/eeh: Restore initial state in eeh_pe_reset_and_recover()
2016-04-27 1:14 [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Gavin Shan
@ 2016-04-27 1:14 ` Gavin Shan
2016-04-27 1:14 ` [PATCH v3 3/4] powerpc/eeh: Ignore handlers " Gavin Shan
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Gavin Shan @ 2016-04-27 1:14 UTC (permalink / raw)
To: linuxppc-dev; +Cc: alistair, ruscur, mpe, Gavin Shan
The function eeh_pe_reset_and_recover() is used to recover EEH
error when the passthrou device are transferred to guest and
backwards. The content in the device's config space will be lost
on PE reset issued in the middle of the recovery. The function
saves/restores it before/after the reset. However, config access
to some adapters like Broadcom BCM5719 at this point will causes
fenced PHB. The config space is always blocked and we save 0xFF's
that are restored at late point. The memory BARs are totally
corrupted, causing another EEH error upon access to one of the
memory BARs.
This restores the config space on those adapters like BCM5719
from the content saved to the EEH device when it's populated,
to resolve above issue.
Fixes: 5cfb20b9 ("powerpc/eeh: Emulate EEH recovery for VFIO devices")
Cc: stable@vger.kernel.org #v3.18+
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: Russell Currey <ruscur@russell.cc>
---
arch/powerpc/kernel/eeh_driver.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 3ce16da..31e4c7e 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -171,6 +171,16 @@ static void *eeh_dev_save_state(void *data, void *userdata)
if (!edev)
return NULL;
+ /*
+ * We cannot access the config space on some adapters.
+ * Otherwise, it will cause fenced PHB. We don't save
+ * the content in their config space and will restore
+ * from the initial config space saved when the EEH
+ * device is created.
+ */
+ if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED))
+ return NULL;
+
pdev = eeh_dev_to_pci_dev(edev);
if (!pdev)
return NULL;
@@ -312,6 +322,19 @@ static void *eeh_dev_restore_state(void *data, void *userdata)
if (!edev)
return NULL;
+ /*
+ * The content in the config space isn't saved because
+ * the blocked config space on some adapters. We have
+ * to restore the initial saved config space when the
+ * EEH device is created.
+ */
+ if (edev->pe && (edev->pe->state & EEH_PE_CFG_RESTRICTED)) {
+ if (list_is_last(&edev->list, &edev->pe->edevs))
+ eeh_pe_restore_bars(edev->pe);
+
+ return NULL;
+ }
+
pdev = eeh_dev_to_pci_dev(edev);
if (!pdev)
return NULL;
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/4] powerpc/eeh: Ignore handlers in eeh_pe_reset_and_recover()
2016-04-27 1:14 [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Gavin Shan
2016-04-27 1:14 ` [PATCH v3 2/4] powerpc/eeh: Restore initial state " Gavin Shan
@ 2016-04-27 1:14 ` Gavin Shan
2016-04-27 1:14 ` [PATCH v3 4/4] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
2016-05-12 11:32 ` [v3, 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Michael Ellerman
3 siblings, 0 replies; 5+ messages in thread
From: Gavin Shan @ 2016-04-27 1:14 UTC (permalink / raw)
To: linuxppc-dev; +Cc: alistair, ruscur, mpe, Gavin Shan
The function eeh_pe_reset_and_recover() is used to recover EEH
error when the passthrough device are transferred to guest and
backwards, meaning the device's driver is vfio-pci or none. In
both cases, the handlers triggered by eeh_report_reset() and
eeh_report_resume() shouldn't be called.
This ignores the error handlers from eeh_report_reset() and
eeh_report_resume().
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: Russell Currey <ruscur@russell.cc>
---
v3: Split from PATCH[v2 1/3] according to David's comment
---
arch/powerpc/kernel/eeh_driver.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 31e4c7e..a16212d 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -575,7 +575,7 @@ static int eeh_clear_pe_frozen_state(struct eeh_pe *pe,
int eeh_pe_reset_and_recover(struct eeh_pe *pe)
{
- int result, ret;
+ int ret;
/* Bail if the PE is being recovered */
if (pe->state & EEH_PE_RECOVERING)
@@ -601,15 +601,9 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe)
return ret;
}
- /* Notify completion of reset */
- eeh_pe_dev_traverse(pe, eeh_report_reset, &result);
-
/* Restore device state */
eeh_pe_dev_traverse(pe, eeh_dev_restore_state, NULL);
- /* Resume */
- eeh_pe_dev_traverse(pe, eeh_report_resume, NULL);
-
/* Clear recovery mode */
eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 4/4] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner()
2016-04-27 1:14 [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Gavin Shan
2016-04-27 1:14 ` [PATCH v3 2/4] powerpc/eeh: Restore initial state " Gavin Shan
2016-04-27 1:14 ` [PATCH v3 3/4] powerpc/eeh: Ignore handlers " Gavin Shan
@ 2016-04-27 1:14 ` Gavin Shan
2016-05-12 11:32 ` [v3, 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Michael Ellerman
3 siblings, 0 replies; 5+ messages in thread
From: Gavin Shan @ 2016-04-27 1:14 UTC (permalink / raw)
To: linuxppc-dev; +Cc: alistair, ruscur, mpe, Gavin Shan
The label "reset" in eeh_pe_change_owner() is used only for once.
No need to keep it and just drop it. No logical changes introduced.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Russell Currey <ruscur@russell.cc>
---
arch/powerpc/kernel/eeh.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
index 6544017..4b40d56 100644
--- a/arch/powerpc/kernel/eeh.c
+++ b/arch/powerpc/kernel/eeh.c
@@ -1336,14 +1336,11 @@ static int eeh_pe_change_owner(struct eeh_pe *pe)
id->subdevice != pdev->subsystem_device)
continue;
- goto reset;
+ return eeh_pe_reset_and_recover(pe);
}
}
return eeh_unfreeze_pe(pe, true);
-
-reset:
- return eeh_pe_reset_and_recover(pe);
}
/**
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [v3, 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover()
2016-04-27 1:14 [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Gavin Shan
` (2 preceding siblings ...)
2016-04-27 1:14 ` [PATCH v3 4/4] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
@ 2016-05-12 11:32 ` Michael Ellerman
3 siblings, 0 replies; 5+ messages in thread
From: Michael Ellerman @ 2016-05-12 11:32 UTC (permalink / raw)
To: Gavin Shan, linuxppc-dev; +Cc: alistair, Gavin Shan
On Wed, 2016-27-04 at 01:14:50 UTC, Gavin Shan wrote:
> The function eeh_pe_reset_and_recover() is used to recover EEH
> error when the passthrough device are transferred to guest and
> backwards, meaning the device's driver is vfio-pci or none.
> When the driver is vfio-pci that provides error_detected() error
> handler only, the handler simply stops the guest and it's not
> expected behaviour. On the other hand, no error handlers will
> be called if we don't have a bound driver.
>
> This ignores the error handler in eeh_pe_reset_and_recover()
> that reports the error to device driver to avoid the exceptional
> behaviour.
>
> Fixes: 5cfb20b9 ("powerpc/eeh: Emulate EEH recovery for VFIO devices")
> Cc: stable@vger.kernel.org #v3.18+
> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
> Reviewed-by: Russell Currey <ruscur@russell.cc>
Series applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/affeb0f2d3a9af419ad7ef4ac7
cheers
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-05-12 11:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-27 1:14 [PATCH v3 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Gavin Shan
2016-04-27 1:14 ` [PATCH v3 2/4] powerpc/eeh: Restore initial state " Gavin Shan
2016-04-27 1:14 ` [PATCH v3 3/4] powerpc/eeh: Ignore handlers " Gavin Shan
2016-04-27 1:14 ` [PATCH v3 4/4] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
2016-05-12 11:32 ` [v3, 1/4] powerpc/eeh: Don't report error in eeh_pe_reset_and_recover() Michael Ellerman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).