lkml.org 
[lkml]   [2004]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: boot time, process start time, and NOW time
Albert Cahalan wrote:
> On Mon, 2004-08-16 at 20:31, George Anzinger wrote:
>
>
>>Hm... That patch was for a reason... It seems to me that doing anything short
>>of putting "xtime" (or better, clock_gettime() :)) in at fork time is not going
>>to fix anything. As written the start_time in the task_struct is fixed. If
>>"now - uptime + time_from_boot_to_process_start" it is wandering, it must be the
>>fault of "now - uptime". Since this seems to be wandering, and we corrected
>>uptime in the referenced patch, is it safe to assume that "now" is actually
>>being computed from "jiffies" rather than a gettimeofday()?
>>
>>Seems like that is where we should be changing things.
>
>
> That's userspace, which works fine on a 2.4.xx kernel.
> If userspace were to change, it wouldn't work OK for
> a 2.4.xx kernel anymore. So consider that cast in stone.
>
> "now" is the time() function. Using gettimeofday()
> would only make sense if I decided to pay the cost
> of asking for the time every time I look at a task.
>
> Here is the "now - uptime + time_from_boot_to_process_start"
> calculation, unsimplified, ripped from the procps code:
>
> ////////////////////////////////////////////////////////////////
> unsigned long seconds_since_boot = -1;
> static unsigned long seconds_since_1970;
> static unsigned long time_of_boot;
>
> some_init_function(){
> seconds_since_boot = uptime(0,0);
> seconds_since_1970 = time(NULL);
> time_of_boot = seconds_since_1970 - seconds_since_boot;
> }
>
> static int pr_stime(char *restrict const outbuf, const proc_t *restrict const pp){
> struct tm *proc_time;
> struct tm *our_time;
> time_t t;
> const char *fmt;
> int tm_year;
> int tm_yday;
> our_time = localtime(&seconds_since_1970); /* not reentrant */
> tm_year = our_time->tm_year;
> tm_yday = our_time->tm_yday;
> t = time_of_boot + pp->start_time / Hertz;
> proc_time = localtime(&t); /* not reentrant, this corrupts our_time */
> fmt = "%H:%M"; /* 03:02 23:59 */
> if(tm_yday != proc_time->tm_yday) fmt = "%b%d"; /* Jun06 Aug27 */
> if(tm_year != proc_time->tm_year) fmt = "%Y"; /* 1991 2001 */
> return strftime(outbuf, 42, fmt, proc_time);
> }
> ////////////////////////////////////////////////////////////////
>
>
Hm, I assume time() just returns the seconds part of gettimeofday(). Is
uptime() local to procps? What does it do? You implied it uses the kernel
version of up time, right? Given all this, I don't see how it can wander.

An interesting question: does it wander if ntp is not in the mix?

>

--
George Anzinger george@mvista.com
High-res-timers: http://sourceforge.net/projects/high-res-timers/
Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:05    [W:0.109 / U:1.296 seconds]
©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site