Skip to contentSkip to conversation

Add an API for edac device, for mulriple errors

PATCH Superseded Hanna Hawa 2 participants 5 messages Sep 12, 2019 – Sep 19, 2019 EDAC-core

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

Hanna Hawa

author
#0 lore raw

v2 cover Add an API for edac device, for mulriple errors

Add an API for EDAC device to report for multiple errors, and move the old report function to use the new API.

Changes from v1:
----------------
- use 'unsigned int' instead of u16
- update variable name to be count
- remove WARN_ON and simply exit if count is zero
- add inline functions in header file

Hanna Hawa (2):
edac: Add an API for edac device to report for multiple errors
edac: move edac_device_handle_*() API functions to header

 drivers/edac/edac_device.c | 72 ++++++++++++++++++++------------------
 drivers/edac/edac_device.h | 63 ++++++++++++++++++++++++---------
 2 files changed, 84 insertions(+), 51 deletions(-)
Signature · 1 line
2.17.1
author
#1 lore raw

PATCH v2 1/2 edac: Add an API for edac device to report for multiple errors

Add an API for EDAC device to report multiple errors with same type.

---
 drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
 drivers/edac/edac_device.h | 40 +++++++++++++++++
 2 files changed, 131 insertions(+)
drivers/edac/edac_device.c +91 -0
index 65cf2b9355c4..78ac44103acc 100644
@@ -643,3 +643,94 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
 			block ? block->name : "N/A", msg);
 }
 EXPORT_SYMBOL_GPL(edac_device_handle_ue);
+
+void __edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
+			     unsigned int count, int inst_nr, int block_nr,
+			     const char *msg)
+{
+	struct edac_device_instance *instance;
+	struct edac_device_block *block = NULL;
+
+	if (!count)
+		return;
+
+	if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
+		edac_device_printk(edac_dev, KERN_ERR,
+				   "INTERNAL ERROR: 'instance' out of range (%d >= %d)\n",
+				   inst_nr, edac_dev->nr_instances);
+		return;
+	}
+
+	instance = edac_dev->instances + inst_nr;
+
+	if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) {
+		edac_device_printk(edac_dev, KERN_ERR,
+				"INTERNAL ERROR: instance %d 'block' out of range (%d >= %d)\n",
+				inst_nr, block_nr, instance->nr_blocks);
+		return;
+	}
+
+	if (instance->nr_blocks > 0) {
+		block = instance->blocks + block_nr;
+		block->counters.ce_count += count;
+	}
+
+	/* Propagate the count up the 'totals' tree */
+	instance->counters.ce_count += count;
+	edac_dev->counters.ce_count += count;
+
+	if (edac_device_get_log_ce(edac_dev))
+		edac_device_printk(edac_dev, KERN_WARNING,
+				   "CE: %s instance: %s block: %s count: %d '%s'\n",
+				   edac_dev->ctl_name, instance->name,
+				   block ? block->name : "N/A", count, msg);
+}
+EXPORT_SYMBOL_GPL(__edac_device_handle_ce);
+
+void __edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
+			     unsigned int count, int inst_nr, int block_nr,
+			     const char *msg)
+{
+	struct edac_device_instance *instance;
+	struct edac_device_block *block = NULL;
+
+	if (!count)
+		return;
+
+	if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
+		edac_device_printk(edac_dev, KERN_ERR,
+				   "INTERNAL ERROR: 'instance' out of range (%d >= %d)\n",
+				   inst_nr, edac_dev->nr_instances);
+		return;
+	}
+
+	instance = edac_dev->instances + inst_nr;
+
+	if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) {
+		edac_device_printk(edac_dev, KERN_ERR,
+				   "INTERNAL ERROR: instance %d 'block' out of range (%d >= %d)\n",
+				   inst_nr, block_nr, instance->nr_blocks);
+		return;
+	}
+
+	if (instance->nr_blocks > 0) {
+		block = instance->blocks + block_nr;
+		block->counters.ue_count += count;
+	}
+
+	/* Propagate the count up the 'totals' tree */
+	instance->counters.ue_count += count;
+	edac_dev->counters.ue_count += count;
+
+	if (edac_device_get_log_ue(edac_dev))
+		edac_device_printk(edac_dev, KERN_EMERG,
+				   "UE: %s instance: %s block: %s count: %d '%s'\n",
+				   edac_dev->ctl_name, instance->name,
+				   block ? block->name : "N/A", count, msg);
+
+	if (edac_device_get_panic_on_ue(edac_dev))
+		panic("EDAC %s: UE instance: %s block %s count: %d '%s'\n",
+		      edac_dev->ctl_name, instance->name,
+		      block ? block->name : "N/A", count, msg);
+}
+EXPORT_SYMBOL_GPL(__edac_device_handle_ue);
drivers/edac/edac_device.h +40 -0
index 1aaba74ae411..30dc5f5979c8 100644
@@ -317,4 +317,44 @@ extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
 extern int edac_device_alloc_index(void);
 extern const char *edac_layer_name[];
 
