| #include <linux/fs.h> |
| #include <linux/proc_fs.h> |
| #include <linux/seq_file.h> |
| |
| ATOMIC_NOTIFIER_HEAD(show_mem_extra_notifier); |
| |
| /** |
| * Call show_mem notifiers to print out extra memory information |
| * @s: seq_file into which print log out, if Null print to kernel log buffer |
| */ |
| static void __show_mem_extra_call_notifiers(struct seq_file *s) |
| { |
| atomic_notifier_call_chain(&show_mem_extra_notifier, 0, s); |
| if (s == NULL) |
| printk("\n"); |
| } |
| |
| int show_mem_extra_notifier_register(struct notifier_block *nb) |
| { |
| return atomic_notifier_chain_register(&show_mem_extra_notifier, nb); |
| } |
| |
| int show_mem_extra_notifier_unregister(struct notifier_block *nb) |
| { |
| return atomic_notifier_chain_unregister(&show_mem_extra_notifier, nb); |
| } |
| |
| void show_mem_extra_call_notifiers(void) |
| { |
| __show_mem_extra_call_notifiers(NULL); |
| } |
| |
| static int meminfo_extra_proc_show(struct seq_file *m, void *v) |
| { |
| __show_mem_extra_call_notifiers(m); |
| return 0; |
| } |
| |
| static int meminfo_extra_proc_open(struct inode *inode, struct file *file) |
| { |
| return single_open(file, meminfo_extra_proc_show, NULL); |
| } |
| |
| static const struct file_operations meminfo_extra_proc_fops = { |
| .open = meminfo_extra_proc_open, |
| .read = seq_read, |
| .llseek = seq_lseek, |
| .release = single_release, |
| }; |
| |
| static int __init proc_meminfo_extra_init(void) |
| { |
| proc_create("meminfo_extra", 0444, NULL, &meminfo_extra_proc_fops); |
| return 0; |
| } |
| fs_initcall(proc_meminfo_extra_init); |
| |