1 #include <linux/fs.h> 2 #include <linux/init.h> 3 #include <linux/proc_fs.h> 4 #include <linux/sched.h> 5 #include <linux/seq_file.h> 6 #include <linux/time.h> 7 #include <asm/cputime.h> 8 9 static int uptime_proc_show(struct seq_file *m, void *v) 10 { 11 struct timespec uptime; 12 struct timespec idle; 13 cputime_t idletime = cputime_add(init_task.utime, init_task.stime); 14 15 do_posix_clock_monotonic_gettime(&uptime); 16 monotonic_to_bootbased(&uptime); 17 cputime_to_timespec(idletime, &idle); 18 seq_printf(m, "%lu.%02lu %lu.%02lu\n", 19 (unsigned long) uptime.tv_sec, 20 (uptime.tv_nsec / (NSEC_PER_SEC / 100)), 21 (unsigned long) idle.tv_sec, 22 (idle.tv_nsec / (NSEC_PER_SEC / 100))); 23 return 0; 24 } 25 26 static int uptime_proc_open(struct inode *inode, struct file *file) 27 { 28 return single_open(file, uptime_proc_show, NULL); 29 } 30 31 static const struct file_operations uptime_proc_fops = { 32 .open = uptime_proc_open, 33 .read = seq_read, 34 .llseek = seq_lseek, 35 .release = single_release, 36 }; 37 38 static int __init proc_uptime_init(void) 39 { 40 proc_create("uptime", 0, NULL, &uptime_proc_fops); 41 return 0; 42 } 43 module_init(proc_uptime_init); 44