Skip to content

Commit

Permalink
[PATCH] uml: fix wall_to_monotonic initialization
Browse files Browse the repository at this point in the history
From: Jeff Dike <jdike@addtoit.com>

Initialize wall_to_monotonic correctly.  This fixes a problem where sleeps
lasted about one secone less than they should.  This also called for a bit of
code restructuring, following a patch which Blaisorblade had been keeping.

Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Jun 5, 2006
1 parent 65e6297 commit 5cb38bc
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 20 deletions.
13 changes: 2 additions & 11 deletions arch/um/include/kern_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,11 @@ extern int is_syscall(unsigned long addr);
extern void free_irq(unsigned int, void *);
extern int cpu(void);

extern void time_init_kern(void);

/* Are we disallowed to sleep? Used to choose between GFP_KERNEL and GFP_ATOMIC. */
extern int __cant_sleep(void);
extern void segv_handler(int sig, union uml_pt_regs *regs);
extern void sigio_handler(int sig, union uml_pt_regs *regs);

#endif

/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
10 changes: 10 additions & 0 deletions arch/um/kernel/time_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@ void timer_irq(union uml_pt_regs *regs)
}
}


void time_init_kern(void)
{
unsigned long long nsecs;

nsecs = os_nsecs();
set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
-nsecs % BILLION);
}

void do_boot_timer_handler(struct sigcontext * sc)
{
struct pt_regs regs;
Expand Down
10 changes: 1 addition & 9 deletions arch/um/os-Linux/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,20 +81,12 @@ void uml_idle_timer(void)
set_interval(ITIMER_REAL);
}

extern void ktime_get_ts(struct timespec *ts);
#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)

void time_init(void)
{
struct timespec now;

if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR)
panic("Couldn't set SIGVTALRM handler");
set_interval(ITIMER_VIRTUAL);

do_posix_clock_monotonic_gettime(&now);
wall_to_monotonic.tv_sec = -now.tv_sec;
wall_to_monotonic.tv_nsec = -now.tv_nsec;
time_init_kern();
}

unsigned long long os_nsecs(void)
Expand Down

0 comments on commit 5cb38bc

Please sign in to comment.