xref: /openbmc/linux/fs/proc/uptime.c (revision 22c03398)
1  // SPDX-License-Identifier: GPL-2.0
2  #include <linux/fs.h>
3  #include <linux/init.h>
4  #include <linux/proc_fs.h>
5  #include <linux/sched.h>
6  #include <linux/seq_file.h>
7  #include <linux/time.h>
8  #include <linux/time_namespace.h>
9  #include <linux/kernel_stat.h>
10  
11  static int uptime_proc_show(struct seq_file *m, void *v)
12  {
13  	struct timespec64 uptime;
14  	struct timespec64 idle;
15  	u64 idle_nsec;
16  	u32 rem;
17  	int i;
18  
19  	idle_nsec = 0;
20  	for_each_possible_cpu(i) {
21  		struct kernel_cpustat kcs;
22  
23  		kcpustat_cpu_fetch(&kcs, i);
24  		idle_nsec += get_idle_time(&kcs, i);
25  	}
26  
27  	ktime_get_boottime_ts64(&uptime);
28  	timens_add_boottime(&uptime);
29  
30  	idle.tv_sec = div_u64_rem(idle_nsec, NSEC_PER_SEC, &rem);
31  	idle.tv_nsec = rem;
32  	seq_printf(m, "%lu.%02lu %lu.%02lu\n",
33  			(unsigned long) uptime.tv_sec,
34  			(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
35  			(unsigned long) idle.tv_sec,
36  			(idle.tv_nsec / (NSEC_PER_SEC / 100)));
37  	return 0;
38  }
39  
40  static int __init proc_uptime_init(void)
41  {
42  	proc_create_single("uptime", 0, NULL, uptime_proc_show);
43  	return 0;
44  }
45  fs_initcall(proc_uptime_init);
46