|
@@ -326,6 +326,17 @@ static int alarmtimer_resume(struct device *dev)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static void
|
|
|
+__alarm_init(struct alarm *alarm, enum alarmtimer_type type,
|
|
|
+ enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
|
|
|
+{
|
|
|
+ timerqueue_init(&alarm->node);
|
|
|
+ alarm->timer.function = alarmtimer_fired;
|
|
|
+ alarm->function = function;
|
|
|
+ alarm->type = type;
|
|
|
+ alarm->state = ALARMTIMER_STATE_INACTIVE;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* alarm_init - Initialize an alarm structure
|
|
|
* @alarm: ptr to alarm to be initialized
|
|
@@ -335,13 +346,9 @@ static int alarmtimer_resume(struct device *dev)
|
|
|
void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
|
|
|
enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
|
|
|
{
|
|
|
- timerqueue_init(&alarm->node);
|
|
|
hrtimer_init(&alarm->timer, alarm_bases[type].base_clockid,
|
|
|
- HRTIMER_MODE_ABS);
|
|
|
- alarm->timer.function = alarmtimer_fired;
|
|
|
- alarm->function = function;
|
|
|
- alarm->type = type;
|
|
|
- alarm->state = ALARMTIMER_STATE_INACTIVE;
|
|
|
+ HRTIMER_MODE_ABS);
|
|
|
+ __alarm_init(alarm, type, function);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(alarm_init);
|
|
|
|
|
@@ -719,6 +726,8 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
|
|
|
|
|
|
__set_current_state(TASK_RUNNING);
|
|
|
|
|
|
+ destroy_hrtimer_on_stack(&alarm->timer);
|
|
|
+
|
|
|
if (!alarm->data)
|
|
|
return 0;
|
|
|
|
|
@@ -740,6 +749,15 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
|
|
|
return -ERESTART_RESTARTBLOCK;
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+alarm_init_on_stack(struct alarm *alarm, enum alarmtimer_type type,
|
|
|
+ enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
|
|
|
+{
|
|
|
+ hrtimer_init_on_stack(&alarm->timer, alarm_bases[type].base_clockid,
|
|
|
+ HRTIMER_MODE_ABS);
|
|
|
+ __alarm_init(alarm, type, function);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* alarm_timer_nsleep_restart - restartblock alarmtimer nsleep
|
|
|
* @restart: ptr to restart block
|
|
@@ -752,7 +770,7 @@ static long __sched alarm_timer_nsleep_restart(struct restart_block *restart)
|
|
|
ktime_t exp = restart->nanosleep.expires;
|
|
|
struct alarm alarm;
|
|
|
|
|
|
- alarm_init(&alarm, type, alarmtimer_nsleep_wakeup);
|
|
|
+ alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
|
|
|
|
|
|
return alarmtimer_do_nsleep(&alarm, exp, type);
|
|
|
}
|
|
@@ -784,7 +802,7 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
|
|
|
if (!capable(CAP_WAKE_ALARM))
|
|
|
return -EPERM;
|
|
|
|
|
|
- alarm_init(&alarm, type, alarmtimer_nsleep_wakeup);
|
|
|
+ alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
|
|
|
|
|
|
exp = timespec64_to_ktime(*tsreq);
|
|
|
/* Convert (if necessary) to absolute time */
|