linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover()
@ 2016-04-21 11:53 Gavin Shan
  2016-04-21 11:53 ` [PATCH 2/3] powerpc/eeh: Restore config from edev " Gavin Shan
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Gavin Shan @ 2016-04-21 11:53 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: alistair, david, 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
backwords, 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 all error handlers provided by device driver in
eeh_pe_reset_and_recover() 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>
---
 arch/powerpc/kernel/eeh_driver.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index fb6207d..1c7d703 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -552,7 +552,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)
@@ -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) {
@@ -581,15 +578,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] 9+ messages in thread

* [PATCH 2/3] powerpc/eeh: Restore config from edev in eeh_pe_reset_and_recover()
  2016-04-21 11:53 [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Gavin Shan
@ 2016-04-21 11:53 ` Gavin Shan
  2016-04-22  6:37   ` Russell Currey
  2016-04-21 11:53 ` [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
  2016-04-22  6:35 ` [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Russell Currey
  2 siblings, 1 reply; 9+ messages in thread
From: Gavin Shan @ 2016-04-21 11:53 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: alistair, david, 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
backwords. 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
fended 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 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>
---
 arch/powerpc/kernel/eeh_driver.c | 39 ++-------------------------------------
 1 file changed, 2 insertions(+), 37 deletions(-)

diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 1c7d703..ec6e889 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -163,22 +163,6 @@ static bool eeh_dev_removed(struct eeh_dev *edev)
 	return false;
 }
 
-static void *eeh_dev_save_state(void *data, void *userdata)
-{
-	struct eeh_dev *edev = data;
-	struct pci_dev *pdev;
-
-	if (!edev)
-		return NULL;
-
-	pdev = eeh_dev_to_pci_dev(edev);
-	if (!pdev)
-		return NULL;
-
-	pci_save_state(pdev);
-	return NULL;
-}
-
 /**
  * eeh_report_error - Report pci error to each device driver
  * @data: eeh device
@@ -304,22 +288,6 @@ static void *eeh_report_reset(void *data, void *userdata)
 	return NULL;
 }
 
-static void *eeh_dev_restore_state(void *data, void *userdata)
-{
-	struct eeh_dev *edev = data;
-	struct pci_dev *pdev;
-
-	if (!edev)
-		return NULL;
-
-	pdev = eeh_dev_to_pci_dev(edev);
-	if (!pdev)
-		return NULL;
-
-	pci_restore_state(pdev);
-	return NULL;
-}
-
 /**
  * eeh_report_resume - Tell device to resume normal operations
  * @data: eeh device
@@ -561,9 +529,6 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe)
 	/* Put the PE into recovery mode */
 	eeh_pe_state_mark(pe, EEH_PE_RECOVERING);
 
-	/* Save states */
-	eeh_pe_dev_traverse(pe, eeh_dev_save_state, NULL);
-
 	/* Issue reset */
 	ret = eeh_reset_pe(pe);
 	if (ret) {
@@ -578,8 +543,8 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe)
 		return ret;
 	}
 
-	/* Restore device state */
-	eeh_pe_dev_traverse(pe, eeh_dev_restore_state, NULL);
+	/* Restore device's config space */
+	eeh_pe_restore_bars(pe);
 
 	/* Clear recovery mode */
 	eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner()
  2016-04-21 11:53 [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Gavin Shan
  2016-04-21 11:53 ` [PATCH 2/3] powerpc/eeh: Restore config from edev " Gavin Shan
@ 2016-04-21 11:53 ` Gavin Shan
  2016-04-22  5:15   ` David Gibson
  2016-04-22  6:38   ` Russell Currey
  2016-04-22  6:35 ` [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Russell Currey
  2 siblings, 2 replies; 9+ messages in thread
From: Gavin Shan @ 2016-04-21 11:53 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: alistair, david, 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 logicial changes introduced.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
---
 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] 9+ messages in thread

* Re: [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner()
  2016-04-21 11:53 ` [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
@ 2016-04-22  5:15   ` David Gibson
  2016-04-22  6:38   ` Russell Currey
  1 sibling, 0 replies; 9+ messages in thread
From: David Gibson @ 2016-04-22  5:15 UTC (permalink / raw)
  To: Gavin Shan; +Cc: linuxppc-dev, alistair, ruscur, mpe

[-- Attachment #1: Type: text/plain, Size: 1146 bytes --]

On Thu, Apr 21, 2016 at 09:53:07PM +1000, Gavin Shan wrote:
> The label "reset" in eeh_pe_change_owner() is used only for once.
> No need to keep it and just drop it. No logicial changes introduced.
> 
> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  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);
>  }
>  
>  /**

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover()
  2016-04-21 11:53 [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Gavin Shan
  2016-04-21 11:53 ` [PATCH 2/3] powerpc/eeh: Restore config from edev " Gavin Shan
  2016-04-21 11:53 ` [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
@ 2016-04-22  6:35 ` Russell Currey
  2 siblings, 0 replies; 9+ messages in thread
From: Russell Currey @ 2016-04-22  6:35 UTC (permalink / raw)
  To: Gavin Shan, linuxppc-dev; +Cc: alistair, david, mpe

On Thu, 2016-04-21 at 21:53 +1000, Gavin Shan wrote:
> The function eeh_pe_reset_and_recover() is used to recover EEH
> error when the passthrou device are transferred to guest and

"passthrou" should be "passthrough"

> backwords, meaning the device's driver is vfio-pci or none.

"backwords" should be "backwards"

> 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 all error handlers provided by device driver in
> eeh_pe_reset_and_recover() 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>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] powerpc/eeh: Restore config from edev in eeh_pe_reset_and_recover()
  2016-04-21 11:53 ` [PATCH 2/3] powerpc/eeh: Restore config from edev " Gavin Shan
@ 2016-04-22  6:37   ` Russell Currey
  2016-04-22 13:17     ` Gavin Shan
  0 siblings, 1 reply; 9+ messages in thread
From: Russell Currey @ 2016-04-22  6:37 UTC (permalink / raw)
  To: Gavin Shan, linuxppc-dev; +Cc: alistair, david, mpe

On Thu, 2016-04-21 at 21:53 +1000, Gavin Shan wrote:
> The function eeh_pe_reset_and_recover() is used to recover EEH
> error when the passthrou device are transferred to guest and
> backwords. The content in the device's config space will be lost

Spelling, as before :)

> 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
> fended PHB. The config space is always blocked and we save 0xFF's

"fended" should be "fenced"

> 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 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>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner()
  2016-04-21 11:53 ` [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
  2016-04-22  5:15   ` David Gibson
@ 2016-04-22  6:38   ` Russell Currey
  2016-04-22 13:17     ` Gavin Shan
  1 sibling, 1 reply; 9+ messages in thread
From: Russell Currey @ 2016-04-22  6:38 UTC (permalink / raw)
  To: Gavin Shan, linuxppc-dev; +Cc: alistair, david, mpe

On Thu, 2016-04-21 at 21:53 +1000, Gavin Shan wrote:
> The label "reset" in eeh_pe_change_owner() is used only for once.
> No need to keep it and just drop it. No logicial changes introduced.

"logicial" should be "logical".  I found something to be pedantic about on each
patch! :)
> 
> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
> ---

Reviewed-by: Russell Currey <ruscur@russell.cc>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] powerpc/eeh: Restore config from edev in eeh_pe_reset_and_recover()
  2016-04-22  6:37   ` Russell Currey
@ 2016-04-22 13:17     ` Gavin Shan
  0 siblings, 0 replies; 9+ messages in thread
From: Gavin Shan @ 2016-04-22 13:17 UTC (permalink / raw)
  To: Russell Currey; +Cc: Gavin Shan, linuxppc-dev, alistair, david, mpe

On Fri, Apr 22, 2016 at 04:37:52PM +1000, Russell Currey wrote:
>On Thu, 2016-04-21 at 21:53 +1000, Gavin Shan wrote:
>> The function eeh_pe_reset_and_recover() is used to recover EEH
>> error when the passthrou device are transferred to guest and
>> backwords. The content in the device's config space will be lost
>
>Spelling, as before :)
>
>> 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
>> fended PHB. The config space is always blocked and we save 0xFF's
>
>"fended" should be "fenced"
>

Thanks, Russell. I'll fix it in next revision ;-)

>> 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 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>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner()
  2016-04-22  6:38   ` Russell Currey
@ 2016-04-22 13:17     ` Gavin Shan
  0 siblings, 0 replies; 9+ messages in thread
From: Gavin Shan @ 2016-04-22 13:17 UTC (permalink / raw)
  To: Russell Currey; +Cc: Gavin Shan, linuxppc-dev, alistair, david, mpe

On Fri, Apr 22, 2016 at 04:38:45PM +1000, Russell Currey wrote:
>On Thu, 2016-04-21 at 21:53 +1000, Gavin Shan wrote:
>> The label "reset" in eeh_pe_change_owner() is used only for once.
>> No need to keep it and just drop it. No logicial changes introduced.
>
>"logicial" should be "logical". =A0I found something to be pedantic abou=
t on each
>patch! :)

Thanks, Russell. I'll fix in next revision ;-)

>>=20
>> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
>> ---
>
>Reviewed-by: Russell Currey <ruscur@russell.cc>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-04-22 13:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-21 11:53 [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Gavin Shan
2016-04-21 11:53 ` [PATCH 2/3] powerpc/eeh: Restore config from edev " Gavin Shan
2016-04-22  6:37   ` Russell Currey
2016-04-22 13:17     ` Gavin Shan
2016-04-21 11:53 ` [PATCH 3/3] powerpc/eeh: Drop unnecessary label in eeh_pe_change_owner() Gavin Shan
2016-04-22  5:15   ` David Gibson
2016-04-22  6:38   ` Russell Currey
2016-04-22 13:17     ` Gavin Shan
2016-04-22  6:35 ` [PATCH 1/3] powerpc/eeh: Ignore error handlers in eeh_pe_reset_and_recover() Russell Currey

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).