From: Borislav Petkov <bp@alien8.de>
To: "Chen, Gong" <gong.chen@linux.intel.com>
Cc: tony.luck@intel.com, m.chehab@samsung.com, rostedt@goodmis.org,
linux-acpi@vger.kernel.org, arozansk@redhat.com
Subject: Re: [PATCH 2/5] CPER: Adjust code flow of some functions
Date: Mon, 14 Apr 2014 15:39:24 +0200 [thread overview]
Message-ID: <20140414133924.GC3663@pd.tnic> (raw)
In-Reply-To: <1395985981-20476-3-git-send-email-gong.chen@linux.intel.com>
On Fri, Mar 28, 2014 at 01:52:58AM -0400, Chen, Gong wrote:
> Some codes can be reorganzied as a common function for
> other usages. No functional changes.
>
> Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
> ---
> drivers/firmware/efi/cper.c | 134 +++++++++++++++++++++++++++++++++-----------
> include/linux/cper.h | 7 +++
> 2 files changed, 108 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
> index 1491dd4..4e88885 100644
> --- a/drivers/firmware/efi/cper.c
> +++ b/drivers/firmware/efi/cper.c
> @@ -34,6 +34,12 @@
> #include <linux/aer.h>
>
> #define INDENT_SP " "
> +DEFINE_RAW_SPINLOCK(cper_loc_lock);
> +EXPORT_SYMBOL_GPL(cper_loc_lock);
Definitely a bad idea to export a spinlock. If all you need is to sync
against multiple callers of cper_mem_err_location(), simply grab that
spinlock in the function itself, without exporting it.
> +
> +static char mem_location[CPER_REC_LEN];
> +static char dimm_location[CPER_REC_LEN];
> +
> /*
> * CPER record ID need to be unique even after reboot, because record
> * ID is used as index for ERST storage, while CPER records from
> @@ -57,11 +63,12 @@ static const char *cper_severity_strs[] = {
> "info",
> };
>
> -static const char *cper_severity_str(unsigned int severity)
> +const char *cper_severity_str(unsigned int severity)
> {
> return severity < ARRAY_SIZE(cper_severity_strs) ?
> cper_severity_strs[severity] : "unknown";
> }
> +EXPORT_SYMBOL_GPL(cper_severity_str);
>
> * cper_print_bits - print strings for set bits
> @@ -196,55 +203,116 @@ static const char *cper_mem_err_type_strs[] = {
> "physical memory map-out event",
> };
>
> -static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem)
> +const char *cper_mem_err_type_str(unsigned int etype)
> {
> - if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
> - printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
> - if (mem->validation_bits & CPER_MEM_VALID_PA)
> - printk("%s""physical_address: 0x%016llx\n",
> - pfx, mem->physical_addr);
> - if (mem->validation_bits & CPER_MEM_VALID_PA_MASK)
> - printk("%s""physical_address_mask: 0x%016llx\n",
> - pfx, mem->physical_addr_mask);
> + return etype < ARRAY_SIZE(cper_mem_err_type_strs) ?
> + cper_mem_err_type_strs[etype] : "unknown";
> +}
> +EXPORT_SYMBOL_GPL(cper_mem_err_type_str);
> +
> +char *cper_mem_err_location(const struct cper_sec_mem_err *mem)
> +{
> + char *p;
> + u32 n = 0;
> +
> + memset(mem_location, 0, CPER_REC_LEN);
> + p = mem_location;
> if (mem->validation_bits & CPER_MEM_VALID_NODE)
> - pr_debug("node: %d\n", mem->node);
> + n += sprintf(p + n, " node: %d", mem->node);
> + if (n >= CPER_REC_LEN)
> + goto end;
n += vscnprintf(p + n, CPER_REC_LEN - n - 1, "... ", ...);
and you can drop those
if (n >= CPER_REC_LEN)
tests.
vscnprintf() because it returns the actual number of characters written
and not what snprintf does and return the chars count it would've
written. (Thx Richard for the hint!).
> if (mem->validation_bits & CPER_MEM_VALID_CARD)
> - pr_debug("card: %d\n", mem->card);
> + n += sprintf(p + n, " card: %d", mem->card);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_MODULE)
> - pr_debug("module: %d\n", mem->module);
> + n += sprintf(p + n, " module: %d", mem->module);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_RANK_NUMBER)
> - pr_debug("rank: %d\n", mem->rank);
> + n += sprintf(p + n, " rank: %d", mem->rank);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_BANK)
> - pr_debug("bank: %d\n", mem->bank);
> + n += sprintf(p + n, " bank: %d", mem->bank);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_DEVICE)
> - pr_debug("device: %d\n", mem->device);
> + n += sprintf(p + n, " device: %d", mem->device);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_ROW)
> - pr_debug("row: %d\n", mem->row);
> + n += sprintf(p + n, " row: %d", mem->row);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_COLUMN)
> - pr_debug("column: %d\n", mem->column);
> + n += sprintf(p + n, " column: %d", mem->column);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_BIT_POSITION)
> - pr_debug("bit_position: %d\n", mem->bit_pos);
> + n += sprintf(p + n, " bit_position: %d", mem->bit_pos);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_REQUESTOR_ID)
> - pr_debug("requestor_id: 0x%016llx\n", mem->requestor_id);
> + n += sprintf(p + n, " requestor_id: 0x%016llx",
> + mem->requestor_id);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_RESPONDER_ID)
> - pr_debug("responder_id: 0x%016llx\n", mem->responder_id);
> + n += sprintf(p + n, " responder_id: 0x%016llx",
> + mem->responder_id);
> + if (n >= CPER_REC_LEN)
> + goto end;
> if (mem->validation_bits & CPER_MEM_VALID_TARGET_ID)
> - pr_debug("target_id: 0x%016llx\n", mem->target_id);
> + n += sprintf(p + n, " target_id: 0x%016llx", mem->target_id);
> +end:
> + return mem_location;
> +}
> +EXPORT_SYMBOL_GPL(cper_mem_err_location);
> +
> +char *cper_dimm_err_location(const struct cper_sec_mem_err *mem)
> +{
> + const char *bank = NULL, *device = NULL;
> +
> + memset(dimm_location, 0, CPER_REC_LEN);
> + if (!(mem->validation_bits & CPER_MEM_VALID_MODULE_HANDLE))
> + goto end;
a goto label which is used only once?? What's wrong with
return dimm_location;
?
> +
> + dmi_memdev_name(mem->mem_dev_handle, &bank, &device);
> + if (bank != NULL && device != NULL)
if (bank && device)
> + snprintf(dimm_location, CPER_REC_LEN - 1,
> + "DIMM location: %s %s", bank, device);
> + else
> + snprintf(dimm_location, CPER_REC_LEN - 1, "DMI handle: 0x%.4x",
Why the DMI handle? Why not say: "unable to find location" or "location
not present in DMI" or something more user-friendly.
> + mem->mem_dev_handle);
> +end:
> + return dimm_location;
> +}
> +EXPORT_SYMBOL_GPL(cper_dimm_err_location);
> +
> +static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem)
> +{
> + unsigned long flags;
> +
> + if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
> + printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
> + if (mem->validation_bits & CPER_MEM_VALID_PA)
> + printk("%s""physical_address: 0x%016llx\n",
> + pfx, mem->physical_addr);
> + if (mem->validation_bits & CPER_MEM_VALID_PA_MASK)
> + printk("%s""physical_address_mask: 0x%016llx\n",
> + pfx, mem->physical_addr_mask);
> + raw_spin_lock_irqsave(&cper_loc_lock, flags);
> + pr_debug("%s", cper_mem_err_location(mem));
> + raw_spin_unlock_irqrestore(&cper_loc_lock, flags);
> if (mem->validation_bits & CPER_MEM_VALID_ERROR_TYPE) {
> u8 etype = mem->error_type;
> printk("%s""error_type: %d, %s\n", pfx, etype,
> - etype < ARRAY_SIZE(cper_mem_err_type_strs) ?
> - cper_mem_err_type_strs[etype] : "unknown");
> - }
> - if (mem->validation_bits & CPER_MEM_VALID_MODULE_HANDLE) {
> - const char *bank = NULL, *device = NULL;
> - dmi_memdev_name(mem->mem_dev_handle, &bank, &device);
> - if (bank != NULL && device != NULL)
> - printk("%s""DIMM location: %s %s", pfx, bank, device);
> - else
> - printk("%s""DIMM DMI handle: 0x%.4x",
> - pfx, mem->mem_dev_handle);
> + cper_mem_err_type_str(etype));
> }
> + raw_spin_lock_irqsave(&cper_loc_lock, flags);
> + printk("%s%s", pfx, cper_dimm_err_location(mem));
> + raw_spin_unlock_irqrestore(&cper_loc_lock, flags);
> }
>
> static const char *cper_pcie_port_type_strs[] = {
> diff --git a/include/linux/cper.h b/include/linux/cper.h
> index 2fc0ec3..55c10db 100644
> --- a/include/linux/cper.h
> +++ b/include/linux/cper.h
> @@ -23,6 +23,8 @@
>
> #include <linux/uuid.h>
>
> +extern struct raw_spinlock cper_loc_lock;
> +
> /* CPER record signature and the size */
> #define CPER_SIG_RECORD "CPER"
> #define CPER_SIG_SIZE 4
> @@ -35,6 +37,7 @@
> */
> #define CPER_RECORD_REV 0x0100
>
> +#define CPER_REC_LEN 512
How did we come up with this? Some spec? 512 chars for an error record?
That's a bit too much in my book.
Thanks.
--
Regards/Gruss,
Boris.
Sent from a fat crate under my desk. Formatting is fine.
--
next prev parent reply other threads:[~2014-04-14 13:39 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-28 5:52 Add new eMCA trace event interface Chen, Gong
2014-03-28 5:52 ` [PATCH 1/5] trace, RAS: Add basic RAS trace event Chen, Gong
2014-04-09 19:46 ` Borislav Petkov
2014-04-14 3:20 ` Chen, Gong
2014-04-14 10:46 ` Borislav Petkov
2014-04-16 6:33 ` Chen, Gong
2014-04-16 13:10 ` Borislav Petkov
2014-03-28 5:52 ` [PATCH 2/5] CPER: Adjust code flow of some functions Chen, Gong
2014-04-14 13:39 ` Borislav Petkov [this message]
2014-04-14 14:05 ` Borislav Petkov
2014-04-15 9:24 ` Chen, Gong
2014-04-15 18:02 ` Borislav Petkov
2014-04-16 5:01 ` Chen, Gong
2014-04-16 13:14 ` Borislav Petkov
2014-04-15 9:19 ` Chen, Gong
2014-04-15 18:05 ` Borislav Petkov
2014-04-16 6:23 ` Chen, Gong
2014-04-16 13:28 ` Borislav Petkov
2014-04-17 3:00 ` Chen, Gong
2014-03-28 5:52 ` [PATCH 3/5] trace, RAS: Add eMCA trace event interface Chen, Gong
2014-03-28 5:53 ` [PATCH 4/5] trace, eMCA: Add a knob to adjust where to save event log Chen, Gong
2014-04-03 23:46 ` Tony Luck
2014-04-04 8:05 ` Chen, Gong
2014-04-08 7:59 ` [PATCH 4/5 v2] " Chen, Gong
2014-03-28 5:53 ` [PATCH 5/5] trace, AER: Move trace into unified interface Chen, Gong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140414133924.GC3663@pd.tnic \
--to=bp@alien8.de \
--cc=arozansk@redhat.com \
--cc=gong.chen@linux.intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=m.chehab@samsung.com \
--cc=rostedt@goodmis.org \
--cc=tony.luck@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.