From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: unlisted-recipients:; (no To-header on input)
Cc: Mauro Carvalho Chehab <mchehab@redhat.com>,
Linux Edac Mailing List <linux-edac@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH v3 31/31] edac: Fix per layer error count counters
Date: Thu, 9 Feb 2012 22:01:30 -0200 [thread overview]
Message-ID: <1328832090-9166-32-git-send-email-mchehab@redhat.com> (raw)
In-Reply-To: <1328832090-9166-1-git-send-email-mchehab@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
drivers/edac/edac_mc.c | 21 ++++++++++++++-------
drivers/edac/edac_mc_sysfs.c | 25 ++++++++++++++-----------
2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index 6714b36..1eeecf7 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -247,10 +247,13 @@ struct mem_ctl_info *edac_mc_alloc(unsigned edac_index,
count = 1;
for (i = 0; i < n_layers; i++) {
count *= layers[i].size;
- ce_per_layer[i] = edac_align_ptr(&ptr, sizeof(unsigned), count);
- ue_per_layer[i] = edac_align_ptr(&ptr, sizeof(unsigned), count);
+ debugf4("%s: errcount layer %d size %d\n", __func__, i, count);
+ ce_per_layer[i] = edac_align_ptr(&ptr, sizeof(u32), count);
+ ue_per_layer[i] = edac_align_ptr(&ptr, sizeof(u32), count);
tot_errcount += 2 * count;
}
+
+ debugf4("%s: allocating %d error counters\n", __func__, tot_errcount);
erc = edac_align_ptr(&ptr, sizeof(*erc), tot_errcount);
ercd = edac_align_ptr(&ptr, sizeof(*ercd), tot_errcount);
pvt = edac_align_ptr(&ptr, sz_pvt, 1);
@@ -872,7 +875,9 @@ static void edac_increment_ce_error(struct mem_ctl_info *mci,
break;
index += pos[i];
mci->ce_per_layer[i][index]++;
- index *= mci->layers[i].size;
+
+ if (i < mci->n_layers - 1)
+ index *= mci->layers[i + 1].size;
}
}
@@ -894,7 +899,9 @@ static void edac_increment_ue_error(struct mem_ctl_info *mci,
break;
index += pos[i];
mci->ue_per_layer[i][index]++;
- index *= mci->layers[i].size;
+
+ if (i < mci->n_layers - 1)
+ index *= mci->layers[i + 1].size;
}
}
@@ -912,9 +919,8 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
{
unsigned long remapped_page;
/* FIXME: too much for stack: move it to some pre-alocated area */
- char detail[80 + strlen(other_detail)];
+ char detail[80], location[80];
char label[(EDAC_MC_LABEL_LEN + 2) * mci->tot_dimms], *p;
- char location[80];
int row = -1, chan = -1;
int pos[EDAC_MAX_LAYERS] = { layer0, layer1, layer2 };
int i;
@@ -1001,8 +1007,9 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
*/
if (enable_filter) {
strcpy(p, dimm->label);
- p[strlen(p)] = ' ';
p = p + strlen(p);
+ *p = ' ';
+ p++;
*p = '\0';
/*
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index 1d4ee32..1c3d1ed 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -628,8 +628,8 @@ static ssize_t mci_reset_counters_store(struct mem_ctl_info *mci,
cnt = 1;
for (i = 0; i < mci->n_layers; i++) {
cnt *= mci->layers[i].size;
- memset(mci->ce_per_layer[i], 0, cnt);
- memset(mci->ue_per_layer[i], 0, cnt);
+ memset(mci->ce_per_layer[i], 0, cnt * sizeof(u32));
+ memset(mci->ue_per_layer[i], 0, cnt * sizeof(u32));
}
mci->start_time = jiffies;
@@ -866,11 +866,12 @@ static ssize_t errcount_ce_show(struct mem_ctl_info *mci, char *data,
struct errcount_attribute_data *ead = priv;
int i, index = 0;
- for (i = 0; i < ead->n_layers - 1; i++) {
- index += ead->pos[i];
- index *= mci->layers[i].size;
+ for (i = 0; i < ead->n_layers; i++) {
+ if (i < ead->n_layers - 1)
+ index += mci->layers[i + 1].size * ead->pos[i];
+ else
+ index += ead->pos[i];
}
- index += ead->pos[i];
return sprintf(data, "%u\n",
mci->ce_per_layer[ead->n_layers - 1][index]);
}
@@ -881,12 +882,12 @@ static ssize_t errcount_ue_show(struct mem_ctl_info *mci, char *data,
struct errcount_attribute_data *ead = priv;
int i, index = 0;
-
- for (i = 0; i < ead->n_layers - 1; i++) {
- index += ead->pos[i];
- index *= mci->layers[i].size;
+ for (i = 0; i < ead->n_layers; i++) {
+ if (i < ead->n_layers - 1)
+ index += mci->layers[i + 1].size * ead->pos[i];
+ else
+ index += ead->pos[i];
}
- index += ead->pos[i];
return sprintf(data, "%u\n",
mci->ue_per_layer[ead->n_layers - 1][index]);
}
@@ -949,6 +950,7 @@ static int edac_create_errcount_layer(struct mem_ctl_info *mci,
(*erc)++;
(*ercd)++;
}
+
return 0;
}
@@ -981,6 +983,7 @@ static int edac_create_errcount_objects(struct mem_ctl_info *mci)
if (err < 0)
goto err;
}
+ debugf4("%s: created %d objects\n", __func__, (unsigned)(erc - mci->errcount_attr));
return 0;
err:
edac_remove_errcount(mci);
--
1.7.8
next prev parent reply other threads:[~2012-02-10 0:02 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-10 0:00 [PATCH v3 00/31] Hardware Events Report Mecanism (HERM) Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 01/31] events/hw_event: Create a " Mauro Carvalho Chehab
2012-02-10 13:41 ` Borislav Petkov
2012-02-10 14:17 ` Mauro Carvalho Chehab
2012-02-12 12:48 ` Borislav Petkov
2012-02-12 17:21 ` Mauro Carvalho Chehab
2012-02-12 18:44 ` Borislav Petkov
2012-02-12 19:38 ` Mauro Carvalho Chehab
2012-02-13 9:21 ` Borislav Petkov
2012-02-13 10:23 ` Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 02/31] events/hw_event: use __string() trace macros for events Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 03/31] hw_event: Consolidate uncorrected/corrected error msgs into one Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 04/31] drivers/edac: rename channel_info to csrow_channel_info Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 05/31] edac: Create a dimm struct and move the labels into it Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 06/31] edac: Add per dimm's sysfs nodes Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 07/31] edac: Prepare to push down to drivers the filling of the dimm_info Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 08/31] edac: Better describe the memory concepts The memory terms changed along the time, since when EDAC were originally written: new concepts were introduced, and some things have different meanings, depending on the memory architecture. Better define those terms, and better describe each supported memory type Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 09/31] i5400_edac: Convert it to report memory with the new location Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 10/31] i7300_edac: " Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 11/31] edac: move dimm properties to struct dimm_info Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 12/31] edac: Don't initialize csrow's first_page & friends when not needed Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 13/31] edac: move nr_pages to dimm struct Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 14/31] edac: Add per-dimm sysfs show nodes Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 15/31] edac: DIMM location cleanup Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 16/31] edac/ppc4xx_edac: Fix compilation Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 17/31] edac-mc: Allow reporting errors on a non-csrow oriented way Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 18/31] edac.h: Use kernel-doc-nano-HOWTO.txt notation for enums Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 19/31] edac: rework memory layer hierarchy description Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 20/31] edac: Export MC hierarchy counters for CE and UE Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 21/31] hw_event: Add x86 MCE events on it Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 22/31] amd64_edac: convert it to use the MCE log tracepoint where applicable Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 23/31] edac: Simplify logs for i7core and sb edac drivers Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 24/31] edac_mc: Some clenups at the log message Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 25/31] edac: Add a sysfs node to test the EDAC error report facility Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 26/31] edac_mc: Fix the enable label filter logic Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 27/31] edac: Initialize the dimm label with the known information Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 28/31] edac: don't OOPS if the csrow is not visible Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 29/31] edac: Fix sysfs csrow?/*ce*count counters Mauro Carvalho Chehab
2012-02-10 0:01 ` [PATCH v3 30/31] edac: Fix new error counts Mauro Carvalho Chehab
2012-02-10 0:01 ` Mauro Carvalho Chehab [this message]
2012-02-10 13:26 ` [PATCH v3 00/31] Hardware Events Report Mecanism (HERM) Borislav Petkov
2012-02-10 16:39 ` Mauro Carvalho Chehab
2012-02-12 12:08 ` Borislav Petkov
2012-02-12 17:10 ` Mauro Carvalho Chehab
2012-02-13 21:29 ` Luck, Tony
2012-02-10 16:48 ` [PATCH v3 32/31] edac: restore mce.h file Mauro Carvalho Chehab
2012-02-13 9:23 ` [PATCH v3 00/31] Hardware Events Report Mecanism (HERM) Mauro Carvalho Chehab
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=1328832090-9166-32-git-send-email-mchehab@redhat.com \
--to=mchehab@redhat.com \
--cc=linux-edac@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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 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).