diff mbox series

[1/1] EDAC/igen6: Fix the flood of invalid error reports

Message ID 20250212083354.31919-1-qiuxu.zhuo@intel.com (mailing list archive)
State New
Headers show
Series [1/1] EDAC/igen6: Fix the flood of invalid error reports | expand

Commit Message

Zhuo, Qiuxu Feb. 12, 2025, 8:33 a.m. UTC
The ECC_ERROR_LOG register of certain SoCs may contain the invalid value
~0, which results in a flood of invalid error reports in polling mode.

Fix the flood of invalid error reports by skipping the invalid ECC error
log value ~0.

Fixes: e14232afa944 ("EDAC/igen6: Add polling support")
Reported-by: Ramses <ramses@well-founded.dev>
Closes: https://lore.kernel.org/all/OISL8Rv--F-9@well-founded.dev/
Tested-by: Ramses <ramses@well-founded.dev>
Reported-by: John <therealgraysky@proton.me>
Closes: https://lore.kernel.org/all/p5YcxOE6M3Ncxpn2-Ia_wCt61EM4LwIiN3LroQvT_-G2jMrFDSOW5k2A9D8UUzD2toGpQBN1eI0sL5dSKnkO8iteZegLoQEj-DwQaMhGx4A=@proton.me/
Tested-by: John <therealgraysky@proton.me>
Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
---
 drivers/edac/igen6_edac.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

Comments

Markus Elfring Feb. 12, 2025, 12:08 p.m. UTC | #1
> +++ b/drivers/edac/igen6_edac.c
> @@ -785,13 +785,22 @@ static u64 ecclog_read_and_clear(struct igen6_imc *imc)
>  {> +	if (ecclog == ~0)> +	if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
…

May these condition checks be combined without repeating the statement “return 0;”?

Regards,
Markus
Zhuo, Qiuxu Feb. 12, 2025, 1:44 p.m. UTC | #2
> From: Markus Elfring <Markus.Elfring@web.de>
> [...]
> > @@ -785,13 +785,22 @@ static u64 ecclog_read_and_clear(struct
> > igen6_imc *imc)  {
> …
> > +	if (ecclog == ~0)
> …
> > +	if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
> …
> 
> May these condition checks be combined without repeating the statement
> “return 0;”?

Thanks for the suggestion. Yes.
However, I think that using separate "return 0" statements makes the
code more readable.

-Qiuxu
diff mbox series

Patch

diff --git a/drivers/edac/igen6_edac.c b/drivers/edac/igen6_edac.c
index fdf3a84fe698..595908af9e5c 100644
--- a/drivers/edac/igen6_edac.c
+++ b/drivers/edac/igen6_edac.c
@@ -785,13 +785,22 @@  static u64 ecclog_read_and_clear(struct igen6_imc *imc)
 {
 	u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET);
 
-	if (ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)) {
-		/* Clear CE/UE bits by writing 1s */
-		writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
-		return ecclog;
-	}
+	/*
+	 * Quirk: The ECC_ERROR_LOG register of certain SoCs may contain
+	 *        the invalid value ~0. This will result in a flood of invalid
+	 *        error reports in polling mode. Skip it.
+	 */
+	if (ecclog == ~0)
+		return 0;
 
-	return 0;
+	/* Neither a CE nor a UE. Skip it.*/
+	if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
+		return 0;
+
+	/* Clear CE/UE bits by writing 1s */
+	writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
+
+	return ecclog;
 }
 
 static void errsts_clear(struct igen6_imc *imc)