linux/fs/proc/uptime.c
<<
>>
Prefs
   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
  10static int uptime_proc_show(struct seq_file *m, void *v)
  11{
  12        struct timespec uptime;
  13        struct timespec idle;
  14        int i;
  15        cputime_t idletime = cputime_zero;
  16
  17        for_each_possible_cpu(i)
  18                idletime = cputime64_add(idletime, kstat_cpu(i).cpustat.idle);
  19
  20        do_posix_clock_monotonic_gettime(&uptime);
  21        monotonic_to_bootbased(&uptime);
  22        cputime_to_timespec(idletime, &idle);
  23        seq_printf(m, "%lu.%02lu %lu.%02lu\n",
  24                        (unsigned long) uptime.tv_sec,
  25                        (uptime.tv_nsec / (NSEC_PER_SEC / 100)),
  26                        (unsigned long) idle.tv_sec,
  27                        (idle.tv_nsec / (NSEC_PER_SEC / 100)));
  28        return 0;
  29}
  30
  31static int uptime_proc_open(struct inode *inode, struct file *file)
  32{
  33        return single_open(file, uptime_proc_show, NULL);
  34}
  35
  36static const struct file_operations uptime_proc_fops = {
  37        .open           = uptime_proc_open,
  38        .read           = seq_read,
  39        .llseek         = seq_lseek,
  40        .release        = single_release,
  41};
  42
  43static int __init proc_uptime_init(void)
  44{
  45        proc_create("uptime", 0, NULL, &uptime_proc_fops);
  46        return 0;
  47}
  48module_init(proc_uptime_init);
  49