Re: [PATCH v5 02/10] ACPI: APEI: GHES: move CPER read helpers
Jonathan Cameron <[email protected]> Fri, 29 May 2026 16:51:37 +0100
| Newsgroups | dev.linux.lists.acpica-devel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-acpi,org.kernel.vger.linux-cxl,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-doc,org.kernel.vger.linux-edac,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260529165137.0cd56e6e@jic23-huawei> |
On Fri, 29 May 2026 10:50:42 +0100 Ahmed Tiba <[email protected]> wrote: > Relocate the CPER buffer mapping, peek, and clear helpers from ghes.c into > ghes_cper.c so they can be shared with other firmware-first providers. > This commit only shuffles code; behavior stays the same. > > Signed-off-by: Ahmed Tiba <[email protected]> A couple of things I noticed whilst quickly scan through what was moved inline. Move itself looks fine to me. Reviewed-by: Jonathan Cameron <[email protected]> > diff --git a/drivers/acpi/apei/ghes_cper.c b/drivers/acpi/apei/ghes_cper.c > new file mode 100644 > index 000000000000..7bb72fe57838 > --- /dev/null > +++ b/drivers/acpi/apei/ghes_cper.c > @@ -0,0 +1,195 @@ > + > +/* Check the top-level record header has an appropriate size. */ > +int __ghes_check_estatus(struct ghes *ghes, > + struct acpi_hest_generic_status *estatus) > +{ > + u32 len = cper_estatus_len(estatus); > + u32 max_len = min(ghes->generic->error_block_length, > + ghes->estatus_length); > + > + if (len < sizeof(*estatus)) { > + pr_warn_ratelimited(FW_WARN GHES_PFX "Truncated error status block!\n"); > + return -EIO; > + } > + > + if (!len || len > max_len) { Obviously this is just a move, but that if !len is silly given that will have failed the previous check as 0 is definitely less than sizeof(*estatus) Maybe add a trivial patch to tidy this up and any similar oddities. > + pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid error status block length!\n"); > + return -EIO; > + } > + > + if (cper_estatus_check_header(estatus)) { > + pr_warn_ratelimited(FW_WARN GHES_PFX "Invalid CPER header!\n"); > + return -EIO; > + } > + > + return 0; > +} > + > +/* Read the CPER block, returning its address, and header in estatus. */ > +int __ghes_peek_estatus(struct ghes *ghes, > + struct acpi_hest_generic_status *estatus, > + u64 *buf_paddr, enum fixed_addresses fixmap_idx) > +{ > + struct acpi_hest_generic *g = ghes->generic; > + int rc; > + > + rc = apei_read(buf_paddr, &g->error_status_address); > + if (rc) { > + *buf_paddr = 0; > + pr_warn_ratelimited(FW_WARN GHES_PFX > + "Failed to read error status block address for hardware error source: %d.\n", > + g->header.source_id); Whilst you are here I don't think anyone would mind if you fix the alignment. Looks like it's one space short. > + return -EIO; > + } > + if (!*buf_paddr) > + return -ENOENT; > + > + ghes_copy_tofrom_phys(estatus, *buf_paddr, sizeof(*estatus), 1, > + fixmap_idx); > + if (!estatus->block_status) { > + *buf_paddr = 0; > + return -ENOENT; > + } > + > + return 0; > +}