Skip to content

Commit

Permalink
alarmtimers: Remove period from alarm structure
Browse files Browse the repository at this point in the history
Now that periodic alarmtimers are managed by the handler function,
remove the period value from the alarm structure and let the handlers
manage the interval on their own.

CC: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: John Stultz <john.stultz@linaro.org>
  • Loading branch information
John Stultz committed Aug 10, 2011
1 parent d77e23a commit 9e26476
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 19 deletions.
3 changes: 1 addition & 2 deletions include/linux/alarmtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ enum alarmtimer_restart {
*/
struct alarm {
struct timerqueue_node node;
ktime_t period;
enum alarmtimer_restart (*function)(struct alarm *, ktime_t now);
enum alarmtimer_type type;
bool enabled;
Expand All @@ -39,7 +38,7 @@ struct alarm {

void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
enum alarmtimer_restart (*function)(struct alarm *, ktime_t));
void alarm_start(struct alarm *alarm, ktime_t start, ktime_t period);
void alarm_start(struct alarm *alarm, ktime_t start);
void alarm_cancel(struct alarm *alarm);

u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
Expand Down
5 changes: 4 additions & 1 deletion include/linux/posix-timers.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,10 @@ struct k_itimer {
unsigned long incr;
unsigned long expires;
} mmtimer;
struct alarm alarmtimer;
struct {
struct alarm alarmtimer;
ktime_t interval;
} alarm;
struct rcu_head rcu;
} it;
};
Expand Down
30 changes: 14 additions & 16 deletions kernel/time/alarmtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,6 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
{
timerqueue_init(&alarm->node);
alarm->period = ktime_set(0, 0);
alarm->function = function;
alarm->type = type;
alarm->enabled = 0;
Expand All @@ -313,9 +312,8 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
* alarm_start - Sets an alarm to fire
* @alarm: ptr to alarm to set
* @start: time to run the alarm
* @period: period at which the alarm will recur
*/
void alarm_start(struct alarm *alarm, ktime_t start, ktime_t period)
void alarm_start(struct alarm *alarm, ktime_t start)
{
struct alarm_base *base = &alarm_bases[alarm->type];
unsigned long flags;
Expand All @@ -324,7 +322,6 @@ void alarm_start(struct alarm *alarm, ktime_t start, ktime_t period)
if (alarm->enabled)
alarmtimer_remove(base, alarm);
alarm->node.expires = start;
alarm->period = period;
alarmtimer_enqueue(base, alarm);
alarm->enabled = 1;
spin_unlock_irqrestore(&base->lock, flags);
Expand Down Expand Up @@ -405,13 +402,14 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
ktime_t now)
{
struct k_itimer *ptr = container_of(alarm, struct k_itimer,
it.alarmtimer);
it.alarm.alarmtimer);
if (posix_timer_event(ptr, 0) != 0)
ptr->it_overrun++;

/* Re-add periodic timers */
if (alarm->period.tv64) {
ptr->it_overrun += alarm_forward(alarm, now, alarm->period);
if (ptr->it.alarm.interval.tv64) {
ptr->it_overrun += alarm_forward(alarm, now,
ptr->it.alarm.interval);
return ALARMTIMER_RESTART;
}
return ALARMTIMER_NORESTART;
Expand Down Expand Up @@ -471,7 +469,7 @@ static int alarm_timer_create(struct k_itimer *new_timer)

type = clock2alarm(new_timer->it_clock);
base = &alarm_bases[type];
alarm_init(&new_timer->it.alarmtimer, type, alarm_handle_timer);
alarm_init(&new_timer->it.alarm.alarmtimer, type, alarm_handle_timer);
return 0;
}

Expand All @@ -488,9 +486,9 @@ static void alarm_timer_get(struct k_itimer *timr,
memset(cur_setting, 0, sizeof(struct itimerspec));

cur_setting->it_interval =
ktime_to_timespec(timr->it.alarmtimer.period);
ktime_to_timespec(timr->it.alarm.interval);
cur_setting->it_value =
ktime_to_timespec(timr->it.alarmtimer.node.expires);
ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires);
return;
}

Expand All @@ -505,7 +503,7 @@ static int alarm_timer_del(struct k_itimer *timr)
if (!rtcdev)
return -ENOTSUPP;

alarm_cancel(&timr->it.alarmtimer);
alarm_cancel(&timr->it.alarm.alarmtimer);
return 0;
}

Expand All @@ -529,12 +527,12 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
alarm_timer_get(timr, old_setting);

/* If the timer was already set, cancel it */
alarm_cancel(&timr->it.alarmtimer);
alarm_cancel(&timr->it.alarm.alarmtimer);

/* start the timer */
alarm_start(&timr->it.alarmtimer,
timespec_to_ktime(new_setting->it_value),
timespec_to_ktime(new_setting->it_interval));
timr->it.alarm.interval = timespec_to_ktime(new_setting->it_interval);
alarm_start(&timr->it.alarm.alarmtimer,
timespec_to_ktime(new_setting->it_value));
return 0;
}

Expand Down Expand Up @@ -567,7 +565,7 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp)
alarm->data = (void *)current;
do {
set_current_state(TASK_INTERRUPTIBLE);
alarm_start(alarm, absexp, ktime_set(0, 0));
alarm_start(alarm, absexp);
if (likely(alarm->data))
schedule();

Expand Down

0 comments on commit 9e26476

Please sign in to comment.