Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RAS, debugfs: Add debugfs interface for RAS subsystem

Implement a new debugfs interface for RAS susbsystem.
A file named daemon_active is added there accordingly.
This file is used to track if user space daemon accesses
perf/trace interface or not. One can track which daemon
opens it via "lsof /path/to/debugfs/ras/daemon_active".

Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
Link: http://lkml.kernel.org/r/1402475691-30045-5-git-send-email-gong.chen@linux.intel.com
Signed-off-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Tony Luck <tony.luck@intel.com>

authored by

Chen, Gong and committed by
Tony Luck
d963cd95 3760cd20

+85 -1
+1 -1
drivers/ras/Makefile
··· 1 - obj-$(CONFIG_RAS) += ras.o 1 + obj-$(CONFIG_RAS) += ras.o debugfs.o
+56
drivers/ras/debugfs.c
··· 1 + #include <linux/debugfs.h> 2 + 3 + static struct dentry *ras_debugfs_dir; 4 + 5 + static atomic_t trace_count = ATOMIC_INIT(0); 6 + 7 + int ras_userspace_consumers(void) 8 + { 9 + return atomic_read(&trace_count); 10 + } 11 + EXPORT_SYMBOL_GPL(ras_userspace_consumers); 12 + 13 + static int trace_show(struct seq_file *m, void *v) 14 + { 15 + return atomic_read(&trace_count); 16 + } 17 + 18 + static int trace_open(struct inode *inode, struct file *file) 19 + { 20 + atomic_inc(&trace_count); 21 + return single_open(file, trace_show, NULL); 22 + } 23 + 24 + static int trace_release(struct inode *inode, struct file *file) 25 + { 26 + atomic_dec(&trace_count); 27 + return single_release(inode, file); 28 + } 29 + 30 + static const struct file_operations trace_fops = { 31 + .open = trace_open, 32 + .read = seq_read, 33 + .llseek = seq_lseek, 34 + .release = trace_release, 35 + }; 36 + 37 + int __init ras_add_daemon_trace(void) 38 + { 39 + struct dentry *fentry; 40 + 41 + if (!ras_debugfs_dir) 42 + return -ENOENT; 43 + 44 + fentry = debugfs_create_file("daemon_active", S_IRUSR, ras_debugfs_dir, 45 + NULL, &trace_fops); 46 + if (!fentry) 47 + return -ENODEV; 48 + 49 + return 0; 50 + 51 + } 52 + 53 + void __init ras_debugfs_init(void) 54 + { 55 + ras_debugfs_dir = debugfs_create_dir("ras", NULL); 56 + }
+14
drivers/ras/ras.c
··· 5 5 * Chen, Gong <gong.chen@linux.intel.com> 6 6 */ 7 7 8 + #include <linux/init.h> 9 + #include <linux/ras.h> 10 + 8 11 #define CREATE_TRACE_POINTS 9 12 #define TRACE_INCLUDE_PATH ../../include/ras 10 13 #include <ras/ras_event.h> 14 + 15 + static int __init ras_init(void) 16 + { 17 + int rc = 0; 18 + 19 + ras_debugfs_init(); 20 + rc = ras_add_daemon_trace(); 21 + 22 + return rc; 23 + } 24 + subsys_initcall(ras_init); 11 25 12 26 EXPORT_TRACEPOINT_SYMBOL_GPL(mc_event);
+14
include/linux/ras.h
··· 1 + #ifndef __RAS_H__ 2 + #define __RAS_H__ 3 + 4 + #ifdef CONFIG_DEBUG_FS 5 + int ras_userspace_consumers(void); 6 + void ras_debugfs_init(void); 7 + int ras_add_daemon_trace(void); 8 + #else 9 + static inline int ras_userspace_consumers(void) { return 0; } 10 + static inline void ras_debugfs_init(void) { return; } 11 + static inline int ras_add_daemon_trace(void) { return 0; } 12 + #endif 13 + 14 + #endif