Add an API for edac device, for mulriple errors
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
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
@@ -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
@@ -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
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.
Signed-off-by Hanna Hawa <[email protected]>--- drivers/edac/edac_device.c | 91 ++++++++++++++++++++++++++++++++++++++ drivers/edac/edac_device.h | 40 +++++++++++++++++ 2 files changed, 131 insertions(+)drivers/edac/edac_device.c +0
-0
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
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.
Signed-off-by Hanna Hawa <[email protected]>--- 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@@ -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
PATCH v2 2/2 edac: move edac_device_handle_*() API functions to header
In reply to Hanna HawaMove 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
@@ -555,95 +555,6 @@ static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_inforeturn 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
@@ -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