[PATCH] uml: fix wall_to_monotonic initialization
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>
This commit is contained in:
Родитель
65e62974a8
Коммит
5cb38bc47b
|
@ -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:
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче