Commit 56fc1870 authored by Johannes Berg's avatar Johannes Berg Committed by Richard Weinberger

um: Timer code cleanup

There are some unused functions, and some others that have
unused arguments; clean up the timer code a bit.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent fcd242c6
...@@ -250,15 +250,13 @@ extern void os_warn(const char *fmt, ...) ...@@ -250,15 +250,13 @@ 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* timer); extern int os_timer_create(void);
extern int os_timer_set_interval(void* timer, void* its); extern int os_timer_set_interval(void);
extern int os_timer_one_shot(unsigned long ticks); extern int os_timer_one_shot(unsigned long ticks);
extern long long os_timer_disable(void); extern void os_timer_disable(void);
extern long os_timer_remain(void* timer);
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);
extern long long os_nsecs(void); extern long long os_nsecs(void);
extern long long os_vnsecs(void);
/* skas/mem.c */ /* skas/mem.c */
extern long run_syscall_stub(struct mm_id * mm_idp, extern long run_syscall_stub(struct mm_id * mm_idp,
......
...@@ -37,7 +37,7 @@ static int itimer_shutdown(struct clock_event_device *evt) ...@@ -37,7 +37,7 @@ 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(NULL, NULL); os_timer_set_interval();
return 0; return 0;
} }
...@@ -107,7 +107,7 @@ static void __init um_timer_setup(void) ...@@ -107,7 +107,7 @@ static void __init um_timer_setup(void)
printk(KERN_ERR "register_timer : request_irq failed - " printk(KERN_ERR "register_timer : request_irq failed - "
"errno = %d\n", -err); "errno = %d\n", -err);
err = os_timer_create(NULL); err = os_timer_create();
if (err != 0) { if (err != 0) {
printk(KERN_ERR "creation of timer failed - errno = %d\n", -err); printk(KERN_ERR "creation of timer failed - errno = %d\n", -err);
return; return;
......
...@@ -26,11 +26,11 @@ static inline long long timeval_to_ns(const struct timeval *tv) ...@@ -26,11 +26,11 @@ static inline long long timeval_to_ns(const struct timeval *tv)
static inline long long timespec_to_ns(const struct timespec *ts) static inline long long timespec_to_ns(const struct timespec *ts)
{ {
return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + ts->tv_nsec;
ts->tv_nsec;
} }
long long os_persistent_clock_emulation (void) { long long os_persistent_clock_emulation(void)
{
struct timespec realtime_tp; struct timespec realtime_tp;
clock_gettime(CLOCK_REALTIME, &realtime_tp); clock_gettime(CLOCK_REALTIME, &realtime_tp);
...@@ -40,94 +40,45 @@ long long os_persistent_clock_emulation (void) { ...@@ -40,94 +40,45 @@ long long os_persistent_clock_emulation (void) {
/** /**
* os_timer_create() - create an new posix (interval) timer * os_timer_create() - create an new posix (interval) timer
*/ */
int os_timer_create(void* timer) { int os_timer_create(void)
{
timer_t* t = timer; timer_t *t = &event_high_res_timer;
if(t == NULL) {
t = &event_high_res_timer;
}
if (timer_create( if (timer_create(CLOCK_MONOTONIC, NULL, t) == -1)
CLOCK_MONOTONIC,
NULL,
t) == -1) {
return -1; return -1;
}
return 0; return 0;
} }
int os_timer_set_interval(void* timer, void* i) int os_timer_set_interval(void)
{ {
struct itimerspec its; struct itimerspec its;
unsigned long long nsec; unsigned long long nsec;
timer_t* t = timer;
struct itimerspec* its_in = i;
if(t == NULL) {
t = &event_high_res_timer;
}
nsec = UM_NSEC_PER_SEC / UM_HZ; nsec = UM_NSEC_PER_SEC / UM_HZ;
if(its_in != NULL) {
its.it_value.tv_sec = its_in->it_value.tv_sec;
its.it_value.tv_nsec = its_in->it_value.tv_nsec;
} else {
its.it_value.tv_sec = 0; its.it_value.tv_sec = 0;
its.it_value.tv_nsec = nsec; its.it_value.tv_nsec = nsec;
}
its.it_interval.tv_sec = 0; its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = nsec; its.it_interval.tv_nsec = nsec;
if(timer_settime(*t, 0, &its, NULL) == -1) { if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1)
return -errno; return -errno;
}
return 0; return 0;
} }
/**
* os_timer_remain() - returns the remaining nano seconds of the given interval
* timer
* Because this is the remaining time of an interval timer, which correspondends
* to HZ, this value can never be bigger than one second. Just
* the nanosecond part of the timer is returned.
* The returned time is relative to the start time of the interval timer.
* Return an negative value in an error case.
*/
long os_timer_remain(void* timer)
{
struct itimerspec its;
timer_t* t = timer;
if(t == NULL) {
t = &event_high_res_timer;
}
if(timer_gettime(t, &its) == -1) {
return -errno;
}
return its.it_value.tv_nsec;
}
int os_timer_one_shot(unsigned long ticks) int os_timer_one_shot(unsigned long ticks)
{ {
struct itimerspec its; unsigned long long nsec = ticks + 1;
unsigned long long nsec; struct itimerspec its = {
unsigned long sec; .it_value.tv_sec = nsec / UM_NSEC_PER_SEC,
.it_value.tv_nsec = nsec % UM_NSEC_PER_SEC,
nsec = (ticks + 1);
sec = nsec / UM_NSEC_PER_SEC;
nsec = nsec % UM_NSEC_PER_SEC;
its.it_value.tv_sec = nsec / UM_NSEC_PER_SEC;
its.it_value.tv_nsec = nsec;
its.it_interval.tv_sec = 0; .it_interval.tv_sec = 0,
its.it_interval.tv_nsec = 0; // we cheat here .it_interval.tv_nsec = 0, // we cheat here
};
timer_settime(event_high_res_timer, 0, &its, NULL); timer_settime(event_high_res_timer, 0, &its, NULL);
return 0; return 0;
...@@ -135,24 +86,13 @@ int os_timer_one_shot(unsigned long ticks) ...@@ -135,24 +86,13 @@ int os_timer_one_shot(unsigned long ticks)
/** /**
* os_timer_disable() - disable the posix (interval) timer * os_timer_disable() - disable the posix (interval) timer
* Returns the remaining interval timer time in nanoseconds
*/ */
long long os_timer_disable(void) void os_timer_disable(void)
{ {
struct itimerspec its; struct itimerspec its;
memset(&its, 0, sizeof(struct itimerspec)); memset(&its, 0, sizeof(struct itimerspec));
timer_settime(event_high_res_timer, 0, &its, &its); timer_settime(event_high_res_timer, 0, &its, NULL);
return its.it_value.tv_sec * UM_NSEC_PER_SEC + its.it_value.tv_nsec;
}
long long os_vnsecs(void)
{
struct timespec ts;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&ts);
return timespec_to_ns(&ts);
} }
long long os_nsecs(void) long long os_nsecs(void)
...@@ -169,21 +109,14 @@ long long os_nsecs(void) ...@@ -169,21 +109,14 @@ long long os_nsecs(void)
*/ */
void os_idle_sleep(unsigned long long nsecs) void os_idle_sleep(unsigned long long nsecs)
{ {
struct timespec ts; struct timespec ts = {
if (nsecs <= 0) {
return;
}
ts = ((struct timespec) {
.tv_sec = nsecs / UM_NSEC_PER_SEC, .tv_sec = nsecs / UM_NSEC_PER_SEC,
.tv_nsec = nsecs % UM_NSEC_PER_SEC .tv_nsec = nsecs % UM_NSEC_PER_SEC
}); };
/* /*
* Relay the signal if clock_nanosleep is interrupted. * Relay the signal if clock_nanosleep is interrupted.
*/ */
if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL)) { if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL))
deliver_alarm(); deliver_alarm();
}
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment