summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2019-05-27 11:34:26 +0300
committerRichard Weinberger <richard@nod.at>2019-07-03 00:27:29 +0300
commitc7c6f3b95303c7de5d52af56c902fcb5abe827df (patch)
treee48fa523e8d88879b53967d660e0795d4df8e139 /arch
parentb00bdd3244005a3a911339b3f977e5fbb21d0879 (diff)
downloadlinux-c7c6f3b95303c7de5d52af56c902fcb5abe827df.tar.xz
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/um/include/shared/os.h4
-rw-r--r--arch/um/kernel/time.c4
-rw-r--r--arch/um/os-Linux/time.c20
3 files changed, 12 insertions, 16 deletions
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h
index 449e71edefaa..4a62ac4251a5 100644
--- a/arch/um/include/shared/os.h
+++ b/arch/um/include/shared/os.h
@@ -251,8 +251,8 @@ extern void os_warn(const char *fmt, ...)
/* time.c */
extern void os_idle_sleep(unsigned long long nsecs);
extern int os_timer_create(void);
-extern int os_timer_set_interval(void);
-extern int os_timer_one_shot(unsigned long ticks);
+extern int os_timer_set_interval(unsigned long long nsecs);
+extern int os_timer_one_shot(unsigned long long nsecs);
extern void os_timer_disable(void);
extern void uml_idle_timer(void);
extern long long os_persistent_clock_emulation(void);
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 3898119f773e..3a2fe54bef65 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -37,14 +37,14 @@ static int itimer_shutdown(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;
}
static int itimer_next_event(unsigned long delta,
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)
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c
index ea720149f5b8..6d94ff52362c 100644
--- a/arch/um/os-Linux/time.c
+++ b/arch/um/os-Linux/time.c
@@ -50,18 +50,15 @@ int os_timer_create(void)
return 0;
}
-int os_timer_set_interval(void)
+int os_timer_set_interval(unsigned long long nsecs)
{
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_value.tv_nsec = nsec;
-
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = nsec;
+ its.it_interval.tv_sec = nsecs / UM_NSEC_PER_SEC;
+ its.it_interval.tv_nsec = nsecs % UM_NSEC_PER_SEC;
if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1)
return -errno;
@@ -69,12 +66,11 @@ int os_timer_set_interval(void)
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 = {
- .it_value.tv_sec = nsec / UM_NSEC_PER_SEC,
- .it_value.tv_nsec = nsec % UM_NSEC_PER_SEC,
+ .it_value.tv_sec = nsecs / UM_NSEC_PER_SEC,
+ .it_value.tv_nsec = nsecs % UM_NSEC_PER_SEC,
.it_interval.tv_sec = 0,
.it_interval.tv_nsec = 0, // we cheat here