+/**
+ * __edac_device_handle_ue():
+ *	perform a common output and handling of an 'edac_dev' UE event
+ *
+ * @edac_dev: pointer to struct &edac_device_ctl_info
+ * @error_count: number of errors of the same type
+ * @inst_nr: number of the instance where the UE error happened
+ * @block_nr: number of the block where the UE error happened
+ * @msg: message to be printed
+ */
+void __edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
+				    unsigned int count, int inst_nr,
+				    int block_nr, const char *msg);
+/**
+ * __edac_device_handle_ce():
+ *	perform a common output and handling of an 'edac_dev' CE event
+ *
+ * @edac_dev: pointer to struct &edac_device_ctl_info
+ * @error_count: number of errors of the same type
+ * @inst_nr: number of the instance where the CE error happened
+ * @block_nr: number of the block where the CE error happened
+ * @msg: message to be printed
+ */
+void __edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
+				    unsigned int count, int inst_nr,
+				    int block_nr, const char *msg);
+
+static inline void edac_device_handle_ce_count(struct edac_device_ctl_info *edac_dev,
+					       unsigned int count, int inst_nr,
+					       int block_nr, const char *msg)
+{
+	__edac_device_handle_ce(edac_dev, count, inst_nr, block_nr, msg);
+}
+
+static inline void edac_device_handle_ue_count(struct edac_device_ctl_info *edac_dev,
+					       unsigned int count, int inst_nr,
+					       int block_nr, const char *msg)
+{
+	__edac_device_handle_ue(edac_dev, count, inst_nr, block_nr, msg);
+}
 #endif
Signature · 1 line
2.17.1
#2 lore raw

Re: [PATCH v2 1/2] edac: Add an API for edac device to report for multiple errors

Quoted 13 lines · Hanna Hawa

Add an API for EDAC device to report multiple errors with same type.

---
 drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
 drivers/edac/edac_device.h | 40 +++++++++++++++++
 2 files changed, 131 insertions(+)
drivers/edac/edac_device.c +0 -0
index 65cf2b9355c4..78ac44103acc 100644

drivers/edac/edac_device.c void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, · line 650

Quoted 8 lines
drivers/edac/edac_device.c +5 -0
@@ -643,3 +643,94 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
 			block ? block->name : "N/A", msg);
 }
 EXPORT_SYMBOL_GPL(edac_device_handle_ue);
+
+void __edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
+			     unsigned int count, int inst_nr, int block_nr,
+			     const char *msg)
+{

Please do not add a copy here, instead modify the existing function and share the code with both, old and new functions.

Thanks,

-Robert

#3 lore raw

Re: [PATCH v2 1/2] edac: Add an API for edac device to report for multiple errors

Quoted 9 lines · Robert Richter
Quoted 8 lines · Hanna Hawa

Add an API for EDAC device to report multiple errors with same type.

---
  drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
  drivers/edac/edac_device.h | 40 +++++++++++++++++
  2 files changed, 131 insertions(+)
Quoted 16 lines

drivers/edac/edac_device.c void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, · line 650

Quoted 13 lines
drivers/edac/edac_device.c +5 -0
index 65cf2b9355c4..78ac44103acc 100644
@@ -643,3 +643,94 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
  			block ? block->name : "N/A", msg);
  }
  EXPORT_SYMBOL_GPL(edac_device_handle_ue);
+
+void __edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
+			     unsigned int count, int inst_nr, int block_nr,
+			     const char *msg)
+{

Please do not add a copy here, instead modify the existing function and share the code with both, old and new functions.

Will be fixed.

Quoted 5 lines

Thanks,

-Robert

author
#4 lore raw

PATCH v2 2/2 edac: move edac_device_handle_*() API functions to header

In reply to Hanna Hawa

Move edac_device_handle_*() functions from source file to header file as inline funtcion that use the new API with single error.

---
 drivers/edac/edac_device.c | 89 --------------------------------------
 drivers/edac/edac_device.h | 37 ++++++----------
 2 files changed, 14 insertions(+), 112 deletions(-)
drivers/edac/edac_device.c +0 -89
index 78ac44103acc..4f735c625c36 100644
@@ -555,95 +555,6 @@ static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info
 	return edac_dev->panic_on_ue;
 }
 
