lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1328832090-9166-32-git-send-email-mchehab@redhat.com>
Date:	Thu,  9 Feb 2012 22:01:30 -0200
From:	Mauro Carvalho Chehab <mchehab@...hat.com>
To:	unlisted-recipients:; (no To-header on input)
Cc:	Mauro Carvalho Chehab <mchehab@...hat.com>,
	Linux Edac Mailing List <linux-edac@...r.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: [PATCH v3 31/31] edac: Fix per layer error count counters

Signed-off-by: Mauro Carvalho Chehab <mchehab@...hat.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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