EDAC, skx_edac: Clean up debugfs
Subsystems (2)
Luck, Tony
maintainerPATCH v2 3/5 EDAC, skx_edac: Clean up debugfs
From: Qiuxu Zhuo <[email protected]>
1) The skx_edac debugfs node is '/sys/kernel/debug/skx_edac_test, move it under EDAC debugfs root node '/sys/kernel/debug/edac/'
2) Use skx_mce_check_error() instead of skx_decode() for debugfs, then the decoded result is showed via EDAC core. Because EDAC core show the decoded result in a more readable format as like:
CPU_SrcID#[0-9]_MC#[0-9]_Chan#[0-9]_DIMM#[0-9].
Signed-off-by Qiuxu Zhuo <[email protected]>
Signed-off-by Tony Luck <[email protected]>
---
V2: Respond to feedback from Boris
1) Clean up a comment
2) Check return value when creating debug directory
3) NOT changed ... check return when creating file I don't know what useful error message I could print here, so just silently fail. User will just see empty debugfs directory.
drivers/edac/skx_edac.c | 91 ++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 47 deletions(-)
drivers/edac/skx_edac.c +44 -47
@@ -894,53 +894,6 @@ static bool skx_decode(struct decoded_addr *res)skx_rir_decode (res) &&skx_mad_decode (res); } -#ifdef CONFIG_EDAC_DEBUG -/* -* Debug feature. Make /sys/kernel/debug/skx_edac_test/addr. -* Write an address to this file to exercise the address decode -* logic in this driver. -*/ -static struct dentry *skx_test; -static u64 skx_fake_addr; - -static int debugfs_u64_set (void *data,u64 val) -{ -struct decoded_addr res; - - res.addr = val; -skx_decode (&res); - -return 0 ; -} - -DEFINE_SIMPLE_ATTRIBUTE (fops_u64_wo,NULL , debugfs_u64_set,"%llu\n" ); - -static struct dentry *mydebugfs_create (const char *name,umode_t mode, -struct dentry *parent,u64 *value) -{ -return debugfs_create_file (name, mode, parent, value, &fops_u64_wo); -} - -static void setup_skx_debug (void ) -{ - skx_test =debugfs_create_dir ("skx_edac_test" ,NULL ); -mydebugfs_create ("addr" ,S_IWUSR , skx_test, &skx_fake_addr); -} - -static void teardown_skx_debug (void ) -{ -debugfs_remove_recursive (skx_test); -} -#else -static void setup_skx_debug (void ) -{ -} - -static void teardown_skx_debug (void ) -{ -} -#endif /*CONFIG_EDAC_DEBUG*/ -static void skx_mce_output_error (struct mem_ctl_info *mci,const struct mce *m,struct decoded_addr *res)
@@ -1072,6 +1025,50 @@ static struct notifier_block skx_mce_dec = { .priority = MCE_PRIO_EDAC, }; +#ifdef CONFIG_EDAC_DEBUG +/* +* Debug feature. +* Exercise the address decode logic by writing an address to +* /sys/kernel/debug/edac/skx_edac_test/addr. +*/ +static struct dentry *skx_test; +static u64 skx_fake_addr; + +static int debugfs_u64_set (void *data,u64 val) +{ +struct mce m; + + m.mcgstatus =0 ; +/* ADDRV + MemRd + Unknown channel */ + m.status =MCI_STATUS_ADDRV +0x90 ; +/* One corrected error */ + m.status |=1ULL <<MCI_STATUS_CEC_SHIFT ; + m.addr = val; + m.socketid =0 ; +skx_mce_check_error (NULL ,0 , &m); + +return 0 ; +} +DEFINE_SIMPLE_ATTRIBUTE (fops_u64_wo,NULL , debugfs_u64_set,"%llu\n" ); + +static void setup_skx_debug (void ) +{ + skx_test =edac_debugfs_create_dir ("skx_edac_test" ); +if (!skx_test) +return ; +edac_debugfs_create_file ("addr" ,0200 , skx_test, + &skx_fake_addr, &fops_u64_wo); +} + +static void teardown_skx_debug (void ) +{ +debugfs_remove_recursive (skx_test); +} +#else +static void setup_skx_debug (void ) {} +static void teardown_skx_debug (void ) {} +#endif /*CONFIG_EDAC_DEBUG*/ +static void skx_remove (void ) {int i, j;