EDAC log cleanups
Subsystems (16)
cover EDAC log cleanups
Do some cleanups at the error logs:
- amd64_edac: don't print driver's name at the error strings;
- arch parameter is never used. Remove it from edac_mc_handle_error();
- Add error count parameter to edac_mc_handle_error();
- Use the error count parameter on sb_edac/i7core_edac.
Mauro Carvalho Chehab (5):
amd64_edac: Don't pass driver name as an error parameter
edac: remove arch-specific parameter for the error handler
edac: allow to specify how many errors were received
i7core_edac: properly handle error count
sb_edac: properly handle error count
drivers/edac/amd64_edac.c | 53 +++++++++++++++++----------------------- drivers/edac/amd76x_edac.c | 8 +++--- drivers/edac/cell_edac.c | 8 +++--- drivers/edac/cpc925_edac.c | 8 +++--- drivers/edac/e752x_edac.c | 16 ++++++------ drivers/edac/e7xxx_edac.c | 16 ++++++------ drivers/edac/edac_core.h | 4 +-- drivers/edac/edac_mc.c | 32 ++++++++++++------------ drivers/edac/edac_mc_sysfs.c | 4 +-- drivers/edac/i3000_edac.c | 12 ++++----- drivers/edac/i3200_edac.c | 12 ++++----- drivers/edac/i5000_edac.c | 16 ++++++------ drivers/edac/i5100_edac.c | 8 +++--- drivers/edac/i5400_edac.c | 8 +++--- drivers/edac/i7300_edac.c | 8 +++--- drivers/edac/i7core_edac.c | 33 +++++++++---------------- drivers/edac/i82443bxgx_edac.c | 8 +++--- drivers/edac/i82860_edac.c | 12 ++++----- drivers/edac/i82875p_edac.c | 12 ++++----- drivers/edac/i82975x_edac.c | 12 ++++----- drivers/edac/mpc85xx_edac.c | 8 +++--- drivers/edac/mv64x60_edac.c | 8 +++--- drivers/edac/pasemi_edac.c | 8 +++--- drivers/edac/ppc4xx_edac.c | 8 +++--- drivers/edac/r82600_edac.c | 8 +++--- drivers/edac/sb_edac.c | 11 ++++----- drivers/edac/tile_edac.c | 4 +-- drivers/edac/x38_edac.c | 12 ++++----- 28 files changed, 171 insertions(+), 186 deletions(-)
Signature · 1 line
1.7.10.2
PATCH 1/5 amd64_edac: Don't pass driver name as an error parameter
The EDAC driver name doesn't help to handle EDAC errors. So, remove it from the EDAC error messages, preserving only the error_message.
--- drivers/edac/amd64_edac.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
drivers/edac/amd64_edac.c +13 -12
@@ -1049,8 +1049,8 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"failed to map error addr to a node" , +"" ,NULL );return ; }
@@ -1061,8 +1061,8 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"failed to map error addr to a csrow" , +"" ,NULL );return ; }
@@ -1082,8 +1082,8 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome, csrow,-1 ,-1 , -EDAC_MOD_STR ,"unknown syndrome - possible error reporting race" , +"" ,NULL );return ; }
@@ -1102,7 +1102,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci, page, offset, syndrome, csrow, channel,-1 , -EDAC_MOD_STR ,"" ,NULL ); +"" ,"" ,NULL ); }static int ddr2_cs_size (unsigned i,bool dct_width)
@@ -1614,8 +1614,8 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"failed to map error addr to a csrow" , +"" ,NULL );return ; }
@@ -1631,7 +1631,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome, csrow, chan,-1 , -EDAC_MOD_STR ,"" ,NULL ); +"" ,"" ,NULL ); }/*
@@ -1916,8 +1916,8 @@ static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"HW has no ERROR_ADDRESS available" , +"" ,NULL );return ; }
@@ -1945,8 +1945,8 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"HW has no ERROR_ADDRESS available" , +"" ,NULL );return ; }
@@ -1965,8 +1965,9 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offset,0 ,-1 ,-1 ,-1 , -EDAC_MOD_STR , -"ERROR ADDRESS NOT mapped to a MC" ,NULL ); +"ERROR ADDRESS NOT mapped to a MC" , +"" , +NULL );return ; }
@@ -1979,14 +1980,14 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offset,0 ,-1 ,-1 ,-1 , -EDAC_MOD_STR ,"ERROR ADDRESS NOT mapped to CS" , +"" ,NULL ); }else {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offset,0 , csrow,-1 ,-1 , -EDAC_MOD_STR ,"" ,NULL ); +"" ,"" ,NULL ); } }
Signature · 1 line
1.7.10.2
PATCH 2/5 edac: remove arch-specific parameter for the error handler
In reply to Mauro Carvalho ChehabRemove the arch-dependent parameter, as it were not used, as the MCE tracepoint weren't implemented. It probably doesn't make sense to have an MCE-specific tracepoint, as this will cost more bytes at the tracepoint, and tracepoint is not free.
The changes at the EDAC drivers were done by this small perl script:
$file .=$_ while (<>); $file =~ s/(edac_mc_handle_error)\s*\(([^\;]+)\,([^\,\)]+)\s*\)/$1($2)/g; print $file;
--- drivers/edac/amd64_edac.c | 30 +++++++++++------------------- drivers/edac/amd76x_edac.c | 4 ++-- drivers/edac/cell_edac.c | 4 ++-- drivers/edac/cpc925_edac.c | 4 ++-- drivers/edac/e752x_edac.c | 8 ++++---- drivers/edac/e7xxx_edac.c | 8 ++++---- drivers/edac/edac_core.h | 3 +-- drivers/edac/edac_mc.c | 6 +----- drivers/edac/edac_mc_sysfs.c | 2 +- drivers/edac/i3000_edac.c | 6 +++--- drivers/edac/i3200_edac.c | 6 +++--- drivers/edac/i5000_edac.c | 8 ++++---- drivers/edac/i5100_edac.c | 4 ++-- drivers/edac/i5400_edac.c | 4 ++-- drivers/edac/i7300_edac.c | 4 ++-- drivers/edac/i7core_edac.c | 4 ++-- drivers/edac/i82443bxgx_edac.c | 4 ++-- drivers/edac/i82860_edac.c | 6 +++--- drivers/edac/i82875p_edac.c | 6 +++--- drivers/edac/i82975x_edac.c | 6 +++--- drivers/edac/mpc85xx_edac.c | 4 ++-- drivers/edac/mv64x60_edac.c | 4 ++-- drivers/edac/pasemi_edac.c | 4 ++-- drivers/edac/ppc4xx_edac.c | 4 ++-- drivers/edac/r82600_edac.c | 4 ++-- drivers/edac/sb_edac.c | 4 ++-- drivers/edac/tile_edac.c | 2 +- drivers/edac/x38_edac.c | 6 +++--- 28 files changed, 73 insertions(+), 86 deletions(-)
drivers/edac/amd64_edac.c +11 -19
@@ -1050,8 +1050,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, page, offset, syndrome,-1 ,-1 ,-1 ,"failed to map error addr to a node" , -"" , - NULL); + "");return ; }
@@ -1062,8 +1061,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, page, offset, syndrome,-1 ,-1 ,-1 ,"failed to map error addr to a csrow" , -"" , - NULL); + "");return ; }
@@ -1083,8 +1081,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, page, offset, syndrome, csrow,-1 ,-1 ,"unknown syndrome - possible error reporting race" , -"" , - NULL); + "");return ; } }else {
@@ -1102,7 +1099,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci, page, offset, syndrome, csrow, channel,-1 , -"" ,"" ,NULL ); +"" ,"" ); }static int ddr2_cs_size (unsigned i,bool dct_width)
@@ -1615,8 +1612,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, page, offset, syndrome,-1 ,-1 ,-1 ,"failed to map error addr to a csrow" , -"" , - NULL); + "");return ; }
@@ -1631,7 +1627,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, offset, syndrome, csrow, chan,-1 , -"" ,"" ,NULL ); +"" ,"" ); }/*
@@ -1917,8 +1913,7 @@ static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)0 ,0 ,0 ,-1 ,-1 ,-1 ,"HW has no ERROR_ADDRESS available" , -"" , - NULL); + "");return ; }
@@ -1946,8 +1941,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)0 ,0 ,0 ,-1 ,-1 ,-1 ,"HW has no ERROR_ADDRESS available" , -"" , - NULL); + "");return ; }
@@ -1966,8 +1960,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m) page, offset,0 ,-1 ,-1 ,-1 ,"ERROR ADDRESS NOT mapped to a MC" , -"" , - NULL); + "");return ; }
@@ -1981,13 +1974,12 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m) page, offset,0 ,-1 ,-1 ,-1 ,"ERROR ADDRESS NOT mapped to CS" , -"" , - NULL); + ""); }else {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offset,0 , csrow,-1 ,-1 , -"" ,"" ,NULL ); +"" ,"" ); } }
drivers/edac/amd76x_edac.c +2 -2
@@ -148,7 +148,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" ); } }
@@ -163,7 +163,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" ); } }
drivers/edac/cell_edac.c +2 -2
@@ -50,7 +50,7 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar)/* TODO: Decoding of the error address */ edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, csrow->first_page + pfn, offset, syndrome, -0 , chan,-1 ,"" ,"" ,NULL ); +0 , chan,-1 ,"" ,"" ); }static void cell_edac_count_ue (struct mem_ctl_info *mci,int chan,u64 ar)
@@ -72,7 +72,7 @@ static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar)/* TODO: Decoding of the error address */ edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, csrow->first_page + pfn, offset,0 , -0 , chan,-1 ,"" ,"" ,NULL ); +0 , chan,-1 ,"" ,"" ); }static void cell_edac_check (struct mem_ctl_info *mci)
drivers/edac/cpc925_edac.c +2 -2
@@ -557,7 +557,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, pfn, offset, syndrome, csrow, channel,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" ); }if (apiexcp &UECC_EXCP_DETECTED ) {
@@ -565,7 +565,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, pfn, offset,0 , csrow,-1 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" ); }cpc925_mc_printk (mci,KERN_INFO ,"Dump registers:\n" );
drivers/edac/e752x_edac.c +4 -4
@@ -374,7 +374,7 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page,offset_in_page (sec1_add <<4 ), sec1_syndrome, row, channel,-1 , -"e752x CE" ,"" ,NULL ); +"e752x CE" ,"" ); } static inline void process_ce(struct mem_ctl_info *mci, u16 error_one,
@@ -412,7 +412,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, block_page,offset_in_page (error_2b <<4 ),0 , row,-1 ,-1 , - "e752x UE from Read", "", NULL); + "e752x UE from Read", ""); }if (error_one &0x0404 ) {
@@ -431,7 +431,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one, block_page,offset_in_page (error_2b <<4 ),0 , row,-1 ,-1 , - "e752x UE from Scruber", "", NULL); + "e752x UE from Scruber", ""); } }
@@ -456,7 +456,7 @@ static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,edac_dbg (3 ,"\n" );edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"e752x UE log memory write" ,"" ,NULL ); +"e752x UE log memory write" ,"" ); } static void do_process_ded_retry(struct mem_ctl_info *mci, u16 error,
drivers/edac/e7xxx_edac.c +4 -4
@@ -220,14 +220,14 @@ static void process_ce(struct mem_ctl_info *mci, struct e7xxx_error_info *info)/* convert syndrome to channel */ channel =e7xxx_find_channel (syndrome);edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page,0 , syndrome, - row, channel,-1 ,"e7xxx CE" ,"" ,NULL ); + row, channel,-1 ,"e7xxx CE" ,"" ); }static void process_ce_no_info (struct mem_ctl_info *mci) {edac_dbg (3 ,"\n" );edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"e7xxx CE log register overflow" ,"" ,NULL ); +"e7xxx CE log register overflow" ,"" ); }static void process_ue (struct mem_ctl_info *mci,struct e7xxx_error_info *info)
@@ -243,7 +243,7 @@ static void process_ue(struct mem_ctl_info *mci, struct e7xxx_error_info *info) row =edac_mc_find_csrow_by_page (mci, block_page);edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, block_page,0 ,0 , - row,-1 ,-1 ,"e7xxx UE" ,"" ,NULL ); + row,-1 ,-1 ,"e7xxx UE" ,"" ); }static void process_ue_no_info (struct mem_ctl_info *mci)
@@ -251,7 +251,7 @@ static void process_ue_no_info(struct mem_ctl_info *mci)edac_dbg (3 ,"\n" );edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"e7xxx UE log register overflow" ,"" ,NULL ); +"e7xxx UE log register overflow" ,"" ); } static void e7xxx_get_error_info(struct mem_ctl_info *mci,
drivers/edac/edac_core.h +1 -2
@@ -462,8 +462,7 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,const int mid_layer, const int low_layer, const char *msg, - const char *other_detail, - const void *arch_log); + const char *other_detail);/* * edac_device APIs
drivers/edac/edac_mc.c +1 -5
@@ -1044,9 +1044,6 @@ static void edac_ue_error(struct mem_ctl_info *mci,* @other_detail: Technical details about the event that * may help hardware manufacturers and * EDAC developers to analyse the event -* @arch_log: Architecture-specific struct that can -* be used to add extended information to the -* tracepoint, like dumping MCE registers. */ void edac_mc_handle_error(const enum hw_event_mc_err_type type, struct mem_ctl_info *mci,
@@ -1057,8 +1054,7 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,const int mid_layer, const int low_layer, const char *msg, - const char *other_detail, - const void *arch_log) + const char *other_detail) { /* FIXME: too much for stack: move it to some pre-alocated area */ char detail[80], location[80];
drivers/edac/edac_mc_sysfs.c +1 -1
@@ -827,7 +827,7 @@ static ssize_t edac_fake_inject_write(struct file *file, mci->fake_inject_layer[0 ], mci->fake_inject_layer[1 ], mci->fake_inject_layer[2 ], - "FAKE ERROR", "for EDAC testing only", NULL); + "FAKE ERROR", "for EDAC testing only");return count; }
drivers/edac/i3000_edac.c +3 -3
@@ -247,7 +247,7 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &I3000_ERRSTS_BITS ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"UE overwrote CE" ,"" ,NULL ); +"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -261,12 +261,12 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, pfn, offset,0 , row,-1 ,-1 , -"i3000 UE" ,"" ,NULL ); +"i3000 UE" ,"" ); else edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, pfn, offset, info->derrsyn, row, multi_chan ? channel : 0, -1, - "i3000 CE", "", NULL); + "i3000 CE", "");return 1 ; }
drivers/edac/i3200_edac.c +3 -3
@@ -219,7 +219,7 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &I3200_ERRSTS_BITS ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , --1 ,-1 ,-1 ,"UE overwrote CE" ,"" ,NULL ); +-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -230,13 +230,13 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 , - "i3000 UE", "", NULL); + "i3000 UE", ""); }else if (log &I3200_ECCERRLOG_CE ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,eccerrlog_syndrome (log),eccerrlog_row (channel, log),-1 ,-1 , -"i3000 UE" ,"" ,NULL ); +"i3000 UE" ,"" ); } } }
drivers/edac/i5000_edac.c +4 -4
@@ -522,7 +522,7 @@ static void i5000_process_fatal_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , channel >>1 , channel &1 , rank, rdwr ?"Write error" :"Read error" , - msg,NULL ); + msg); }/*
@@ -621,7 +621,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , channel >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , - msg,NULL ); + msg); }/* Check correctable errors */
@@ -675,7 +675,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , channel >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , - msg,NULL ); + msg); }if (!misc_messages)
@@ -720,7 +720,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci,/* Call the helper to output message */ edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , branch >>1 ,-1 ,-1 , -"Misc error" , msg,NULL ); +"Misc error" , msg); } }
drivers/edac/i5100_edac.c +2 -2
@@ -434,7 +434,7 @@ static void i5100_handle_ce(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 , syndrome, chan, rank,-1 , - msg, detail,NULL ); + msg, detail); } static void i5100_handle_ue(struct mem_ctl_info *mci,
@@ -456,7 +456,7 @@ static void i5100_handle_ue(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 , syndrome, chan, rank,-1 , - msg, detail,NULL ); + msg, detail); } static void i5100_read_log(struct mem_ctl_info *mci, int chan,
drivers/edac/i5400_edac.c +2 -2
@@ -557,7 +557,7 @@ static void i5400_proccess_non_recoverable_info(struct mem_ctl_info *mci,edac_mc_handle_error (tp_event, mci,0 ,0 ,0 , branch >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , - msg,NULL ); + msg); }/*
@@ -629,7 +629,7 @@ static void i5400_process_nonfatal_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , branch >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , - msg,NULL ); + msg);return ; }
drivers/edac/i7300_edac.c +2 -2
@@ -452,7 +452,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , branch,-1 , rank, is_wr ?"Write error" :"Read error" , - pvt->tmp_prt_buffer,NULL ); + pvt->tmp_prt_buffer); }
@@ -499,7 +499,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci) syndrome, branch >>1 , channel %2 , rank, is_wr ?"Write error" :"Read error" , - pvt->tmp_prt_buffer, NULL); + pvt->tmp_prt_buffer); }return ; }
drivers/edac/i7core_edac.c +2 -2
@@ -1545,7 +1545,7 @@ static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,for (i =0 ; i < add; i++) {edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , - chan, dimm,-1 ,"error" ,"" ,NULL ); + chan, dimm,-1 ,"error" ,"" ); } }
@@ -1801,7 +1801,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, m->addr & ~PAGE_MASK , syndrome, channel, dimm,-1 , - err, msg, m); + err, msg); }/*
drivers/edac/i82443bxgx_edac.c +2 -2
@@ -159,7 +159,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page), -0 ,-1 , mci->ctl_name,"" ,NULL ); +0 ,-1 , mci->ctl_name,"" ); }if (info->eap &I82443BXGX_EAP_OFFSET_MBE ) {
@@ -168,7 +168,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page), -0 ,-1 , mci->ctl_name,"" ,NULL ); +0 ,-1 , mci->ctl_name,"" ); }return error_found;
drivers/edac/i82860_edac.c +3 -3
@@ -110,7 +110,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &0x0003 ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , --1 ,-1 ,-1 ,"UE overwrote CE" ,"" ,NULL ); +-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -122,12 +122,12 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, info->eap,0 ,0 , dimm->location[0 ], dimm->location[1 ],-1 , -"i82860 UE" ,"" ,NULL ); +"i82860 UE" ,"" ); else edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, info->eap, 0, info->derrsyn, dimm->location[0], dimm->location[1], -1, - "i82860 CE", "", NULL); + "i82860 CE", "");return 1 ; }
drivers/edac/i82875p_edac.c +3 -3
@@ -238,7 +238,7 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &0x0081 ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"UE overwrote CE" ,"" ,NULL ); +"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -249,12 +249,12 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, info->eap,0 ,0 , row,-1 ,-1 , -"i82875p UE" ,"" ,NULL ); +"i82875p UE" ,"" ); else edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, info->eap, 0, info->derrsyn, row, multi_chan ? (info->des & 0x1) : 0, - -1, "i82875p CE", "", NULL); + -1, "i82875p CE", "");return 1 ; }
drivers/edac/i82975x_edac.c +3 -3
@@ -289,7 +289,7 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &0x0003 ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , --1 ,-1 ,-1 ,"UE overwrote CE" ,"" ,NULL ); +-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -317,12 +317,12 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offst,0 , row,-1 ,-1 , -"i82975x UE" ,"" ,NULL ); +"i82975x UE" ,"" ); else edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, page, offst, info->derrsyn, row, chan ? chan : 0, -1, - "i82975x CE", "", NULL); + "i82975x CE", "");return 1 ; }
drivers/edac/mpc85xx_edac.c +2 -2
@@ -869,13 +869,13 @@ static void mpc85xx_mc_check(struct mem_ctl_info *mci)edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" );if (err_detect &DDR_EDE_MBE )edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" );out_be32 (pdata->mc_vbase +MPC85XX_MC_ERR_DETECT , err_detect); }
drivers/edac/mv64x60_edac.c +2 -2
@@ -615,13 +615,13 @@ static void mv64x60_mc_check(struct mem_ctl_info *mci) err_addr >>PAGE_SHIFT , err_addr &PAGE_MASK , syndrome,0 ,0 ,-1 , - mci->ctl_name, "", NULL); + mci->ctl_name, ""); else /* 2 bit error, UE */ edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, err_addr >> PAGE_SHIFT, err_addr & PAGE_MASK, 0, 0, 0, -1, - mci->ctl_name, "", NULL); + mci->ctl_name, ""); /* clear the error */ out_le32(pdata->mc_vbase + MV64X60_SDRAM_ERR_ADDR, 0);
drivers/edac/pasemi_edac.c +2 -2
@@ -112,14 +112,14 @@ static void pasemi_edac_process_error_info(struct mem_ctl_info *mci, u32 errsta) MCDEBUG_ERRSTA_RFL_STATUS)) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, mci->csrows[cs]->first_page,0 ,0 , - cs,0 ,-1 , mci->ctl_name,"" ,NULL ); + cs,0 ,-1 , mci->ctl_name,"" ); }/* correctable/single-bit errors */ if (errsta &MCDEBUG_ERRSTA_SBE_STATUS )edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, mci->csrows[cs]->first_page,0 ,0 , - cs,0 ,-1 , mci->ctl_name,"" ,NULL ); + cs,0 ,-1 , mci->ctl_name,"" ); }static void pasemi_edac_check (struct mem_ctl_info *mci)
drivers/edac/ppc4xx_edac.c +2 -2
@@ -730,7 +730,7 @@ ppc4xx_edac_handle_ce(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , row,0 ,-1 , - message,"" ,NULL ); + message,"" ); }/**
@@ -761,7 +761,7 @@ ppc4xx_edac_handle_ue(struct mem_ctl_info *mci,edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, page, offset,0 , row,0 ,-1 , - message,"" ,NULL ); + message,"" ); }/**
drivers/edac/r82600_edac.c +2 -2
@@ -183,7 +183,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, page,0 , syndrome,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , - mci->ctl_name, "", NULL); + mci->ctl_name, ""); }if (info->eapr &BIT (1 )) {/* UE? */
@@ -195,7 +195,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, page,0 ,0 ,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , - mci->ctl_name, "", NULL); + mci->ctl_name, ""); }return error_found;
drivers/edac/sb_edac.c +2 -2
@@ -1450,12 +1450,12 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,edac_mc_handle_error (tp_event, mci, m->addr >>PAGE_SHIFT , m->addr & ~PAGE_MASK ,0 , channel, dimm,-1 , - optype, msg, m); + optype, msg);return ; err_parsing:edac_mc_handle_error (tp_event, mci,0 ,0 ,0 ,-1 ,-1 ,-1 , - msg,"" , m); + msg,"" ); }
drivers/edac/tile_edac.c +1 -1
@@ -74,7 +74,7 @@ static void tile_edac_check(struct mem_ctl_info *mci)edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 ,0 ,0 ,-1 , - mci->ctl_name,"" ,NULL ); + mci->ctl_name,"" ); } }
drivers/edac/x38_edac.c +3 -3
@@ -217,7 +217,7 @@ static void x38_process_error_info(struct mem_ctl_info *mci,if ((info->errsts ^ info->errsts2) &X38_ERRSTS_BITS ) {edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , -"UE overwrote CE" ,"" ,NULL ); +"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -228,13 +228,13 @@ static void x38_process_error_info(struct mem_ctl_info *mci,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 , - "x38 UE", "", NULL); + "x38 UE", ""); }else if (log &X38_ECCERRLOG_CE ) {edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,eccerrlog_syndrome (log),eccerrlog_row (channel, log),-1 ,-1 , -"x38 CE" ,"" ,NULL ); +"x38 CE" ,"" ); } } }
Signature · 1 line
1.7.10.2
PATCH 3/5 edac: allow to specify how many errors were received
In reply to Mauro Carvalho ChehabIn order to avoid loosing error events, it is desirable to group error events together and generate a single trace for several identical errors.
The trace API already allows reporting multiple errors. Change the handle_error function to also allow that.
The changes at the drivers were made by this small script:
$file .=$_ while (<>); $file =~ s/(edac_mc_handle_error)\s*\(([^\,]+)\,([^\,]+)\,/$1($2,$3, 1,/g; print $file;
--- drivers/edac/amd64_edac.c | 22 +++++++++++----------- drivers/edac/amd76x_edac.c | 4 ++-- drivers/edac/cell_edac.c | 4 ++-- drivers/edac/cpc925_edac.c | 4 ++-- drivers/edac/e752x_edac.c | 8 ++++---- drivers/edac/e7xxx_edac.c | 8 ++++---- drivers/edac/edac_core.h | 1 + drivers/edac/edac_mc.c | 26 ++++++++++++++++---------- drivers/edac/edac_mc_sysfs.c | 2 +- drivers/edac/i3000_edac.c | 6 +++--- drivers/edac/i3200_edac.c | 6 +++--- drivers/edac/i5000_edac.c | 8 ++++---- drivers/edac/i5100_edac.c | 4 ++-- drivers/edac/i5400_edac.c | 4 ++-- drivers/edac/i7300_edac.c | 4 ++-- drivers/edac/i7core_edac.c | 4 ++-- drivers/edac/i82443bxgx_edac.c | 4 ++-- drivers/edac/i82860_edac.c | 6 +++--- drivers/edac/i82875p_edac.c | 6 +++--- drivers/edac/i82975x_edac.c | 6 +++--- drivers/edac/mpc85xx_edac.c | 4 ++-- drivers/edac/mv64x60_edac.c | 4 ++-- drivers/edac/pasemi_edac.c | 4 ++-- drivers/edac/ppc4xx_edac.c | 4 ++-- drivers/edac/r82600_edac.c | 4 ++-- drivers/edac/sb_edac.c | 4 ++-- drivers/edac/tile_edac.c | 2 +- drivers/edac/x38_edac.c | 6 +++--- 28 files changed, 88 insertions(+), 81 deletions(-)
drivers/edac/amd64_edac.c +11 -11
@@ -1046,7 +1046,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,if (!src_mci) {amd64_mc_err (mci,"failed to map error addr 0x%lx to a node\n" , (unsigned long )sys_addr); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a node",
@@ -1057,7 +1057,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,/* Now map the sys_addr to a CSROW */ csrow =sys_addr_to_csrow (src_mci, sys_addr);if (csrow <0 ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a csrow",
@@ -1077,7 +1077,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,amd64_mc_warn (src_mci,"unknown syndrome 0x%04x - " "possible error reporting race\n" , syndrome); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, csrow, -1, -1, "unknown syndrome - possible error reporting race",
@@ -1096,7 +1096,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, channel = ((sys_addr &BIT (3 )) !=0 ); } -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci,1 , page, offset, syndrome, csrow, channel,-1 ,"" ,"" );
@@ -1608,7 +1608,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, csrow =f1x_translate_sysaddr_to_cs (pvt, sys_addr, &nid, &chan);if (csrow <0 ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a csrow",
@@ -1624,7 +1624,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,if (dct_ganging_enabled (pvt)) chan =get_channel_from_ecc_syndrome (mci, syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, offset, syndrome, csrow, chan,-1 ,"" ,"" );
@@ -1909,7 +1909,7 @@ static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)/* Ensure that the Error Address is VALID */ if (!(m->status &MCI_STATUS_ADDRV )) {amd64_mc_err (mci,"HW has no ERROR_ADDRESS available\n" ); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, "HW has no ERROR_ADDRESS available",
@@ -1937,7 +1937,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (!(m->status &MCI_STATUS_ADDRV )) {amd64_mc_err (mci,"HW has no ERROR_ADDRESS available\n" ); - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, "HW has no ERROR_ADDRESS available",
@@ -1956,7 +1956,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (!src_mci) {amd64_mc_err (mci,"ERROR ADDRESS (0x%lx) NOT mapped to a MC\n" , (unsigned long )sys_addr); - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, page, offset, 0, -1, -1, -1, "ERROR ADDRESS NOT mapped to a MC",
@@ -1970,13 +1970,13 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (csrow <0 ) {amd64_mc_err (mci,"ERROR_ADDRESS (0x%lx) NOT mapped to CS\n" , (unsigned long )sys_addr); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 ,-1 ,-1 ,-1 ,"ERROR ADDRESS NOT mapped to CS" ,"" ); }else { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 , csrow,-1 ,-1 ,"" ,"" );
drivers/edac/amd76x_edac.c +2 -2
@@ -145,7 +145,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,if (handle_errors) { row = (info->ecc_mode_status >>4 ) &0xf ; -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , mci->ctl_name,"" );
@@ -160,7 +160,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,if (handle_errors) { row = info->ecc_mode_status &0xf ; -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , mci->ctl_name,"" );
drivers/edac/cell_edac.c +2 -2
@@ -48,7 +48,7 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar) syndrome = (ar &0x000000001fe00000ul ) >>21 ;/* TODO: Decoding of the error address */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , csrow->first_page + pfn, offset, syndrome,0 , chan,-1 ,"" ,"" ); }
@@ -70,7 +70,7 @@ static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar) offset = address & ~PAGE_MASK ;/* TODO: Decoding of the error address */ -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , csrow->first_page + pfn, offset,0 ,0 , chan,-1 ,"" ,"" ); }
drivers/edac/cpc925_edac.c +2 -2
@@ -554,7 +554,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)if (apiexcp &CECC_EXCP_DETECTED ) {cpc925_mc_printk (mci,KERN_INFO ,"DRAM CECC Fault\n" ); channel =cpc925_mc_find_channel (mci, syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset, syndrome, csrow, channel,-1 , mci->ctl_name,"" );
@@ -562,7 +562,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)if (apiexcp &UECC_EXCP_DETECTED ) {cpc925_mc_printk (mci,KERN_INFO ,"DRAM UECC Fault\n" ); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset,0 , csrow,-1 ,-1 , mci->ctl_name,"" );
drivers/edac/e752x_edac.c +4 -4
@@ -371,7 +371,7 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, channel = !(error_one &1 );/* e752x mc reads 34:6 of the DRAM linear address */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page,offset_in_page (sec1_add <<4 ), sec1_syndrome, row, channel,-1 ,"e752x CE" ,"" );
@@ -408,7 +408,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,edac_mc_find_csrow_by_page (mci, block_page);/* e752x mc reads 34:6 of the DRAM linear address */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, block_page, offset_in_page(error_2b << 4), 0, row, -1, -1,
@@ -427,7 +427,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,edac_mc_find_csrow_by_page (mci, block_page);/* e752x mc reads 34:6 of the DRAM linear address */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, block_page, offset_in_page(error_2b << 4), 0, row, -1, -1,
@@ -454,7 +454,7 @@ static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,return ;edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e752x UE log memory write" ,"" ); }
drivers/edac/e7xxx_edac.c +4 -4
@@ -219,14 +219,14 @@ static void process_ce(struct mem_ctl_info *mci, struct e7xxx_error_info *info) row =edac_mc_find_csrow_by_page (mci, page);/* convert syndrome to channel */ channel =e7xxx_find_channel (syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page,0 , syndrome, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page,0 , syndrome, row, channel,-1 ,"e7xxx CE" ,"" ); }static void process_ce_no_info (struct mem_ctl_info *mci) {edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e7xxx CE log register overflow" ,"" ); }
@@ -242,7 +242,7 @@ static void process_ue(struct mem_ctl_info *mci, struct e7xxx_error_info *info) block_page = error_2b >>6 ;/* convert to 4k address */ row =edac_mc_find_csrow_by_page (mci, block_page); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, block_page,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , block_page,0 ,0 , row,-1 ,-1 ,"e7xxx UE" ,"" ); }
@@ -250,7 +250,7 @@ static void process_ue_no_info(struct mem_ctl_info *mci) {edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e7xxx UE log register overflow" ,"" ); }
drivers/edac/edac_core.h +1 -0
@@ -455,6 +455,7 @@ extern int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, unsigned long page); void edac_mc_handle_error(const enum hw_event_mc_err_type type, struct mem_ctl_info *mci, + const u16 error_count, const unsigned long page_frame_number, const unsigned long offset_in_page, const unsigned long syndrome,
drivers/edac/edac_mc.c +16 -10
@@ -945,6 +945,7 @@ static void edac_inc_ue_error(struct mem_ctl_info *mci, } static void edac_ce_error(struct mem_ctl_info *mci, + const u16 error_count, const int pos[EDAC_MAX_LAYERS], const char *msg, const char *location,
@@ -961,12 +962,14 @@ static void edac_ce_error(struct mem_ctl_info *mci,if (edac_mc_get_log_ce ()) {if (other_detail && *other_detail)edac_mc_printk (mci,KERN_WARNING , -"CE %s on %s (%s %s - %s)\n" , +"%d CE %s on %s (%s %s - %s)\n" , + error_count, msg, label, location, detail, other_detail);else edac_mc_printk (mci,KERN_WARNING , -"CE %s on %s (%s %s)\n" , +"%d CE %s on %s (%s %s)\n" , + error_count, msg, label, location, detail); }
@@ -994,6 +997,7 @@ static void edac_ce_error(struct mem_ctl_info *mci, } static void edac_ue_error(struct mem_ctl_info *mci, + const u16 error_count, const int pos[EDAC_MAX_LAYERS], const char *msg, const char *location,
@@ -1005,12 +1009,14 @@ static void edac_ue_error(struct mem_ctl_info *mci,if (edac_mc_get_log_ue ()) {if (other_detail && *other_detail)edac_mc_printk (mci,KERN_WARNING , -"UE %s on %s (%s %s - %s)\n" , +"%d UE %s on %s (%s %s - %s)\n" , + error_count, msg, label, location, detail, other_detail);else edac_mc_printk (mci,KERN_WARNING , -"UE %s on %s (%s %s)\n" , +"%d UE %s on %s (%s %s)\n" , + error_count, msg, label, location, detail); }
@@ -1033,6 +1039,7 @@ static void edac_ue_error(struct mem_ctl_info *mci,* * @type: severity of the error (CE/UE/Fatal) * @mci: a struct mem_ctl_info pointer +* @error_count: Number of errors of the same type * @page_frame_number: mem page where the error occurred * @offset_in_page: offset of the error inside the page * @syndrome: ECC syndrome
@@ -1047,6 +1054,7 @@ static void edac_ue_error(struct mem_ctl_info *mci,*/ void edac_mc_handle_error(const enum hw_event_mc_err_type type, struct mem_ctl_info *mci, + const u16 error_count, const unsigned long page_frame_number, const unsigned long offset_in_page, const unsigned long syndrome,
@@ -1065,7 +1073,6 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,int i;long grain;bool enable_per_layer_report = false; -u16 error_count;/* FIXME: make it a parameter */ u8 grain_bits;edac_dbg (3 ,"MC%d\n" , mci->mc_idx);
@@ -1193,7 +1200,6 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,/* Report the error via the trace interface */ - error_count =1 ;/* FIXME: allow change it */ grain_bits =fls_long (grain) +1 ; trace_mc_event(type, msg, label, error_count, mci->mc_idx, top_layer, mid_layer, low_layer,
@@ -1206,16 +1212,16 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,"page:0x%lx offset:0x%lx grain:%ld syndrome:0x%lx" , page_frame_number, offset_in_page, grain, syndrome); -edac_ce_error (mci, pos, msg, location, label, detail, - other_detail, enable_per_layer_report, +edac_ce_error (mci, error_count, pos, msg, location, label, + detail, other_detail, enable_per_layer_report, page_frame_number, offset_in_page, grain); }else {snprintf (detail,sizeof (detail),"page:0x%lx offset:0x%lx grain:%ld" , page_frame_number, offset_in_page, grain); -edac_ue_error (mci, pos, msg, location, label, detail, - other_detail, enable_per_layer_report); +edac_ue_error (mci, error_count, pos, msg, location, label, + detail, other_detail, enable_per_layer_report); } }EXPORT_SYMBOL_GPL (edac_mc_handle_error);
drivers/edac/edac_mc_sysfs.c +1 -1
@@ -823,7 +823,7 @@ static ssize_t edac_fake_inject_write(struct file *file, mci->fake_inject_layer[1 ], mci->fake_inject_layer[2 ] ); - edac_mc_handle_error(type, mci, 0, 0, 0, + edac_mc_handle_error(type, mci, 1, 0, 0, 0, mci->fake_inject_layer[0], mci->fake_inject_layer[1], mci->fake_inject_layer[2],
drivers/edac/i3000_edac.c +3 -3
@@ -245,7 +245,7 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &I3000_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -258,12 +258,12 @@ static int i3000_process_error_info(struct mem_ctl_info *mci, row =edac_mc_find_csrow_by_page (mci, pfn);if (info->errsts &I3000_ERRSTS_UE ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , pfn, offset,0 , row,-1 ,-1 ,"i3000 UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset, info->derrsyn, row, multi_chan ? channel :0 ,-1 ,"i3000 CE" ,"" );
drivers/edac/i3200_edac.c +3 -3
@@ -218,7 +218,7 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,return ;if ((info->errsts ^ info->errsts2) &I3200_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -226,13 +226,13 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,for (channel =0 ; channel < nr_channels; channel++) { log = info->eccerrlog[channel];if (log &I3200_ECCERRLOG_UE ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 ,"i3000 UE" ,"" ); }else if (log &I3200_ECCERRLOG_CE ) { - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, eccerrlog_syndrome(log), eccerrlog_row(channel, log), -1, -1,
drivers/edac/i5000_edac.c +4 -4
@@ -519,7 +519,7 @@ static void i5000_process_fatal_error_info(struct mem_ctl_info *mci, bank, ras, cas, allErrors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,1 ,0 ,0 ,0 , channel >>1 , channel &1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -618,7 +618,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, rank, bank, ras, cas, ue_errors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 , channel >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -672,7 +672,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , channel >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -718,7 +718,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, "Err=%#x (%s)", misc_errors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , branch >>1 ,-1 ,-1 ,"Misc error" , msg); }
drivers/edac/i5100_edac.c +2 -2
@@ -431,7 +431,7 @@ static void i5100_handle_ce(struct mem_ctl_info *mci,"bank %u, cas %u, ras %u\n" , bank, cas, ras); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 , syndrome, chan, rank,-1 , msg, detail);
@@ -453,7 +453,7 @@ static void i5100_handle_ue(struct mem_ctl_info *mci,"bank %u, cas %u, ras %u\n" , bank, cas, ras); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 , syndrome, chan, rank,-1 , msg, detail);
drivers/edac/i5400_edac.c +2 -2
@@ -554,7 +554,7 @@ static void i5400_proccess_non_recoverable_info(struct mem_ctl_info *mci,"Bank=%d Buffer ID = %d RAS=%d CAS=%d Err=0x%lx (%s)" , bank, buf_id, ras, cas, allErrors, error_name[errnum]); -edac_mc_handle_error (tp_event, mci,0 ,0 ,0 , +edac_mc_handle_error (tp_event, mci,1 ,0 ,0 ,0 , branch >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -626,7 +626,7 @@ static void i5400_process_nonfatal_error_info(struct mem_ctl_info *mci, branch >>1 , bank,rdwr_str (rdwr), ras, cas, allErrors, error_name[errnum]); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , branch >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , msg);
drivers/edac/i7300_edac.c +2 -2
@@ -449,7 +449,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)"Bank=%d RAS=%d CAS=%d Err=0x%lx (%s))" , bank, ras, cas, errors, specific); -edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,1 ,0 ,0 ,0 , branch,-1 , rank, is_wr ?"Write error" :"Read error" , pvt->tmp_prt_buffer);
@@ -495,7 +495,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)"DRAM-Bank=%d RAS=%d CAS=%d, Err=0x%lx (%s))" , bank, ras, cas, errors, specific); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, syndrome, branch >> 1, channel % 2, rank, is_wr ? "Write error" : "Read error",
drivers/edac/i7core_edac.c +2 -2
@@ -1544,7 +1544,7 @@ static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,int i;for (i =0 ; i < add; i++) { -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , chan, dimm,-1 ,"error" ,"" ); } }
@@ -1796,7 +1796,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,* only one event */ if (uncorrected_error || !pvt->is_registered) - edac_mc_handle_error(tp_event, mci, + edac_mc_handle_error(tp_event, mci, 1, m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, syndrome,
drivers/edac/i82443bxgx_edac.c +2 -2
@@ -156,7 +156,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,if (info->eap &I82443BXGX_EAP_OFFSET_SBE ) { error_found =1 ;if (handle_errors) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , mci->ctl_name,"" );
@@ -165,7 +165,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,if (info->eap &I82443BXGX_EAP_OFFSET_MBE ) { error_found =1 ;if (handle_errors) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , mci->ctl_name,"" );
drivers/edac/i82860_edac.c +3 -3
@@ -109,7 +109,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0003 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -119,12 +119,12 @@ static int i82860_process_error_info(struct mem_ctl_info *mci, dimm = mci->csrows[row]->channels[0 ]->dimm;if (info->errsts &0x0002 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 ,0 , dimm->location[0 ], dimm->location[1 ],-1 ,"i82860 UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 , info->derrsyn, dimm->location[0 ], dimm->location[1 ],-1 ,"i82860 CE" ,"" );
drivers/edac/i82875p_edac.c +3 -3
@@ -236,7 +236,7 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0081 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -246,12 +246,12 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci, row =edac_mc_find_csrow_by_page (mci, info->eap);if (info->errsts &0x0080 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 ,0 , row,-1 ,-1 ,"i82875p UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , info->eap,0 , info->derrsyn, row, multi_chan ? (info->des &0x1 ) :0 ,-1 ,"i82875p CE" ,"" );
drivers/edac/i82975x_edac.c +3 -3
@@ -288,7 +288,7 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0003 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -314,12 +314,12 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci, (1 << mci->csrows[row]->channels[chan]->dimm->grain));if (info->errsts &0x0002 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offst,0 , row,-1 ,-1 ,"i82975x UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, offst, info->derrsyn, row, chan ? chan :0 ,-1 ,"i82975x CE" ,"" );
drivers/edac/mpc85xx_edac.c +2 -2
@@ -866,13 +866,13 @@ static void mpc85xx_mc_check(struct mem_ctl_info *mci)mpc85xx_mc_printk (mci,KERN_ERR ,"PFN out of range!\n" );if (err_detect &DDR_EDE_SBE ) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , mci->ctl_name,"" );if (err_detect &DDR_EDE_MBE ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , mci->ctl_name,"" );
drivers/edac/mv64x60_edac.c +2 -2
@@ -611,13 +611,13 @@ static void mv64x60_mc_check(struct mem_ctl_info *mci)/* first bit clear in ECC Err Reg, 1 bit error, correctable by HW */ if (!(reg &0x1 )) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , err_addr >>PAGE_SHIFT , err_addr &PAGE_MASK , syndrome,0 ,0 ,-1 , mci->ctl_name,"" );else /* 2 bit error, UE */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, err_addr >> PAGE_SHIFT, err_addr & PAGE_MASK, 0, 0, 0, -1,
drivers/edac/pasemi_edac.c +2 -2
@@ -110,14 +110,14 @@ static void pasemi_edac_process_error_info(struct mem_ctl_info *mci, u32 errsta)/* uncorrectable/multi-bit errors */ if (errsta & (MCDEBUG_ERRSTA_MBE_STATUS |MCDEBUG_ERRSTA_RFL_STATUS )) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , mci->csrows[cs]->first_page,0 ,0 , cs,0 ,-1 , mci->ctl_name,"" ); }/* correctable/single-bit errors */ if (errsta &MCDEBUG_ERRSTA_SBE_STATUS ) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , mci->csrows[cs]->first_page,0 ,0 , cs,0 ,-1 , mci->ctl_name,"" ); }
drivers/edac/ppc4xx_edac.c +2 -2
@@ -727,7 +727,7 @@ ppc4xx_edac_handle_ce(struct mem_ctl_info *mci,for (row =0 ; row < mci->nr_csrows; row++)if (ppc4xx_edac_check_bank_error (status, row)) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , row,0 ,-1 , message,"" );
@@ -758,7 +758,7 @@ ppc4xx_edac_handle_ue(struct mem_ctl_info *mci,for (row =0 ; row < mci->nr_csrows; row++)if (ppc4xx_edac_check_bank_error (status, row)) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 , row,0 ,-1 , message,"" );
drivers/edac/r82600_edac.c +2 -2
@@ -179,7 +179,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, error_found =1 ;if (handle_errors) - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, 0, syndrome, edac_mc_find_csrow_by_page(mci, page), 0, -1,
@@ -191,7 +191,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci,if (handle_errors)/* 82600 doesn't give enough info */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, page, 0, 0, edac_mc_find_csrow_by_page(mci, page), 0, -1,
drivers/edac/sb_edac.c +2 -2
@@ -1447,13 +1447,13 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,/* FIXME: need support for channel mask */ /* Call the helper to output message */ -edac_mc_handle_error (tp_event, mci, +edac_mc_handle_error (tp_event, mci,1 , m->addr >>PAGE_SHIFT , m->addr & ~PAGE_MASK ,0 , channel, dimm,-1 , optype, msg);return ; err_parsing: -edac_mc_handle_error (tp_event, mci,0 ,0 ,0 , +edac_mc_handle_error (tp_event, mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 , msg,"" );
drivers/edac/tile_edac.c +1 -1
@@ -71,7 +71,7 @@ static void tile_edac_check(struct mem_ctl_info *mci)if (mem_error.sbe_count != priv->ce_count) {dev_dbg (mci->pdev,"ECC CE err on node %d\n" , priv->node); priv->ce_count = mem_error.sbe_count; -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 ,0 ,0 ,-1 , mci->ctl_name,"" );
drivers/edac/x38_edac.c +3 -3
@@ -215,7 +215,7 @@ static void x38_process_error_info(struct mem_ctl_info *mci,return ;if ((info->errsts ^ info->errsts2) &X38_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -224,13 +224,13 @@ static void x38_process_error_info(struct mem_ctl_info *mci,for (channel =0 ; channel < x38_channel_num; channel++) { log = info->eccerrlog[channel];if (log &X38_ECCERRLOG_UE ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 ,"x38 UE" ,"" ); }else if (log &X38_ECCERRLOG_CE ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, eccerrlog_syndrome(log), eccerrlog_row(channel, log), -1, -1,
Signature · 1 line
1.7.10.2
PATCH 1/1 edac: edac_mc_handle_error(): add an error_count parameter
In order to avoid loosing error events, it is desirable to group error events together and generate a single trace for several identical errors.
The trace API already allows reporting multiple errors. Change the handle_error function to also allow that.
The changes at the drivers were made by this small script:
$file .=$_ while (<>); $file =~ s/(edac_mc_handle_error)\s*\(([^\,]+)\,([^\,]+)\,/$1($2,$3, 1,/g; print $file;
---
v2: Patch rename and fix error count increment logic
drivers/edac/amd64_edac.c | 22 ++++++++-------- drivers/edac/amd76x_edac.c | 4 +-- drivers/edac/cell_edac.c | 4 +-- drivers/edac/cpc925_edac.c | 4 +-- drivers/edac/e752x_edac.c | 8 +++--- drivers/edac/e7xxx_edac.c | 8 +++--- drivers/edac/edac_core.h | 1 + drivers/edac/edac_mc.c | 56 +++++++++++++++++++++++----------------- drivers/edac/edac_mc_sysfs.c | 2 +- drivers/edac/i3000_edac.c | 6 ++--- drivers/edac/i3200_edac.c | 6 ++--- drivers/edac/i5000_edac.c | 8 +++--- drivers/edac/i5100_edac.c | 4 +-- drivers/edac/i5400_edac.c | 4 +-- drivers/edac/i7300_edac.c | 4 +-- drivers/edac/i7core_edac.c | 4 +-- drivers/edac/i82443bxgx_edac.c | 4 +-- drivers/edac/i82860_edac.c | 6 ++--- drivers/edac/i82875p_edac.c | 6 ++--- drivers/edac/i82975x_edac.c | 6 ++--- drivers/edac/mpc85xx_edac.c | 4 +-- drivers/edac/mv64x60_edac.c | 4 +-- drivers/edac/pasemi_edac.c | 4 +-- drivers/edac/ppc4xx_edac.c | 4 +-- drivers/edac/r82600_edac.c | 4 +-- drivers/edac/sb_edac.c | 4 +-- drivers/edac/tile_edac.c | 2 +- drivers/edac/x38_edac.c | 6 ++--- 28 files changed, 104 insertions(+), 95 deletions(-)
drivers/edac/amd64_edac.c +11 -11
@@ -1046,7 +1046,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,if (!src_mci) {amd64_mc_err (mci,"failed to map error addr 0x%lx to a node\n" , (unsigned long )sys_addr); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a node",
@@ -1057,7 +1057,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,/* Now map the sys_addr to a CSROW */ csrow =sys_addr_to_csrow (src_mci, sys_addr);if (csrow <0 ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a csrow",
@@ -1077,7 +1077,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,amd64_mc_warn (src_mci,"unknown syndrome 0x%04x - " "possible error reporting race\n" , syndrome); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, csrow, -1, -1, "unknown syndrome - possible error reporting race",
@@ -1096,7 +1096,7 @@ static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, channel = ((sys_addr &BIT (3 )) !=0 ); } -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , src_mci,1 , page, offset, syndrome, csrow, channel,-1 ,"" ,"" );
@@ -1608,7 +1608,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr, csrow =f1x_translate_sysaddr_to_cs (pvt, sys_addr, &nid, &chan);if (csrow <0 ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, offset, syndrome, -1, -1, -1, "failed to map error addr to a csrow",
@@ -1624,7 +1624,7 @@ static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,if (dct_ganging_enabled (pvt)) chan =get_channel_from_ecc_syndrome (mci, syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, offset, syndrome, csrow, chan,-1 ,"" ,"" );
@@ -1909,7 +1909,7 @@ static void amd64_handle_ce(struct mem_ctl_info *mci, struct mce *m)/* Ensure that the Error Address is VALID */ if (!(m->status &MCI_STATUS_ADDRV )) {amd64_mc_err (mci,"HW has no ERROR_ADDRESS available\n" ); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, "HW has no ERROR_ADDRESS available",
@@ -1937,7 +1937,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (!(m->status &MCI_STATUS_ADDRV )) {amd64_mc_err (mci,"HW has no ERROR_ADDRESS available\n" ); - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, 0, -1, -1, -1, "HW has no ERROR_ADDRESS available",
@@ -1956,7 +1956,7 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (!src_mci) {amd64_mc_err (mci,"ERROR ADDRESS (0x%lx) NOT mapped to a MC\n" , (unsigned long )sys_addr); - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, page, offset, 0, -1, -1, -1, "ERROR ADDRESS NOT mapped to a MC",
@@ -1970,13 +1970,13 @@ static void amd64_handle_ue(struct mem_ctl_info *mci, struct mce *m)if (csrow <0 ) {amd64_mc_err (mci,"ERROR_ADDRESS (0x%lx) NOT mapped to CS\n" , (unsigned long )sys_addr); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 ,-1 ,-1 ,-1 ,"ERROR ADDRESS NOT mapped to CS" ,"" ); }else { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 , csrow,-1 ,-1 ,"" ,"" );
drivers/edac/amd76x_edac.c +2 -2
@@ -145,7 +145,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,if (handle_errors) { row = (info->ecc_mode_status >>4 ) &0xf ; -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , mci->ctl_name,"" );
@@ -160,7 +160,7 @@ static int amd76x_process_error_info(struct mem_ctl_info *mci,if (handle_errors) { row = info->ecc_mode_status &0xf ; -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , mci->csrows[row]->first_page,0 ,0 , row,0 ,-1 , mci->ctl_name,"" );
drivers/edac/cell_edac.c +2 -2
@@ -48,7 +48,7 @@ static void cell_edac_count_ce(struct mem_ctl_info *mci, int chan, u64 ar) syndrome = (ar &0x000000001fe00000ul ) >>21 ;/* TODO: Decoding of the error address */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , csrow->first_page + pfn, offset, syndrome,0 , chan,-1 ,"" ,"" ); }
@@ -70,7 +70,7 @@ static void cell_edac_count_ue(struct mem_ctl_info *mci, int chan, u64 ar) offset = address & ~PAGE_MASK ;/* TODO: Decoding of the error address */ -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , csrow->first_page + pfn, offset,0 ,0 , chan,-1 ,"" ,"" ); }
drivers/edac/cpc925_edac.c +2 -2
@@ -554,7 +554,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)if (apiexcp &CECC_EXCP_DETECTED ) {cpc925_mc_printk (mci,KERN_INFO ,"DRAM CECC Fault\n" ); channel =cpc925_mc_find_channel (mci, syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset, syndrome, csrow, channel,-1 , mci->ctl_name,"" );
@@ -562,7 +562,7 @@ static void cpc925_mc_check(struct mem_ctl_info *mci)if (apiexcp &UECC_EXCP_DETECTED ) {cpc925_mc_printk (mci,KERN_INFO ,"DRAM UECC Fault\n" ); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset,0 , csrow,-1 ,-1 , mci->ctl_name,"" );
drivers/edac/e752x_edac.c +4 -4
@@ -371,7 +371,7 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one, channel = !(error_one &1 );/* e752x mc reads 34:6 of the DRAM linear address */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page,offset_in_page (sec1_add <<4 ), sec1_syndrome, row, channel,-1 ,"e752x CE" ,"" );
@@ -408,7 +408,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,edac_mc_find_csrow_by_page (mci, block_page);/* e752x mc reads 34:6 of the DRAM linear address */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, block_page, offset_in_page(error_2b << 4), 0, row, -1, -1,
@@ -427,7 +427,7 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,edac_mc_find_csrow_by_page (mci, block_page);/* e752x mc reads 34:6 of the DRAM linear address */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, block_page, offset_in_page(error_2b << 4), 0, row, -1, -1,
@@ -454,7 +454,7 @@ static inline void process_ue_no_info_wr(struct mem_ctl_info *mci,return ;edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e752x UE log memory write" ,"" ); }
drivers/edac/e7xxx_edac.c +4 -4
@@ -219,14 +219,14 @@ static void process_ce(struct mem_ctl_info *mci, struct e7xxx_error_info *info) row =edac_mc_find_csrow_by_page (mci, page);/* convert syndrome to channel */ channel =e7xxx_find_channel (syndrome); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, page,0 , syndrome, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page,0 , syndrome, row, channel,-1 ,"e7xxx CE" ,"" ); }static void process_ce_no_info (struct mem_ctl_info *mci) {edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e7xxx CE log register overflow" ,"" ); }
@@ -242,7 +242,7 @@ static void process_ue(struct mem_ctl_info *mci, struct e7xxx_error_info *info) block_page = error_2b >>6 ;/* convert to 4k address */ row =edac_mc_find_csrow_by_page (mci, block_page); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, block_page,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , block_page,0 ,0 , row,-1 ,-1 ,"e7xxx UE" ,"" ); }
@@ -250,7 +250,7 @@ static void process_ue_no_info(struct mem_ctl_info *mci) {edac_dbg (3 ,"\n" ); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 ,-1 ,-1 ,-1 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"e7xxx UE log register overflow" ,"" ); }
drivers/edac/edac_core.h +1 -0
@@ -455,6 +455,7 @@ extern int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, unsigned long page); void edac_mc_handle_error(const enum hw_event_mc_err_type type, struct mem_ctl_info *mci, + const u16 error_count, const unsigned long page_frame_number, const unsigned long offset_in_page, const unsigned long syndrome,
drivers/edac/edac_mc.c +32 -24
177 lines not on this page · raw message
drivers/edac/edac_mc_sysfs.c +1 -1
@@ -823,7 +823,7 @@ static ssize_t edac_fake_inject_write(struct file *file, mci->fake_inject_layer[1 ], mci->fake_inject_layer[2 ] ); - edac_mc_handle_error(type, mci, 0, 0, 0, + edac_mc_handle_error(type, mci, 1, 0, 0, 0, mci->fake_inject_layer[0], mci->fake_inject_layer[1], mci->fake_inject_layer[2],
drivers/edac/i3000_edac.c +3 -3
@@ -245,7 +245,7 @@ static int i3000_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &I3000_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -258,12 +258,12 @@ static int i3000_process_error_info(struct mem_ctl_info *mci, row =edac_mc_find_csrow_by_page (mci, pfn);if (info->errsts &I3000_ERRSTS_UE ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , pfn, offset,0 , row,-1 ,-1 ,"i3000 UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, offset, info->derrsyn, row, multi_chan ? channel :0 ,-1 ,"i3000 CE" ,"" );
drivers/edac/i3200_edac.c +3 -3
@@ -218,7 +218,7 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,return ;if ((info->errsts ^ info->errsts2) &I3200_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -226,13 +226,13 @@ static void i3200_process_error_info(struct mem_ctl_info *mci,for (channel =0 ; channel < nr_channels; channel++) { log = info->eccerrlog[channel];if (log &I3200_ECCERRLOG_UE ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 ,"i3000 UE" ,"" ); }else if (log &I3200_ECCERRLOG_CE ) { - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, 0, 0, eccerrlog_syndrome(log), eccerrlog_row(channel, log), -1, -1,
drivers/edac/i5000_edac.c +4 -4
@@ -519,7 +519,7 @@ static void i5000_process_fatal_error_info(struct mem_ctl_info *mci, bank, ras, cas, allErrors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,1 ,0 ,0 ,0 , channel >>1 , channel &1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -618,7 +618,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, rank, bank, ras, cas, ue_errors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 , channel >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -672,7 +672,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , channel >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -718,7 +718,7 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, "Err=%#x (%s)", misc_errors, specific);/* Call the helper to output message */ -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , branch >>1 ,-1 ,-1 ,"Misc error" , msg); }
drivers/edac/i5100_edac.c +2 -2
@@ -431,7 +431,7 @@ static void i5100_handle_ce(struct mem_ctl_info *mci,"bank %u, cas %u, ras %u\n" , bank, cas, ras); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 , syndrome, chan, rank,-1 , msg, detail);
@@ -453,7 +453,7 @@ static void i5100_handle_ue(struct mem_ctl_info *mci,"bank %u, cas %u, ras %u\n" , bank, cas, ras); -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 , syndrome, chan, rank,-1 , msg, detail);
drivers/edac/i5400_edac.c +2 -2
@@ -554,7 +554,7 @@ static void i5400_proccess_non_recoverable_info(struct mem_ctl_info *mci,"Bank=%d Buffer ID = %d RAS=%d CAS=%d Err=0x%lx (%s)" , bank, buf_id, ras, cas, allErrors, error_name[errnum]); -edac_mc_handle_error (tp_event, mci,0 ,0 ,0 , +edac_mc_handle_error (tp_event, mci,1 ,0 ,0 ,0 , branch >>1 ,-1 , rank, rdwr ?"Write error" :"Read error" , msg);
@@ -626,7 +626,7 @@ static void i5400_process_nonfatal_error_info(struct mem_ctl_info *mci, branch >>1 , bank,rdwr_str (rdwr), ras, cas, allErrors, error_name[errnum]); -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , branch >>1 , channel %2 , rank, rdwr ?"Write error" :"Read error" , msg);
drivers/edac/i7300_edac.c +2 -2
@@ -449,7 +449,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)"Bank=%d RAS=%d CAS=%d Err=0x%lx (%s))" , bank, ras, cas, errors, specific); -edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_FATAL , mci,1 ,0 ,0 ,0 , branch,-1 , rank, is_wr ?"Write error" :"Read error" , pvt->tmp_prt_buffer);
@@ -495,7 +495,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)"DRAM-Bank=%d RAS=%d CAS=%d, Err=0x%lx (%s))" , bank, ras, cas, errors, specific); - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 0, 0, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, syndrome, branch >> 1, channel % 2, rank, is_wr ? "Write error" : "Read error",
drivers/edac/i7core_edac.c +2 -2
@@ -1544,7 +1544,7 @@ static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,int i;for (i =0 ; i < add; i++) { -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , chan, dimm,-1 ,"error" ,"" ); } }
@@ -1796,7 +1796,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,* only one event */ if (uncorrected_error || !pvt->is_registered) - edac_mc_handle_error(tp_event, mci, + edac_mc_handle_error(tp_event, mci, 1, m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, syndrome,
drivers/edac/i82443bxgx_edac.c +2 -2
@@ -156,7 +156,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,if (info->eap &I82443BXGX_EAP_OFFSET_SBE ) { error_found =1 ;if (handle_errors) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , mci->ctl_name,"" );
@@ -165,7 +165,7 @@ static int i82443bxgx_edacmc_process_error_info(struct mem_ctl_info *mci,if (info->eap &I82443BXGX_EAP_OFFSET_MBE ) { error_found =1 ;if (handle_errors) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, pageoffset,0 ,edac_mc_find_csrow_by_page (mci, page),0 ,-1 , mci->ctl_name,"" );
drivers/edac/i82860_edac.c +3 -3
@@ -109,7 +109,7 @@ static int i82860_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0003 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -119,12 +119,12 @@ static int i82860_process_error_info(struct mem_ctl_info *mci, dimm = mci->csrows[row]->channels[0 ]->dimm;if (info->errsts &0x0002 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 ,0 , dimm->location[0 ], dimm->location[1 ],-1 ,"i82860 UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 , info->derrsyn, dimm->location[0 ], dimm->location[1 ],-1 ,"i82860 CE" ,"" );
drivers/edac/i82875p_edac.c +3 -3
@@ -236,7 +236,7 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0081 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -246,12 +246,12 @@ static int i82875p_process_error_info(struct mem_ctl_info *mci, row =edac_mc_find_csrow_by_page (mci, info->eap);if (info->errsts &0x0080 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , info->eap,0 ,0 , row,-1 ,-1 ,"i82875p UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , info->eap,0 , info->derrsyn, row, multi_chan ? (info->des &0x1 ) :0 ,-1 ,"i82875p CE" ,"" );
drivers/edac/i82975x_edac.c +3 -3
@@ -288,7 +288,7 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci,return 1 ;if ((info->errsts ^ info->errsts2) &0x0003 ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2; }
@@ -314,12 +314,12 @@ static int i82975x_process_error_info(struct mem_ctl_info *mci, (1 << mci->csrows[row]->channels[chan]->dimm->grain));if (info->errsts &0x0002 ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offst,0 , row,-1 ,-1 ,"i82975x UE" ,"" );else -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , page, offst, info->derrsyn, row, chan ? chan :0 ,-1 ,"i82975x CE" ,"" );
drivers/edac/mpc85xx_edac.c +2 -2
@@ -866,13 +866,13 @@ static void mpc85xx_mc_check(struct mem_ctl_info *mci)mpc85xx_mc_printk (mci,KERN_ERR ,"PFN out of range!\n" );if (err_detect &DDR_EDE_SBE ) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , mci->ctl_name,"" );if (err_detect &DDR_EDE_MBE ) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , pfn, err_addr & ~PAGE_MASK , syndrome, row_index,0 ,-1 , mci->ctl_name,"" );
drivers/edac/mv64x60_edac.c +2 -2
@@ -611,13 +611,13 @@ static void mv64x60_mc_check(struct mem_ctl_info *mci)/* first bit clear in ECC Err Reg, 1 bit error, correctable by HW */ if (!(reg &0x1 )) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , err_addr >>PAGE_SHIFT , err_addr &PAGE_MASK , syndrome,0 ,0 ,-1 , mci->ctl_name,"" );else /* 2 bit error, UE */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, err_addr >> PAGE_SHIFT, err_addr & PAGE_MASK, 0, 0, 0, -1,
drivers/edac/pasemi_edac.c +2 -2
@@ -110,14 +110,14 @@ static void pasemi_edac_process_error_info(struct mem_ctl_info *mci, u32 errsta)/* uncorrectable/multi-bit errors */ if (errsta & (MCDEBUG_ERRSTA_MBE_STATUS |MCDEBUG_ERRSTA_RFL_STATUS )) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , mci->csrows[cs]->first_page,0 ,0 , cs,0 ,-1 , mci->ctl_name,"" ); }/* correctable/single-bit errors */ if (errsta &MCDEBUG_ERRSTA_SBE_STATUS ) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 , mci->csrows[cs]->first_page,0 ,0 , cs,0 ,-1 , mci->ctl_name,"" ); }
drivers/edac/ppc4xx_edac.c +2 -2
@@ -727,7 +727,7 @@ ppc4xx_edac_handle_ce(struct mem_ctl_info *mci,for (row =0 ; row < mci->nr_csrows; row++)if (ppc4xx_edac_check_bank_error (status, row)) -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , row,0 ,-1 , message,"" );
@@ -758,7 +758,7 @@ ppc4xx_edac_handle_ue(struct mem_ctl_info *mci,for (row =0 ; row < mci->nr_csrows; row++)if (ppc4xx_edac_check_bank_error (status, row)) -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 , page, offset,0 , row,0 ,-1 , message,"" );
drivers/edac/r82600_edac.c +2 -2
@@ -179,7 +179,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci, error_found =1 ;if (handle_errors) - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, page, 0, syndrome, edac_mc_find_csrow_by_page(mci, page), 0, -1,
@@ -191,7 +191,7 @@ static int r82600_process_error_info(struct mem_ctl_info *mci,if (handle_errors)/* 82600 doesn't give enough info */ - edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, 1, page, 0, 0, edac_mc_find_csrow_by_page(mci, page), 0, -1,
drivers/edac/sb_edac.c +2 -2
@@ -1447,13 +1447,13 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,/* FIXME: need support for channel mask */ /* Call the helper to output message */ -edac_mc_handle_error (tp_event, mci, +edac_mc_handle_error (tp_event, mci,1 , m->addr >>PAGE_SHIFT , m->addr & ~PAGE_MASK ,0 , channel, dimm,-1 , optype, msg);return ; err_parsing: -edac_mc_handle_error (tp_event, mci,0 ,0 ,0 , +edac_mc_handle_error (tp_event, mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 , msg,"" );
drivers/edac/tile_edac.c +1 -1
@@ -71,7 +71,7 @@ static void tile_edac_check(struct mem_ctl_info *mci)if (mem_error.sbe_count != priv->ce_count) {dev_dbg (mci->pdev,"ECC CE err on node %d\n" , priv->node); priv->ce_count = mem_error.sbe_count; -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 ,0 ,0 ,-1 , mci->ctl_name,"" );
drivers/edac/x38_edac.c +3 -3
@@ -215,7 +215,7 @@ static void x38_process_error_info(struct mem_ctl_info *mci,return ;if ((info->errsts ^ info->errsts2) &X38_ERRSTS_BITS ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,0 ,0 ,0 , +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,-1 ,-1 ,-1 ,"UE overwrote CE" ,"" ); info->errsts = info->errsts2;
@@ -224,13 +224,13 @@ static void x38_process_error_info(struct mem_ctl_info *mci,for (channel =0 ; channel < x38_channel_num; channel++) { log = info->eccerrlog[channel];if (log &X38_ECCERRLOG_UE ) { -edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci, +edac_mc_handle_error (HW_EVENT_ERR_UNCORRECTED , mci,1 ,0 ,0 ,0 ,eccerrlog_row (channel, log),-1 ,-1 ,"x38 UE" ,"" ); }else if (log &X38_ECCERRLOG_CE ) { - edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, eccerrlog_syndrome(log), eccerrlog_row(channel, log), -1, -1,
Signature · 1 line
1.7.10.2
PATCH 4/5 i7core_edac: properly handle error count
In reply to Mauro Carvalho ChehabInstead of generating a burst of errors or reporting the error count via driver-specific details, use the new way provided by edac_mc_handle_error.
--- drivers/edac/i7core_edac.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-)
drivers/edac/i7core_edac.c +12 -21
@@ -1536,18 +1536,6 @@ error:/**************************************************************************** Error check routines ****************************************************************************/ -static void i7core_rdimm_update_errcount (struct mem_ctl_info *mci, -const int chan, -const int dimm, -const int add) -{ -int i; - -for (i =0 ; i < add; i++) { -edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci,1 ,0 ,0 ,0 , - chan, dimm,-1 ,"error" ,"" ); - } -} static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci, const int chan,
@@ -1586,12 +1574,17 @@ static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci,/*updated the edac core */ if (add0 !=0 ) -i7core_rdimm_update_errcount (mci, chan,0 , add0); +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, add0, +0 ,0 ,0 , + chan,0 ,-1 ,"error" ,"" );if (add1 !=0 ) -i7core_rdimm_update_errcount (mci, chan,1 , add1); +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, add1, +0 ,0 ,0 , + chan,1 ,-1 ,"error" ,"" );if (add2 !=0 ) -i7core_rdimm_update_errcount (mci, chan,2 , add2); - +edac_mc_handle_error (HW_EVENT_ERR_CORRECTED , mci, add2, +0 ,0 ,0 , + chan,2 ,-1 ,"error" ,"" ); }static void i7core_rdimm_check_mc_ecc_err (struct mem_ctl_info *mci)
@@ -1710,7 +1703,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, const struct mce *m) {struct i7core_pvt *pvt = mci->pvt_info; -char *type, *optype, *err, msg[80 ]; +char *type, *optype, *err;enum hw_event_mc_err_type tp_event;unsigned long error = m->status &0x1ff0000l ;bool uncorrected_error = m->mcgstatus &1ll <<61 ;
@@ -1788,20 +1781,18 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci, err ="unknown" ; } -snprintf (msg,sizeof (msg),"count=%d %s" , core_err_cnt, optype); -/* * Call the helper to output message * FIXME: what to do if core_err_cnt > 1? Currently, it generates * only one event */ if (uncorrected_error || !pvt->is_registered) -edac_mc_handle_error (tp_event, mci,1 , +edac_mc_handle_error (tp_event, mci, core_err_cnt, m->addr >>PAGE_SHIFT , m->addr & ~PAGE_MASK , syndrome, channel, dimm,-1 , - err, msg); + err, optype); }/*
Signature · 1 line
1.7.10.2
PATCH 5/5 sb_edac: properly handle error count
In reply to Mauro Carvalho ChehabInstead of reporting the error count via driver-specific details, use the new way provided by edac_mc_handle_error.
--- drivers/edac/sb_edac.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/edac/sb_edac.c +3 -4
@@ -1432,8 +1432,7 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,* to the group of dimm's where the error may be happening. */ snprintf(msg, sizeof(msg), - "count:%d%s%s area:%s err_code:%04x:%04x socket:%d channel_mask:%ld rank:%d", - core_err_cnt, + "%s%s area:%s err_code:%04x:%04x socket:%d channel_mask:%ld rank:%d", overflow ? " OVERFLOW" : "", (uncorrected_error && recoverable) ? " recoverable" : "", area_type,
@@ -1447,13 +1446,13 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,/* FIXME: need support for channel mask */ /* Call the helper to output message */ -edac_mc_handle_error (tp_event, mci,1 , +edac_mc_handle_error (tp_event, mci, core_err_cnt, m->addr >>PAGE_SHIFT , m->addr & ~PAGE_MASK ,0 , channel, dimm,-1 , optype, msg);return ; err_parsing: -edac_mc_handle_error (tp_event, mci,1 ,0 ,0 ,0 , +edac_mc_handle_error (tp_event, mci, core_err_cnt,0 ,0 ,0 ,-1 ,-1 ,-1 , msg,"" );
Signature · 1 line
1.7.10.2