Blame view

fs/proc/uptime.c 1.12 KB
961776028   Alexey Dobriyan   proc: switch /pro...
1
2
3
  #include <linux/init.h>
  #include <linux/proc_fs.h>
  #include <linux/sched.h>
961776028   Alexey Dobriyan   proc: switch /pro...
4
5
  #include <linux/time.h>
  #include <asm/cputime.h>
6c87df37d   Alexey Dobriyan   proc: revert /pro...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  static int proc_calc_metrics(char *page, char **start, off_t off,
  				 int count, int *eof, int len)
  {
  	if (len <= off + count)
  		*eof = 1;
  	*start = page + off;
  	len -= off;
  	if (len > count)
  		len = count;
  	if (len < 0)
  		len = 0;
  	return len;
  }
  
  static int uptime_read_proc(char *page, char **start, off_t off, int count,
  			    int *eof, void *data)
961776028   Alexey Dobriyan   proc: switch /pro...
22
23
24
  {
  	struct timespec uptime;
  	struct timespec idle;
6c87df37d   Alexey Dobriyan   proc: revert /pro...
25
  	int len;
961776028   Alexey Dobriyan   proc: switch /pro...
26
27
28
29
30
  	cputime_t idletime = cputime_add(init_task.utime, init_task.stime);
  
  	do_posix_clock_monotonic_gettime(&uptime);
  	monotonic_to_bootbased(&uptime);
  	cputime_to_timespec(idletime, &idle);
6c87df37d   Alexey Dobriyan   proc: revert /pro...
31
32
  	len = sprintf(page, "%lu.%02lu %lu.%02lu
  ",
961776028   Alexey Dobriyan   proc: switch /pro...
33
34
35
36
  			(unsigned long) uptime.tv_sec,
  			(uptime.tv_nsec / (NSEC_PER_SEC / 100)),
  			(unsigned long) idle.tv_sec,
  			(idle.tv_nsec / (NSEC_PER_SEC / 100)));
6c87df37d   Alexey Dobriyan   proc: revert /pro...
37
  	return proc_calc_metrics(page, start, off, count, eof, len);
961776028   Alexey Dobriyan   proc: switch /pro...
38
  }
961776028   Alexey Dobriyan   proc: switch /pro...
39
40
  static int __init proc_uptime_init(void)
  {
6c87df37d   Alexey Dobriyan   proc: revert /pro...
41
  	create_proc_read_entry("uptime", 0, NULL, uptime_read_proc, NULL);
961776028   Alexey Dobriyan   proc: switch /pro...
42
43
44
  	return 0;
  }
  module_init(proc_uptime_init);