mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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: Hanna Hawa <hhhawa@amazon.com> Signed-off-by: Borislav 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
This commit is contained in:
committed by
Borislav Petkov
parent
f05390d30e
commit
9816b4af43
@@ -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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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);
|
|||||||
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
|
* @msg: message to be printed
|
||||||
*/
|
*/
|
||||||
extern void edac_device_handle_ue(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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* edac_device_handle_ce():
|
* Log uncorrectable errors.
|
||||||
* 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
|
||||||
|
* @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_ue_count(struct edac_device_ctl_info *edac_dev,
|
||||||
|
unsigned int count, int inst_nr, int block_nr,
|
||||||
|
const char *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edac_device_handle_ce(): Log a single correctable error
|
||||||
*
|
*
|
||||||
* @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,
|
|||||||
*/
|
*/
|
||||||
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
|
||||||
|
Reference in New Issue
Block a user