Branch data Line data Source code
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 <linux/kernel_stat.h>
8 : : #include <asm/cputime.h>
9 : :
10 : 0 : static int uptime_proc_show(struct seq_file *m, void *v)
11 : : {
12 : : struct timespec uptime;
13 : : struct timespec idle;
14 : : u64 idletime;
15 : : u64 nsec;
16 : : u32 rem;
17 : : int i;
18 : :
19 : : idletime = 0;
20 [ + + ]: 1855 : for_each_possible_cpu(i)
21 : 1325 : idletime += (__force u64) kcpustat_cpu(i).cpustat[CPUTIME_IDLE];
22 : :
23 : 265 : get_monotonic_boottime(&uptime);
24 : 265 : nsec = cputime64_to_jiffies64(idletime) * TICK_NSEC;
25 : 265 : idle.tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem);
26 : 265 : idle.tv_nsec = rem;
27 : 265 : seq_printf(m, "%lu.%02lu %lu.%02lu\n",
28 : 265 : (unsigned long) uptime.tv_sec,
29 : 265 : (uptime.tv_nsec / (NSEC_PER_SEC / 100)),
30 : : (unsigned long) idle.tv_sec,
31 : : (idle.tv_nsec / (NSEC_PER_SEC / 100)));
32 : 265 : return 0;
33 : : }
34 : :
35 : 0 : static int uptime_proc_open(struct inode *inode, struct file *file)
36 : : {
37 : 265 : return single_open(file, uptime_proc_show, NULL);
38 : : }
39 : :
40 : : static const struct file_operations uptime_proc_fops = {
41 : : .open = uptime_proc_open,
42 : : .read = seq_read,
43 : : .llseek = seq_lseek,
44 : : .release = single_release,
45 : : };
46 : :
47 : 0 : static int __init proc_uptime_init(void)
48 : : {
49 : : proc_create("uptime", 0, NULL, &uptime_proc_fops);
50 : 0 : return 0;
51 : : }
52 : : fs_initcall(proc_uptime_init);
|