From: Antti Kantee Date: Tue, 13 Jan 2015 00:42:27 +0000 (+0100) Subject: Use 64bit values for minios sched sleeps X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=1e71553faec32af113f1d91c8331341eed320ea5;p=rumpuser-xen.git Use 64bit values for minios sched sleeps fixes issues when current _wall_ time in msecs cannot be held in 32bit uint (well, uptime too, but that didn't happen quite a quickly) --- diff --git a/lib/_lwp.c b/lib/_lwp.c index 9bf185f..2f7671c 100644 --- a/lib/_lwp.c +++ b/lib/_lwp.c @@ -177,7 +177,7 @@ ___lwp_park60(clockid_t clock_id, int flags, const struct timespec *ts, _lwp_unpark(unpark, unparkhint); if (ts) { - uint32_t msecs = ts->tv_sec*1000 + ts->tv_nsec/(1000*1000); + uint64_t msecs = ts->tv_sec*1000 + ts->tv_nsec/(1000*1000); if (flags & TIMER_ABSTIME) { rv = minios_absmsleep(msecs); diff --git a/xen/include/mini-os/sched.h b/xen/include/mini-os/sched.h index 3038364..4436cc8 100644 --- a/xen/include/mini-os/sched.h +++ b/xen/include/mini-os/sched.h @@ -52,7 +52,7 @@ void minios_schedule(void); void minios_wake(struct thread *thread); void minios_block(struct thread *thread); -int minios_msleep(uint32_t millisecs); -int minios_absmsleep(uint32_t millisecs); +int minios_msleep(uint64_t millisecs); +int minios_absmsleep(uint64_t millisecs); #endif /* __MINIOS_SCHED_H__ */ diff --git a/xen/sched.c b/xen/sched.c index 9d2dfd7..5293ec2 100644 --- a/xen/sched.c +++ b/xen/sched.c @@ -262,16 +262,22 @@ dosleep(s_time_t wakeuptime) return rv; } -int minios_msleep(uint32_t millisecs) +int minios_msleep(uint64_t millisecs) { return dosleep(NOW() + MILLISECS(millisecs)); } -int minios_absmsleep(uint32_t millisecs) +int minios_absmsleep(uint64_t millisecs) { + uint32_t secs; + uint64_t nsecs; - return dosleep(MILLISECS(millisecs)); + /* oh the silliness! */ + minios_clock_wall(&secs, &nsecs); + millisecs -= 1000ULL*(uint64_t)secs + nsecs/(1000ULL*1000); + + return dosleep(MILLISECS(millisecs) + NOW()); } void minios_wake(struct thread *thread)