Skip to content

Commit

Permalink
ghes, EDAC: Fix ghes_edac registration
Browse files Browse the repository at this point in the history
Tony reported seeing

  "Internal error: Can't find EDAC structure"

when injecting correctable errors due to the fact that ghes_edac would
still load even if the whitelist won't hit. Drop the pr_err() in
ghes_edac_report_mem_error() for now due to the hacky way how ghes_edac
depends on ghes.c.

While at it, make ghes_edac_register() return an error if it doesn't hit
in the whitelist as it is the only sensible thing to do in that
situation.

Furthermore, move the call to it to happen last in ghes_probe() so that
GHES initializing properly does not depend on ghes_edac init at all
as latter is only reporting errors and not required for GHES's proper
functioning.

Reviewed-by: Toshi Kani <toshi.kani@hpe.com>
Tested-by: Sughosh Ganu <sughosh.ganu@arm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Tony Luck <tony.luck@intel.com>
Link: https://lkml.kernel.org/r/20180420182015.zao3olss4tvvlxki@agluck-desk
  • Loading branch information
Borislav Petkov committed May 2, 2018
1 parent 6d08b06 commit cc7f3f1
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 13 deletions.
14 changes: 6 additions & 8 deletions drivers/acpi/apei/ghes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1087,10 +1087,6 @@ static int ghes_probe(struct platform_device *ghes_dev)
goto err;
}

rc = ghes_edac_register(ghes, &ghes_dev->dev);
if (rc < 0)
goto err;

switch (generic->notify.type) {
case ACPI_HEST_NOTIFY_POLLED:
timer_setup(&ghes->timer, ghes_poll_func, TIMER_DEFERRABLE);
Expand All @@ -1102,14 +1098,14 @@ static int ghes_probe(struct platform_device *ghes_dev)
if (rc) {
pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n",
generic->header.source_id);
goto err_edac_unreg;
goto err;
}
rc = request_irq(ghes->irq, ghes_irq_func, IRQF_SHARED,
"GHES IRQ", ghes);
if (rc) {
pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n",
generic->header.source_id);
goto err_edac_unreg;
goto err;
}
break;

Expand All @@ -1132,14 +1128,16 @@ static int ghes_probe(struct platform_device *ghes_dev)
default:
BUG();
}

platform_set_drvdata(ghes_dev, ghes);

ghes_edac_register(ghes, &ghes_dev->dev);

/* Handle any pending errors right away */
ghes_proc(ghes);

return 0;
err_edac_unreg:
ghes_edac_unregister(ghes);

err:
if (ghes) {
ghes_fini(ghes);
Expand Down
6 changes: 2 additions & 4 deletions drivers/edac/ghes_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,8 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
char *p;
u8 grain_bits;

if (!pvt) {
pr_err("Internal error: Can't find EDAC structure\n");
if (!pvt)
return;
}

/*
* We can do the locking below because GHES defers error processing
Expand Down Expand Up @@ -439,7 +437,7 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)
/* Check if safe to enable on this system */
idx = acpi_match_platform_list(plat_list);
if (!force_load && idx < 0)
return 0;
return -ENODEV;

/*
* We have only one logical memory controller to which all DIMMs belong.
Expand Down
2 changes: 1 addition & 1 deletion include/acpi/ghes.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ static inline void ghes_edac_report_mem_error(struct ghes *ghes, int sev,

static inline int ghes_edac_register(struct ghes *ghes, struct device *dev)
{
return 0;
return -ENODEV;
}

static inline void ghes_edac_unregister(struct ghes *ghes)
Expand Down

0 comments on commit cc7f3f1

Please sign in to comment.