um: Pass nsecs to os timer functions

This makes the code clearer and lets the time travel patch have
the actual time used for these functions in just one place.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
Johannes Berg 2019-05-27 10:34:26 +02:00 committed by Richard Weinberger
parent b00bdd3244
commit c7c6f3b953
3 changed files with 12 additions and 16 deletions

View File

@ -251,8 +251,8 @@ extern void os_warn(const char *fmt, ...)
/* time.c */ /* time.c */
extern void os_idle_sleep(unsigned long long nsecs); extern void os_idle_sleep(unsigned long long nsecs);
extern int os_timer_create(void); extern int os_timer_create(void);
extern int os_timer_set_interval(void); extern int os_timer_set_interval(unsigned long long nsecs);
extern int os_timer_one_shot(unsigned long ticks); extern int os_timer_one_shot(unsigned long long nsecs);
extern void os_timer_disable(void); extern void os_timer_disable(void);
extern void uml_idle_timer(void); extern void uml_idle_timer(void);
extern long long os_persistent_clock_emulation(void); extern long long os_persistent_clock_emulation(void);

View File

@ -37,14 +37,14 @@ static int itimer_shutdown(struct clock_event_device *evt)
static int itimer_set_periodic(struct clock_event_device *evt) static int itimer_set_periodic(struct clock_event_device *evt)
{ {
os_timer_set_interval(); os_timer_set_interval(NSEC_PER_SEC / HZ);
return 0; return 0;
} }
static int itimer_next_event(unsigned long delta, static int itimer_next_event(unsigned long delta,
struct clock_event_device *evt) struct clock_event_device *evt)
{ {
return os_timer_one_shot(delta); return os_timer_one_shot(delta + 1);
} }
static int itimer_one_shot(struct clock_event_device *evt) static int itimer_one_shot(struct clock_event_device *evt)

View File

@ -50,18 +50,15 @@ int os_timer_create(void)
return 0; return 0;
} }
int os_timer_set_interval(void) int os_timer_set_interval(unsigned long long nsecs)
{ {
struct itimerspec its; struct itimerspec its;
unsigned long long nsec;
nsec = UM_NSEC_PER_SEC / UM_HZ; its.it_value.tv_sec = nsecs / UM_NSEC_PER_SEC;
its.it_value.tv_nsec = nsecs % UM_NSEC_PER_SEC;
its.it_value.tv_sec = 0; its.it_interval.tv_sec = nsecs / UM_NSEC_PER_SEC;
its.it_value.tv_nsec = nsec; its.it_interval.tv_nsec = nsecs % UM_NSEC_PER_SEC;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = nsec;
if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1) if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1)
return -errno; return -errno;
@ -69,12 +66,11 @@ int os_timer_set_interval(void)
return 0; return 0;
} }
int os_timer_one_shot(unsigned long ticks) int os_timer_one_shot(unsigned long long nsecs)
{ {
unsigned long long nsec = ticks + 1;
struct itimerspec its = { struct itimerspec its = {
.it_value.tv_sec = nsec / UM_NSEC_PER_SEC, .it_value.tv_sec = nsecs / UM_NSEC_PER_SEC,
.it_value.tv_nsec = nsec % UM_NSEC_PER_SEC, .it_value.tv_nsec = nsecs % UM_NSEC_PER_SEC,
.it_interval.tv_sec = 0, .it_interval.tv_sec = 0,
.it_interval.tv_nsec = 0, // we cheat here .it_interval.tv_nsec = 0, // we cheat here