2019-09-12 14:56:32

by Hanna Hawa

[permalink] [raw]
Subject: [PATCH v2 0/2] 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(-)

--
2.17.1


2019-09-12 14:57:37

by Hanna Hawa

[permalink] [raw]
Subject: [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.

Signed-off-by: Hanna Hawa <[email protected]>
---
drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
drivers/edac/edac_device.h | 40 +++++++++++++++++
2 files changed, 131 insertions(+)

diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c
index 65cf2b9355c4..78ac44103acc 100644
--- a/drivers/edac/edac_device.c
+++ b/drivers/edac/edac_device.c
@@ -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);
diff --git a/drivers/edac/edac_device.h b/drivers/edac/edac_device.h
index 1aaba74ae411..30dc5f5979c8 100644
--- a/drivers/edac/edac_device.h
+++ b/drivers/edac/edac_device.h
@@ -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
--
2.17.1

2019-09-12 14:58:06

by Hanna Hawa

[permalink] [raw]
Subject: [PATCH v2 2/2] edac: move edac_device_handle_*() API functions to header

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

Signed-off-by: Hanna Hawa <[email protected]>
---
drivers/edac/edac_device.c | 89 --------------------------------------
drivers/edac/edac_device.h | 37 ++++++----------
2 files changed, 14 insertions(+), 112 deletions(-)

diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c
index 78ac44103acc..4f735c625c36 100644
--- a/drivers/edac/edac_device.c
+++ b/drivers/edac/edac_device.c
@@ -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)
diff --git a/drivers/edac/edac_device.h b/drivers/edac/edac_device.h
index 30dc5f5979c8..796ea134a691 100644
--- a/drivers/edac/edac_device.h
+++ b/drivers/edac/edac_device.h
@@ -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
--
2.17.1

2019-09-19 10:29:09

by Robert Richter

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

On 12.09.19 15:53:04, Hanna Hawa wrote:
> Add an API for EDAC device to report multiple errors with same type.
>
> Signed-off-by: Hanna Hawa <[email protected]>
> ---
> drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
> drivers/edac/edac_device.h | 40 +++++++++++++++++
> 2 files changed, 131 insertions(+)
>
> diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c
> index 65cf2b9355c4..78ac44103acc 100644
> --- a/drivers/edac/edac_device.c
> +++ b/drivers/edac/edac_device.c
> @@ -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

2019-09-19 10:31:14

by Hanna Hawa

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



On 9/19/2019 9:33 AM, Robert Richter wrote:
> On 12.09.19 15:53:04, Hanna Hawa wrote:
>> Add an API for EDAC device to report multiple errors with same type.
>>
>> Signed-off-by: Hanna Hawa <[email protected]>
>> ---
>> drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++
>> drivers/edac/edac_device.h | 40 +++++++++++++++++
>> 2 files changed, 131 insertions(+)
>>
>> diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c
>> index 65cf2b9355c4..78ac44103acc 100644
>> --- a/drivers/edac/edac_device.c
>> +++ b/drivers/edac/edac_device.c
>> @@ -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.

>
> Thanks,
>
> -Robert
>