-void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
-			int inst_nr, int block_nr, const char *msg)
-{
-	struct edac_device_instance *instance;
-	struct edac_device_block *block = NULL;
-
-	if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
-		edac_device_printk(edac_dev, KERN_ERR,
-				"INTERNAL ERROR: 'instance' out of range "
-				"(%d >= %d)\n", inst_nr,
-				edac_dev->nr_instances);
-		return;
-	}
-
-	instance = edac_dev->instances + inst_nr;
-
-	if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) {
-		edac_device_printk(edac_dev, KERN_ERR,
-				"INTERNAL ERROR: instance %d 'block' "
-				"out of range (%d >= %d)\n",
-				inst_nr, block_nr,
-				instance->nr_blocks);
-		return;
-	}
-
-	if (instance->nr_blocks > 0) {
-		block = instance->blocks + block_nr;
-		block->counters.ce_count++;
-	}
-
-	/* Propagate the count up the 'totals' tree */
-	instance->counters.ce_count++;
-	edac_dev->counters.ce_count++;
-
-	if (edac_device_get_log_ce(edac_dev))
-		edac_device_printk(edac_dev, KERN_WARNING,
-				"CE: %s instance: %s block: %s '%s'\n",
-				edac_dev->ctl_name, instance->name,
-				block ? block->name : "N/A", msg);
-}
-EXPORT_SYMBOL_GPL(edac_device_handle_ce);
-
-void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
-			int inst_nr, int block_nr, const char *msg)
-{
-	struct edac_device_instance *instance;
-	struct edac_device_block *block = NULL;
-
-	if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
-		edac_device_printk(edac_dev, KERN_ERR,
-				"INTERNAL ERROR: 'instance' out of range "
-				"(%d >= %d)\n", inst_nr,
-				edac_dev->nr_instances);
-		return;
-	}
-
-	instance = edac_dev->instances + inst_nr;
-
-	if ((block_nr >= instance->nr_blocks) || (block_nr < 0)) {
-		edac_device_printk(edac_dev, KERN_ERR,
-				"INTERNAL ERROR: instance %d 'block' "
-				"out of range (%d >= %d)\n",
-				inst_nr, block_nr,
-				instance->nr_blocks);
-		return;
-	}
-
-	if (instance->nr_blocks > 0) {
-		block = instance->blocks + block_nr;
-		block->counters.ue_count++;
-	}
-
-	/* Propagate the count up the 'totals' tree */
-	instance->counters.ue_count++;
-	edac_dev->counters.ue_count++;
-
-	if (edac_device_get_log_ue(edac_dev))
-		edac_device_printk(edac_dev, KERN_EMERG,
-				"UE: %s instance: %s block: %s '%s'\n",
-				edac_dev->ctl_name, instance->name,
-				block ? block->name : "N/A", msg);
-
-	if (edac_device_get_panic_on_ue(edac_dev))
-		panic("EDAC %s: UE instance: %s block %s '%s'\n",
-			edac_dev->ctl_name, instance->name,
-			block ? block->name : "N/A", msg);
-}
-EXPORT_SYMBOL_GPL(edac_device_handle_ue);
-
 void __edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
 			     unsigned int count, int inst_nr, int block_nr,
 			     const char *msg)
drivers/edac/edac_device.h +14 -23
index 30dc5f5979c8..796ea134a691 100644
@@ -285,29 +285,6 @@ extern int edac_device_add_device(struct edac_device_ctl_info *edac_dev);
  */
 extern struct edac_device_ctl_info *edac_device_del_device(struct device *dev);
 
-/**
- * edac_device_handle_ue():
- *	perform a common output and handling of an 'edac_dev' UE event
- *
- * @edac_dev: pointer to struct &edac_device_ctl_info
- * @inst_nr: number of the instance where the UE error happened
- * @block_nr: number of the block where the UE error happened
- * @msg: message to be printed
- */
-extern void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
-				int inst_nr, int block_nr, const char *msg);
-/**
- * edac_device_handle_ce():
- *	perform a common output and handling of an 'edac_dev' CE event
- *
- * @edac_dev: pointer to struct &edac_device_ctl_info
- * @inst_nr: number of the instance where the CE error happened
- * @block_nr: number of the block where the CE error happened
- * @msg: message to be printed
- */
-extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
-				int inst_nr, int block_nr, const char *msg);
-
 /**
  * edac_device_alloc_index: Allocate a unique device index number
  *
@@ -357,4 +334,18 @@ static inline void edac_device_handle_ue_count(struct edac_device_ctl_info *edac
 {
 	__edac_device_handle_ue(edac_dev, count, inst_nr, block_nr, msg);
 }
+
+static inline void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
+					 int inst_nr, int block_nr,
+					 const char *msg)
+{
+	__edac_device_handle_ce(edac_dev, 1, inst_nr, block_nr, msg);
+}
+
+static inline void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
+					 int inst_nr, int block_nr,
+					 const char *msg)
+{
+	__edac_device_handle_ue(edac_dev, 1, inst_nr, block_nr, msg);
+}
 #endif
Signature · 1 line
2.17.1