2009-02-20 17:07:22 +03:00
# include <linux/fs.h>
2008-10-03 02:38:18 +04:00
# include <linux/init.h>
# include <linux/proc_fs.h>
# include <linux/sched.h>
2009-02-20 17:07:22 +03:00
# include <linux/seq_file.h>
2008-10-03 02:38:18 +04:00
# include <linux/time.h>
2009-09-24 12:15:19 +04:00
# include <linux/kernel_stat.h>
2014-03-05 19:33:42 +04:00
# include <linux/cputime.h>
2008-10-03 02:38:18 +04:00
2009-02-20 17:07:22 +03:00
static int uptime_proc_show ( struct seq_file * m , void * v )
2008-10-03 02:38:18 +04:00
{
struct timespec uptime ;
struct timespec idle ;
2011-12-19 22:23:15 +04:00
u64 idletime ;
2011-12-15 17:56:10 +04:00
u64 nsec ;
u32 rem ;
2009-09-24 12:15:19 +04:00
int i ;
2011-12-15 17:56:10 +04:00
idletime = 0 ;
2009-09-24 12:15:19 +04:00
for_each_possible_cpu ( i )
2011-12-19 22:23:15 +04:00
idletime + = ( __force u64 ) kcpustat_cpu ( i ) . cpustat [ CPUTIME_IDLE ] ;
2008-10-03 02:38:18 +04:00
2013-07-04 02:08:27 +04:00
get_monotonic_boottime ( & uptime ) ;
2011-12-15 17:56:10 +04:00
nsec = cputime64_to_jiffies64 ( idletime ) * TICK_NSEC ;
idle . tv_sec = div_u64_rem ( nsec , NSEC_PER_SEC , & rem ) ;
idle . tv_nsec = rem ;
2009-02-20 17:07:22 +03:00
seq_printf ( m , " %lu.%02lu %lu.%02lu \n " ,
2008-10-03 02:38:18 +04:00
( unsigned long ) uptime . tv_sec ,
( uptime . tv_nsec / ( NSEC_PER_SEC / 100 ) ) ,
( unsigned long ) idle . tv_sec ,
( idle . tv_nsec / ( NSEC_PER_SEC / 100 ) ) ) ;
2009-02-20 17:07:22 +03:00
return 0 ;
2008-10-03 02:38:18 +04:00
}
2009-02-20 17:07:22 +03:00
static int uptime_proc_open ( struct inode * inode , struct file * file )
{
return single_open ( file , uptime_proc_show , NULL ) ;
}
static const struct file_operations uptime_proc_fops = {
. open = uptime_proc_open ,
. read = seq_read ,
. llseek = seq_lseek ,
. release = single_release ,
} ;
2008-10-03 02:38:18 +04:00
static int __init proc_uptime_init ( void )
{
2009-02-20 17:07:22 +03:00
proc_create ( " uptime " , 0 , NULL , & uptime_proc_fops ) ;
2008-10-03 02:38:18 +04:00
return 0 ;
}
2014-01-24 03:55:45 +04:00
fs_initcall ( proc_uptime_init ) ;