Commit 9816b4af authored by Hanna Hawa's avatar Hanna Hawa Committed by Borislav Petkov

EDAC/device: Rework error logging API

Make the main workhorse the "count" functions which can log a @count
of errors. Have the current APIs edac_device_handle_{ce,ue}() call
the _count() variants and this way keep the exported symbols number
unchanged.

 [ bp: Rewrite. ]
Signed-off-by: default avatarHanna Hawa <hhhawa@amazon.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Cc: benh@amazon.com
Cc: dwmw@amazon.co.uk
Cc: hanochu@amazon.com
Cc: James Morse <james.morse@arm.com>
Cc: jonnyc@amazon.com
Cc: linux-edac <linux-edac@vger.kernel.org>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: ronenk@amazon.com
Cc: talel@amazon.com
Cc: Tony Luck <tony.luck@intel.com>
Link: https://lkml.kernel.org/r/20190923191741.29322-2-hhhawa@amazon.com
parent f05390d3
...@@ -555,12 +555,16 @@ static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info ...@@ -555,12 +555,16 @@ static inline int edac_device_get_panic_on_ue(struct edac_device_ctl_info
return edac_dev->panic_on_ue; return edac_dev->panic_on_ue;
} }
void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, void edac_device_handle_ce_count(struct edac_device_ctl_info *edac_dev,
int inst_nr, int block_nr, const char *msg) unsigned int count, int inst_nr, int block_nr,
const char *msg)
{ {
struct edac_device_instance *instance; struct edac_device_instance *instance;
struct edac_device_block *block = NULL; struct edac_device_block *block = NULL;
if (!count)
return;
if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
edac_device_printk(edac_dev, KERN_ERR, edac_device_printk(edac_dev, KERN_ERR,
"INTERNAL ERROR: 'instance' out of range " "INTERNAL ERROR: 'instance' out of range "
...@@ -582,27 +586,31 @@ void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, ...@@ -582,27 +586,31 @@ void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
if (instance->nr_blocks > 0) { if (instance->nr_blocks > 0) {
block = instance->blocks + block_nr; block = instance->blocks + block_nr;
block->counters.ce_count++; block->counters.ce_count += count;
} }
/* Propagate the count up the 'totals' tree */ /* Propagate the count up the 'totals' tree */
instance->counters.ce_count++; instance->counters.ce_count += count;
edac_dev->counters.ce_count++; edac_dev->counters.ce_count += count;
if (edac_device_get_log_ce(edac_dev)) if (edac_device_get_log_ce(edac_dev))
edac_device_printk(edac_dev, KERN_WARNING, edac_device_printk(edac_dev, KERN_WARNING,
"CE: %s instance: %s block: %s '%s'\n", "CE: %s instance: %s block: %s count: %d '%s'\n",
edac_dev->ctl_name, instance->name, edac_dev->ctl_name, instance->name,
block ? block->name : "N/A", msg); block ? block->name : "N/A", count, msg);
} }
EXPORT_SYMBOL_GPL(edac_device_handle_ce); EXPORT_SYMBOL_GPL(edac_device_handle_ce_count);
void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, void edac_device_handle_ue_count(struct edac_device_ctl_info *edac_dev,
int inst_nr, int block_nr, const char *msg) unsigned int count, int inst_nr, int block_nr,
const char *msg)
{ {
struct edac_device_instance *instance; struct edac_device_instance *instance;
struct edac_device_block *block = NULL; struct edac_device_block *block = NULL;
if (!count)
return;
if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) { if ((inst_nr >= edac_dev->nr_instances) || (inst_nr < 0)) {
edac_device_printk(edac_dev, KERN_ERR, edac_device_printk(edac_dev, KERN_ERR,
"INTERNAL ERROR: 'instance' out of range " "INTERNAL ERROR: 'instance' out of range "
...@@ -624,22 +632,22 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, ...@@ -624,22 +632,22 @@ void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev,
if (instance->nr_blocks > 0) { if (instance->nr_blocks > 0) {
block = instance->blocks + block_nr; block = instance->blocks + block_nr;
block->counters.ue_count++; block->counters.ue_count += count;
} }
/* Propagate the count up the 'totals' tree */ /* Propagate the count up the 'totals' tree */
instance->counters.ue_count++; instance->counters.ue_count += count;
edac_dev->counters.ue_count++; edac_dev->counters.ue_count += count;
if (edac_device_get_log_ue(edac_dev)) if (edac_device_get_log_ue(edac_dev))
edac_device_printk(edac_dev, KERN_EMERG, edac_device_printk(edac_dev, KERN_EMERG,
"UE: %s instance: %s block: %s '%s'\n", "UE: %s instance: %s block: %s count: %d '%s'\n",
edac_dev->ctl_name, instance->name, edac_dev->ctl_name, instance->name,
block ? block->name : "N/A", msg); block ? block->name : "N/A", count, msg);
if (edac_device_get_panic_on_ue(edac_dev)) if (edac_device_get_panic_on_ue(edac_dev))
panic("EDAC %s: UE instance: %s block %s '%s'\n", panic("EDAC %s: UE instance: %s block %s count: %d '%s'\n",
edac_dev->ctl_name, instance->name, edac_dev->ctl_name, instance->name,
block ? block->name : "N/A", msg); block ? block->name : "N/A", count, msg);
} }
EXPORT_SYMBOL_GPL(edac_device_handle_ue); EXPORT_SYMBOL_GPL(edac_device_handle_ue_count);
...@@ -286,27 +286,60 @@ extern int edac_device_add_device(struct edac_device_ctl_info *edac_dev); ...@@ -286,27 +286,60 @@ 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); extern struct edac_device_ctl_info *edac_device_del_device(struct device *dev);
/** /**
* edac_device_handle_ue(): * Log correctable errors.
* perform a common output and handling of an 'edac_dev' UE event
* *
* @edac_dev: pointer to struct &edac_device_ctl_info * @edac_dev: pointer to struct &edac_device_ctl_info
* @inst_nr: number of the instance where the UE error happened * @inst_nr: number of the instance where the CE error happened
* @block_nr: number of the block where the UE error happened * @count: Number of errors to log.
* @block_nr: number of the block where the CE error happened
* @msg: message to be printed
*/
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);
/**
* Log uncorrectable errors.
*
* @edac_dev: pointer to struct &edac_device_ctl_info
* @inst_nr: number of the instance where the CE error happened
* @count: Number of errors to log.
* @block_nr: number of the block where the CE error happened
* @msg: message to be printed * @msg: message to be printed
*/ */
extern void edac_device_handle_ue(struct edac_device_ctl_info *edac_dev, void edac_device_handle_ue_count(struct edac_device_ctl_info *edac_dev,
int inst_nr, int block_nr, const char *msg); unsigned int count, int inst_nr, int block_nr,
const char *msg);
/** /**
* edac_device_handle_ce(): * edac_device_handle_ce(): Log a single correctable error
* perform a common output and handling of an 'edac_dev' CE event
* *
* @edac_dev: pointer to struct &edac_device_ctl_info * @edac_dev: pointer to struct &edac_device_ctl_info
* @inst_nr: number of the instance where the CE error happened * @inst_nr: number of the instance where the CE error happened
* @block_nr: number of the block where the CE error happened * @block_nr: number of the block where the CE error happened
* @msg: message to be printed * @msg: message to be printed
*/ */
extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, static inline void
int inst_nr, int block_nr, const char *msg); edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, int inst_nr,
int block_nr, const char *msg)
{
edac_device_handle_ce_count(edac_dev, 1, inst_nr, block_nr, msg);
}
/**
* edac_device_handle_ue(): Log a single uncorrectable error
*
* @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
*/
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_count(edac_dev, 1, inst_nr, block_nr, msg);
}
/** /**
* edac_device_alloc_index: Allocate a unique device index number * edac_device_alloc_index: Allocate a unique device index number
...@@ -316,5 +349,4 @@ extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev, ...@@ -316,5 +349,4 @@ extern void edac_device_handle_ce(struct edac_device_ctl_info *edac_dev,
*/ */
extern int edac_device_alloc_index(void); extern int edac_device_alloc_index(void);
extern const char *edac_layer_name[]; extern const char *edac_layer_name[];
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment