LCOV - code coverage report
Current view: top level - kernel/time - alarmtimer.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 22 331 6.6 %
Date: 2021-04-22 12:43:58 Functions: 1 34 2.9 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Alarmtimer interface
       4             :  *
       5             :  * This interface provides a timer which is similarto hrtimers,
       6             :  * but triggers a RTC alarm if the box is suspend.
       7             :  *
       8             :  * This interface is influenced by the Android RTC Alarm timer
       9             :  * interface.
      10             :  *
      11             :  * Copyright (C) 2010 IBM Corperation
      12             :  *
      13             :  * Author: John Stultz <john.stultz@linaro.org>
      14             :  */
      15             : #include <linux/time.h>
      16             : #include <linux/hrtimer.h>
      17             : #include <linux/timerqueue.h>
      18             : #include <linux/rtc.h>
      19             : #include <linux/sched/signal.h>
      20             : #include <linux/sched/debug.h>
      21             : #include <linux/alarmtimer.h>
      22             : #include <linux/mutex.h>
      23             : #include <linux/platform_device.h>
      24             : #include <linux/posix-timers.h>
      25             : #include <linux/workqueue.h>
      26             : #include <linux/freezer.h>
      27             : #include <linux/compat.h>
      28             : #include <linux/module.h>
      29             : #include <linux/time_namespace.h>
      30             : 
      31             : #include "posix-timers.h"
      32             : 
      33             : #define CREATE_TRACE_POINTS
      34             : #include <trace/events/alarmtimer.h>
      35             : 
      36             : /**
      37             :  * struct alarm_base - Alarm timer bases
      38             :  * @lock:               Lock for syncrhonized access to the base
      39             :  * @timerqueue:         Timerqueue head managing the list of events
      40             :  * @get_ktime:          Function to read the time correlating to the base
      41             :  * @get_timespec:       Function to read the namespace time correlating to the base
      42             :  * @base_clockid:       clockid for the base
      43             :  */
      44             : static struct alarm_base {
      45             :         spinlock_t              lock;
      46             :         struct timerqueue_head  timerqueue;
      47             :         ktime_t                 (*get_ktime)(void);
      48             :         void                    (*get_timespec)(struct timespec64 *tp);
      49             :         clockid_t               base_clockid;
      50             : } alarm_bases[ALARM_NUMTYPE];
      51             : 
      52             : #if defined(CONFIG_POSIX_TIMERS) || defined(CONFIG_RTC_CLASS)
      53             : /* freezer information to handle clock_nanosleep triggered wakeups */
      54             : static enum alarmtimer_type freezer_alarmtype;
      55             : static ktime_t freezer_expires;
      56             : static ktime_t freezer_delta;
      57             : static DEFINE_SPINLOCK(freezer_delta_lock);
      58             : #endif
      59             : 
      60             : #ifdef CONFIG_RTC_CLASS
      61             : /* rtc timer and device for setting alarm wakeups at suspend */
      62             : static struct rtc_timer         rtctimer;
      63             : static struct rtc_device        *rtcdev;
      64             : static DEFINE_SPINLOCK(rtcdev_lock);
      65             : 
      66             : /**
      67             :  * alarmtimer_get_rtcdev - Return selected rtcdevice
      68             :  *
      69             :  * This function returns the rtc device to use for wakealarms.
      70             :  */
      71           0 : struct rtc_device *alarmtimer_get_rtcdev(void)
      72             : {
      73           0 :         unsigned long flags;
      74           0 :         struct rtc_device *ret;
      75             : 
      76           0 :         spin_lock_irqsave(&rtcdev_lock, flags);
      77           0 :         ret = rtcdev;
      78           0 :         spin_unlock_irqrestore(&rtcdev_lock, flags);
      79             : 
      80           0 :         return ret;
      81             : }
      82             : EXPORT_SYMBOL_GPL(alarmtimer_get_rtcdev);
      83             : 
      84           0 : static int alarmtimer_rtc_add_device(struct device *dev,
      85             :                                 struct class_interface *class_intf)
      86             : {
      87           0 :         unsigned long flags;
      88           0 :         struct rtc_device *rtc = to_rtc_device(dev);
      89           0 :         struct platform_device *pdev;
      90           0 :         int ret = 0;
      91             : 
      92           0 :         if (rtcdev)
      93             :                 return -EBUSY;
      94             : 
      95           0 :         if (!rtc->ops->set_alarm)
      96             :                 return -1;
      97           0 :         if (!device_may_wakeup(rtc->dev.parent))
      98             :                 return -1;
      99             : 
     100           0 :         pdev = platform_device_register_data(dev, "alarmtimer",
     101             :                                              PLATFORM_DEVID_AUTO, NULL, 0);
     102           0 :         if (!IS_ERR(pdev))
     103           0 :                 device_init_wakeup(&pdev->dev, true);
     104             : 
     105           0 :         spin_lock_irqsave(&rtcdev_lock, flags);
     106           0 :         if (!IS_ERR(pdev) && !rtcdev) {
     107           0 :                 if (!try_module_get(rtc->owner)) {
     108             :                         ret = -1;
     109             :                         goto unlock;
     110             :                 }
     111             : 
     112           0 :                 rtcdev = rtc;
     113             :                 /* hold a reference so it doesn't go away */
     114           0 :                 get_device(dev);
     115           0 :                 pdev = NULL;
     116             :         } else {
     117             :                 ret = -1;
     118             :         }
     119           0 : unlock:
     120           0 :         spin_unlock_irqrestore(&rtcdev_lock, flags);
     121             : 
     122           0 :         platform_device_unregister(pdev);
     123             : 
     124           0 :         return ret;
     125             : }
     126             : 
     127           1 : static inline void alarmtimer_rtc_timer_init(void)
     128             : {
     129           1 :         rtc_timer_init(&rtctimer, NULL, NULL);
     130             : }
     131             : 
     132             : static struct class_interface alarmtimer_rtc_interface = {
     133             :         .add_dev = &alarmtimer_rtc_add_device,
     134             : };
     135             : 
     136           1 : static int alarmtimer_rtc_interface_setup(void)
     137             : {
     138           1 :         alarmtimer_rtc_interface.class = rtc_class;
     139           1 :         return class_interface_register(&alarmtimer_rtc_interface);
     140             : }
     141           0 : static void alarmtimer_rtc_interface_remove(void)
     142             : {
     143           0 :         class_interface_unregister(&alarmtimer_rtc_interface);
     144             : }
     145             : #else
     146             : static inline int alarmtimer_rtc_interface_setup(void) { return 0; }
     147             : static inline void alarmtimer_rtc_interface_remove(void) { }
     148             : static inline void alarmtimer_rtc_timer_init(void) { }
     149             : #endif
     150             : 
     151             : /**
     152             :  * alarmtimer_enqueue - Adds an alarm timer to an alarm_base timerqueue
     153             :  * @base: pointer to the base where the timer is being run
     154             :  * @alarm: pointer to alarm being enqueued.
     155             :  *
     156             :  * Adds alarm to a alarm_base timerqueue
     157             :  *
     158             :  * Must hold base->lock when calling.
     159             :  */
     160           0 : static void alarmtimer_enqueue(struct alarm_base *base, struct alarm *alarm)
     161             : {
     162           0 :         if (alarm->state & ALARMTIMER_STATE_ENQUEUED)
     163           0 :                 timerqueue_del(&base->timerqueue, &alarm->node);
     164             : 
     165           0 :         timerqueue_add(&base->timerqueue, &alarm->node);
     166           0 :         alarm->state |= ALARMTIMER_STATE_ENQUEUED;
     167           0 : }
     168             : 
     169             : /**
     170             :  * alarmtimer_dequeue - Removes an alarm timer from an alarm_base timerqueue
     171             :  * @base: pointer to the base where the timer is running
     172             :  * @alarm: pointer to alarm being removed
     173             :  *
     174             :  * Removes alarm to a alarm_base timerqueue
     175             :  *
     176             :  * Must hold base->lock when calling.
     177             :  */
     178           0 : static void alarmtimer_dequeue(struct alarm_base *base, struct alarm *alarm)
     179             : {
     180           0 :         if (!(alarm->state & ALARMTIMER_STATE_ENQUEUED))
     181             :                 return;
     182             : 
     183           0 :         timerqueue_del(&base->timerqueue, &alarm->node);
     184           0 :         alarm->state &= ~ALARMTIMER_STATE_ENQUEUED;
     185             : }
     186             : 
     187             : 
     188             : /**
     189             :  * alarmtimer_fired - Handles alarm hrtimer being fired.
     190             :  * @timer: pointer to hrtimer being run
     191             :  *
     192             :  * When a alarm timer fires, this runs through the timerqueue to
     193             :  * see which alarms expired, and runs those. If there are more alarm
     194             :  * timers queued for the future, we set the hrtimer to fire when
     195             :  * the next future alarm timer expires.
     196             :  */
     197           0 : static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)
     198             : {
     199           0 :         struct alarm *alarm = container_of(timer, struct alarm, timer);
     200           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     201           0 :         unsigned long flags;
     202           0 :         int ret = HRTIMER_NORESTART;
     203           0 :         int restart = ALARMTIMER_NORESTART;
     204             : 
     205           0 :         spin_lock_irqsave(&base->lock, flags);
     206           0 :         alarmtimer_dequeue(base, alarm);
     207           0 :         spin_unlock_irqrestore(&base->lock, flags);
     208             : 
     209           0 :         if (alarm->function)
     210           0 :                 restart = alarm->function(alarm, base->get_ktime());
     211             : 
     212           0 :         spin_lock_irqsave(&base->lock, flags);
     213           0 :         if (restart != ALARMTIMER_NORESTART) {
     214           0 :                 hrtimer_set_expires(&alarm->timer, alarm->node.expires);
     215           0 :                 alarmtimer_enqueue(base, alarm);
     216           0 :                 ret = HRTIMER_RESTART;
     217             :         }
     218           0 :         spin_unlock_irqrestore(&base->lock, flags);
     219             : 
     220           0 :         trace_alarmtimer_fired(alarm, base->get_ktime());
     221           0 :         return ret;
     222             : 
     223             : }
     224             : 
     225           0 : ktime_t alarm_expires_remaining(const struct alarm *alarm)
     226             : {
     227           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     228           0 :         return ktime_sub(alarm->node.expires, base->get_ktime());
     229             : }
     230             : EXPORT_SYMBOL_GPL(alarm_expires_remaining);
     231             : 
     232             : #ifdef CONFIG_RTC_CLASS
     233             : /**
     234             :  * alarmtimer_suspend - Suspend time callback
     235             :  * @dev: unused
     236             :  *
     237             :  * When we are going into suspend, we look through the bases
     238             :  * to see which is the soonest timer to expire. We then
     239             :  * set an rtc timer to fire that far into the future, which
     240             :  * will wake us from suspend.
     241             :  */
     242           0 : static int alarmtimer_suspend(struct device *dev)
     243             : {
     244           0 :         ktime_t min, now, expires;
     245           0 :         int i, ret, type;
     246           0 :         struct rtc_device *rtc;
     247           0 :         unsigned long flags;
     248           0 :         struct rtc_time tm;
     249             : 
     250           0 :         spin_lock_irqsave(&freezer_delta_lock, flags);
     251           0 :         min = freezer_delta;
     252           0 :         expires = freezer_expires;
     253           0 :         type = freezer_alarmtype;
     254           0 :         freezer_delta = 0;
     255           0 :         spin_unlock_irqrestore(&freezer_delta_lock, flags);
     256             : 
     257           0 :         rtc = alarmtimer_get_rtcdev();
     258             :         /* If we have no rtcdev, just return */
     259           0 :         if (!rtc)
     260             :                 return 0;
     261             : 
     262             :         /* Find the soonest timer to expire*/
     263           0 :         for (i = 0; i < ALARM_NUMTYPE; i++) {
     264           0 :                 struct alarm_base *base = &alarm_bases[i];
     265           0 :                 struct timerqueue_node *next;
     266           0 :                 ktime_t delta;
     267             : 
     268           0 :                 spin_lock_irqsave(&base->lock, flags);
     269           0 :                 next = timerqueue_getnext(&base->timerqueue);
     270           0 :                 spin_unlock_irqrestore(&base->lock, flags);
     271           0 :                 if (!next)
     272           0 :                         continue;
     273           0 :                 delta = ktime_sub(next->expires, base->get_ktime());
     274           0 :                 if (!min || (delta < min)) {
     275           0 :                         expires = next->expires;
     276           0 :                         min = delta;
     277           0 :                         type = i;
     278             :                 }
     279             :         }
     280           0 :         if (min == 0)
     281             :                 return 0;
     282             : 
     283           0 :         if (ktime_to_ns(min) < 2 * NSEC_PER_SEC) {
     284           0 :                 pm_wakeup_event(dev, 2 * MSEC_PER_SEC);
     285             :                 return -EBUSY;
     286             :         }
     287             : 
     288           0 :         trace_alarmtimer_suspend(expires, type);
     289             : 
     290             :         /* Setup an rtc timer to fire that far in the future */
     291           0 :         rtc_timer_cancel(rtc, &rtctimer);
     292           0 :         rtc_read_time(rtc, &tm);
     293           0 :         now = rtc_tm_to_ktime(tm);
     294           0 :         now = ktime_add(now, min);
     295             : 
     296             :         /* Set alarm, if in the past reject suspend briefly to handle */
     297           0 :         ret = rtc_timer_start(rtc, &rtctimer, now, 0);
     298           0 :         if (ret < 0)
     299           0 :                 pm_wakeup_event(dev, MSEC_PER_SEC);
     300           0 :         return ret;
     301             : }
     302             : 
     303           0 : static int alarmtimer_resume(struct device *dev)
     304             : {
     305           0 :         struct rtc_device *rtc;
     306             : 
     307           0 :         rtc = alarmtimer_get_rtcdev();
     308           0 :         if (rtc)
     309           0 :                 rtc_timer_cancel(rtc, &rtctimer);
     310           0 :         return 0;
     311             : }
     312             : 
     313             : #else
     314             : static int alarmtimer_suspend(struct device *dev)
     315             : {
     316             :         return 0;
     317             : }
     318             : 
     319             : static int alarmtimer_resume(struct device *dev)
     320             : {
     321             :         return 0;
     322             : }
     323             : #endif
     324             : 
     325             : static void
     326           0 : __alarm_init(struct alarm *alarm, enum alarmtimer_type type,
     327             :              enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
     328             : {
     329           0 :         timerqueue_init(&alarm->node);
     330           0 :         alarm->timer.function = alarmtimer_fired;
     331           0 :         alarm->function = function;
     332           0 :         alarm->type = type;
     333           0 :         alarm->state = ALARMTIMER_STATE_INACTIVE;
     334             : }
     335             : 
     336             : /**
     337             :  * alarm_init - Initialize an alarm structure
     338             :  * @alarm: ptr to alarm to be initialized
     339             :  * @type: the type of the alarm
     340             :  * @function: callback that is run when the alarm fires
     341             :  */
     342           0 : void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
     343             :                 enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
     344             : {
     345           0 :         hrtimer_init(&alarm->timer, alarm_bases[type].base_clockid,
     346             :                      HRTIMER_MODE_ABS);
     347           0 :         __alarm_init(alarm, type, function);
     348           0 : }
     349             : EXPORT_SYMBOL_GPL(alarm_init);
     350             : 
     351             : /**
     352             :  * alarm_start - Sets an absolute alarm to fire
     353             :  * @alarm: ptr to alarm to set
     354             :  * @start: time to run the alarm
     355             :  */
     356           0 : void alarm_start(struct alarm *alarm, ktime_t start)
     357             : {
     358           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     359           0 :         unsigned long flags;
     360             : 
     361           0 :         spin_lock_irqsave(&base->lock, flags);
     362           0 :         alarm->node.expires = start;
     363           0 :         alarmtimer_enqueue(base, alarm);
     364           0 :         hrtimer_start(&alarm->timer, alarm->node.expires, HRTIMER_MODE_ABS);
     365           0 :         spin_unlock_irqrestore(&base->lock, flags);
     366             : 
     367           0 :         trace_alarmtimer_start(alarm, base->get_ktime());
     368           0 : }
     369             : EXPORT_SYMBOL_GPL(alarm_start);
     370             : 
     371             : /**
     372             :  * alarm_start_relative - Sets a relative alarm to fire
     373             :  * @alarm: ptr to alarm to set
     374             :  * @start: time relative to now to run the alarm
     375             :  */
     376           0 : void alarm_start_relative(struct alarm *alarm, ktime_t start)
     377             : {
     378           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     379             : 
     380           0 :         start = ktime_add_safe(start, base->get_ktime());
     381           0 :         alarm_start(alarm, start);
     382           0 : }
     383             : EXPORT_SYMBOL_GPL(alarm_start_relative);
     384             : 
     385           0 : void alarm_restart(struct alarm *alarm)
     386             : {
     387           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     388           0 :         unsigned long flags;
     389             : 
     390           0 :         spin_lock_irqsave(&base->lock, flags);
     391           0 :         hrtimer_set_expires(&alarm->timer, alarm->node.expires);
     392           0 :         hrtimer_restart(&alarm->timer);
     393           0 :         alarmtimer_enqueue(base, alarm);
     394           0 :         spin_unlock_irqrestore(&base->lock, flags);
     395           0 : }
     396             : EXPORT_SYMBOL_GPL(alarm_restart);
     397             : 
     398             : /**
     399             :  * alarm_try_to_cancel - Tries to cancel an alarm timer
     400             :  * @alarm: ptr to alarm to be canceled
     401             :  *
     402             :  * Returns 1 if the timer was canceled, 0 if it was not running,
     403             :  * and -1 if the callback was running
     404             :  */
     405           0 : int alarm_try_to_cancel(struct alarm *alarm)
     406             : {
     407           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     408           0 :         unsigned long flags;
     409           0 :         int ret;
     410             : 
     411           0 :         spin_lock_irqsave(&base->lock, flags);
     412           0 :         ret = hrtimer_try_to_cancel(&alarm->timer);
     413           0 :         if (ret >= 0)
     414           0 :                 alarmtimer_dequeue(base, alarm);
     415           0 :         spin_unlock_irqrestore(&base->lock, flags);
     416             : 
     417           0 :         trace_alarmtimer_cancel(alarm, base->get_ktime());
     418           0 :         return ret;
     419             : }
     420             : EXPORT_SYMBOL_GPL(alarm_try_to_cancel);
     421             : 
     422             : 
     423             : /**
     424             :  * alarm_cancel - Spins trying to cancel an alarm timer until it is done
     425             :  * @alarm: ptr to alarm to be canceled
     426             :  *
     427             :  * Returns 1 if the timer was canceled, 0 if it was not active.
     428             :  */
     429           0 : int alarm_cancel(struct alarm *alarm)
     430             : {
     431           0 :         for (;;) {
     432           0 :                 int ret = alarm_try_to_cancel(alarm);
     433           0 :                 if (ret >= 0)
     434           0 :                         return ret;
     435           0 :                 hrtimer_cancel_wait_running(&alarm->timer);
     436             :         }
     437             : }
     438             : EXPORT_SYMBOL_GPL(alarm_cancel);
     439             : 
     440             : 
     441           0 : u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval)
     442             : {
     443           0 :         u64 overrun = 1;
     444           0 :         ktime_t delta;
     445             : 
     446           0 :         delta = ktime_sub(now, alarm->node.expires);
     447             : 
     448           0 :         if (delta < 0)
     449             :                 return 0;
     450             : 
     451           0 :         if (unlikely(delta >= interval)) {
     452           0 :                 s64 incr = ktime_to_ns(interval);
     453             : 
     454           0 :                 overrun = ktime_divns(delta, incr);
     455             : 
     456           0 :                 alarm->node.expires = ktime_add_ns(alarm->node.expires,
     457             :                                                         incr*overrun);
     458             : 
     459           0 :                 if (alarm->node.expires > now)
     460             :                         return overrun;
     461             :                 /*
     462             :                  * This (and the ktime_add() below) is the
     463             :                  * correction for exact:
     464             :                  */
     465           0 :                 overrun++;
     466             :         }
     467             : 
     468           0 :         alarm->node.expires = ktime_add_safe(alarm->node.expires, interval);
     469           0 :         return overrun;
     470             : }
     471             : EXPORT_SYMBOL_GPL(alarm_forward);
     472             : 
     473           0 : u64 alarm_forward_now(struct alarm *alarm, ktime_t interval)
     474             : {
     475           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     476             : 
     477           0 :         return alarm_forward(alarm, base->get_ktime(), interval);
     478             : }
     479             : EXPORT_SYMBOL_GPL(alarm_forward_now);
     480             : 
     481             : #ifdef CONFIG_POSIX_TIMERS
     482             : 
     483             : static void alarmtimer_freezerset(ktime_t absexp, enum alarmtimer_type type)
     484             : {
     485             :         struct alarm_base *base;
     486             :         unsigned long flags;
     487             :         ktime_t delta;
     488             : 
     489             :         switch(type) {
     490             :         case ALARM_REALTIME:
     491             :                 base = &alarm_bases[ALARM_REALTIME];
     492             :                 type = ALARM_REALTIME_FREEZER;
     493             :                 break;
     494             :         case ALARM_BOOTTIME:
     495             :                 base = &alarm_bases[ALARM_BOOTTIME];
     496             :                 type = ALARM_BOOTTIME_FREEZER;
     497             :                 break;
     498             :         default:
     499             :                 WARN_ONCE(1, "Invalid alarm type: %d\n", type);
     500             :                 return;
     501             :         }
     502             : 
     503             :         delta = ktime_sub(absexp, base->get_ktime());
     504             : 
     505             :         spin_lock_irqsave(&freezer_delta_lock, flags);
     506             :         if (!freezer_delta || (delta < freezer_delta)) {
     507             :                 freezer_delta = delta;
     508             :                 freezer_expires = absexp;
     509             :                 freezer_alarmtype = type;
     510             :         }
     511             :         spin_unlock_irqrestore(&freezer_delta_lock, flags);
     512             : }
     513             : 
     514             : /**
     515             :  * clock2alarm - helper that converts from clockid to alarmtypes
     516             :  * @clockid: clockid.
     517             :  */
     518           0 : static enum alarmtimer_type clock2alarm(clockid_t clockid)
     519             : {
     520           0 :         if (clockid == CLOCK_REALTIME_ALARM)
     521             :                 return ALARM_REALTIME;
     522           0 :         if (clockid == CLOCK_BOOTTIME_ALARM)
     523           0 :                 return ALARM_BOOTTIME;
     524             :         return -1;
     525             : }
     526             : 
     527             : /**
     528             :  * alarm_handle_timer - Callback for posix timers
     529             :  * @alarm: alarm that fired
     530             :  * @now: time at the timer expiration
     531             :  *
     532             :  * Posix timer callback for expired alarm timers.
     533             :  *
     534             :  * Return: whether the timer is to be restarted
     535             :  */
     536           0 : static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
     537             :                                                         ktime_t now)
     538             : {
     539           0 :         struct k_itimer *ptr = container_of(alarm, struct k_itimer,
     540             :                                             it.alarm.alarmtimer);
     541           0 :         enum alarmtimer_restart result = ALARMTIMER_NORESTART;
     542           0 :         unsigned long flags;
     543           0 :         int si_private = 0;
     544             : 
     545           0 :         spin_lock_irqsave(&ptr->it_lock, flags);
     546             : 
     547           0 :         ptr->it_active = 0;
     548           0 :         if (ptr->it_interval)
     549           0 :                 si_private = ++ptr->it_requeue_pending;
     550             : 
     551           0 :         if (posix_timer_event(ptr, si_private) && ptr->it_interval) {
     552             :                 /*
     553             :                  * Handle ignored signals and rearm the timer. This will go
     554             :                  * away once we handle ignored signals proper.
     555             :                  */
     556           0 :                 ptr->it_overrun += alarm_forward_now(alarm, ptr->it_interval);
     557           0 :                 ++ptr->it_requeue_pending;
     558           0 :                 ptr->it_active = 1;
     559           0 :                 result = ALARMTIMER_RESTART;
     560             :         }
     561           0 :         spin_unlock_irqrestore(&ptr->it_lock, flags);
     562             : 
     563           0 :         return result;
     564             : }
     565             : 
     566             : /**
     567             :  * alarm_timer_rearm - Posix timer callback for rearming timer
     568             :  * @timr:       Pointer to the posixtimer data struct
     569             :  */
     570           0 : static void alarm_timer_rearm(struct k_itimer *timr)
     571             : {
     572           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     573             : 
     574           0 :         timr->it_overrun += alarm_forward_now(alarm, timr->it_interval);
     575           0 :         alarm_start(alarm, alarm->node.expires);
     576           0 : }
     577             : 
     578             : /**
     579             :  * alarm_timer_forward - Posix timer callback for forwarding timer
     580             :  * @timr:       Pointer to the posixtimer data struct
     581             :  * @now:        Current time to forward the timer against
     582             :  */
     583           0 : static s64 alarm_timer_forward(struct k_itimer *timr, ktime_t now)
     584             : {
     585           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     586             : 
     587           0 :         return alarm_forward(alarm, timr->it_interval, now);
     588             : }
     589             : 
     590             : /**
     591             :  * alarm_timer_remaining - Posix timer callback to retrieve remaining time
     592             :  * @timr:       Pointer to the posixtimer data struct
     593             :  * @now:        Current time to calculate against
     594             :  */
     595           0 : static ktime_t alarm_timer_remaining(struct k_itimer *timr, ktime_t now)
     596             : {
     597           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     598             : 
     599           0 :         return ktime_sub(alarm->node.expires, now);
     600             : }
     601             : 
     602             : /**
     603             :  * alarm_timer_try_to_cancel - Posix timer callback to cancel a timer
     604             :  * @timr:       Pointer to the posixtimer data struct
     605             :  */
     606           0 : static int alarm_timer_try_to_cancel(struct k_itimer *timr)
     607             : {
     608           0 :         return alarm_try_to_cancel(&timr->it.alarm.alarmtimer);
     609             : }
     610             : 
     611             : /**
     612             :  * alarm_timer_wait_running - Posix timer callback to wait for a timer
     613             :  * @timr:       Pointer to the posixtimer data struct
     614             :  *
     615             :  * Called from the core code when timer cancel detected that the callback
     616             :  * is running. @timr is unlocked and rcu read lock is held to prevent it
     617             :  * from being freed.
     618             :  */
     619           0 : static void alarm_timer_wait_running(struct k_itimer *timr)
     620             : {
     621           0 :         hrtimer_cancel_wait_running(&timr->it.alarm.alarmtimer.timer);
     622           0 : }
     623             : 
     624             : /**
     625             :  * alarm_timer_arm - Posix timer callback to arm a timer
     626             :  * @timr:       Pointer to the posixtimer data struct
     627             :  * @expires:    The new expiry time
     628             :  * @absolute:   Expiry value is absolute time
     629             :  * @sigev_none: Posix timer does not deliver signals
     630             :  */
     631           0 : static void alarm_timer_arm(struct k_itimer *timr, ktime_t expires,
     632             :                             bool absolute, bool sigev_none)
     633             : {
     634           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     635           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     636             : 
     637           0 :         if (!absolute)
     638           0 :                 expires = ktime_add_safe(expires, base->get_ktime());
     639           0 :         if (sigev_none)
     640           0 :                 alarm->node.expires = expires;
     641             :         else
     642           0 :                 alarm_start(&timr->it.alarm.alarmtimer, expires);
     643           0 : }
     644             : 
     645             : /**
     646             :  * alarm_clock_getres - posix getres interface
     647             :  * @which_clock: clockid
     648             :  * @tp: timespec to fill
     649             :  *
     650             :  * Returns the granularity of underlying alarm base clock
     651             :  */
     652           0 : static int alarm_clock_getres(const clockid_t which_clock, struct timespec64 *tp)
     653             : {
     654           0 :         if (!alarmtimer_get_rtcdev())
     655             :                 return -EINVAL;
     656             : 
     657           0 :         tp->tv_sec = 0;
     658           0 :         tp->tv_nsec = hrtimer_resolution;
     659           0 :         return 0;
     660             : }
     661             : 
     662             : /**
     663             :  * alarm_clock_get_timespec - posix clock_get_timespec interface
     664             :  * @which_clock: clockid
     665             :  * @tp: timespec to fill.
     666             :  *
     667             :  * Provides the underlying alarm base time in a tasks time namespace.
     668             :  */
     669           0 : static int alarm_clock_get_timespec(clockid_t which_clock, struct timespec64 *tp)
     670             : {
     671           0 :         struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
     672             : 
     673           0 :         if (!alarmtimer_get_rtcdev())
     674             :                 return -EINVAL;
     675             : 
     676           0 :         base->get_timespec(tp);
     677             : 
     678           0 :         return 0;
     679             : }
     680             : 
     681             : /**
     682             :  * alarm_clock_get_ktime - posix clock_get_ktime interface
     683             :  * @which_clock: clockid
     684             :  *
     685             :  * Provides the underlying alarm base time in the root namespace.
     686             :  */
     687           0 : static ktime_t alarm_clock_get_ktime(clockid_t which_clock)
     688             : {
     689           0 :         struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
     690             : 
     691           0 :         if (!alarmtimer_get_rtcdev())
     692             :                 return -EINVAL;
     693             : 
     694           0 :         return base->get_ktime();
     695             : }
     696             : 
     697             : /**
     698             :  * alarm_timer_create - posix timer_create interface
     699             :  * @new_timer: k_itimer pointer to manage
     700             :  *
     701             :  * Initializes the k_itimer structure.
     702             :  */
     703           0 : static int alarm_timer_create(struct k_itimer *new_timer)
     704             : {
     705           0 :         enum  alarmtimer_type type;
     706             : 
     707           0 :         if (!alarmtimer_get_rtcdev())
     708             :                 return -EOPNOTSUPP;
     709             : 
     710           0 :         if (!capable(CAP_WAKE_ALARM))
     711             :                 return -EPERM;
     712             : 
     713           0 :         type = clock2alarm(new_timer->it_clock);
     714           0 :         alarm_init(&new_timer->it.alarm.alarmtimer, type, alarm_handle_timer);
     715           0 :         return 0;
     716             : }
     717             : 
     718             : /**
     719             :  * alarmtimer_nsleep_wakeup - Wakeup function for alarm_timer_nsleep
     720             :  * @alarm: ptr to alarm that fired
     721             :  * @now: time at the timer expiration
     722             :  *
     723             :  * Wakes up the task that set the alarmtimer
     724             :  *
     725             :  * Return: ALARMTIMER_NORESTART
     726             :  */
     727           0 : static enum alarmtimer_restart alarmtimer_nsleep_wakeup(struct alarm *alarm,
     728             :                                                                 ktime_t now)
     729             : {
     730           0 :         struct task_struct *task = (struct task_struct *)alarm->data;
     731             : 
     732           0 :         alarm->data = NULL;
     733           0 :         if (task)
     734           0 :                 wake_up_process(task);
     735           0 :         return ALARMTIMER_NORESTART;
     736             : }
     737             : 
     738             : /**
     739             :  * alarmtimer_do_nsleep - Internal alarmtimer nsleep implementation
     740             :  * @alarm: ptr to alarmtimer
     741             :  * @absexp: absolute expiration time
     742             :  * @type: alarm type (BOOTTIME/REALTIME).
     743             :  *
     744             :  * Sets the alarm timer and sleeps until it is fired or interrupted.
     745             :  */
     746           0 : static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
     747             :                                 enum alarmtimer_type type)
     748             : {
     749           0 :         struct restart_block *restart;
     750           0 :         alarm->data = (void *)current;
     751           0 :         do {
     752           0 :                 set_current_state(TASK_INTERRUPTIBLE);
     753           0 :                 alarm_start(alarm, absexp);
     754           0 :                 if (likely(alarm->data))
     755           0 :                         schedule();
     756             : 
     757           0 :                 alarm_cancel(alarm);
     758           0 :         } while (alarm->data && !signal_pending(current));
     759             : 
     760           0 :         __set_current_state(TASK_RUNNING);
     761             : 
     762           0 :         destroy_hrtimer_on_stack(&alarm->timer);
     763             : 
     764           0 :         if (!alarm->data)
     765             :                 return 0;
     766             : 
     767           0 :         if (freezing(current))
     768             :                 alarmtimer_freezerset(absexp, type);
     769           0 :         restart = &current->restart_block;
     770           0 :         if (restart->nanosleep.type != TT_NONE) {
     771           0 :                 struct timespec64 rmt;
     772           0 :                 ktime_t rem;
     773             : 
     774           0 :                 rem = ktime_sub(absexp, alarm_bases[type].get_ktime());
     775             : 
     776           0 :                 if (rem <= 0)
     777             :                         return 0;
     778           0 :                 rmt = ktime_to_timespec64(rem);
     779             : 
     780           0 :                 return nanosleep_copyout(restart, &rmt);
     781             :         }
     782             :         return -ERESTART_RESTARTBLOCK;
     783             : }
     784             : 
     785             : static void
     786           0 : alarm_init_on_stack(struct alarm *alarm, enum alarmtimer_type type,
     787             :                     enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
     788             : {
     789           0 :         hrtimer_init_on_stack(&alarm->timer, alarm_bases[type].base_clockid,
     790             :                               HRTIMER_MODE_ABS);
     791           0 :         __alarm_init(alarm, type, function);
     792           0 : }
     793             : 
     794             : /**
     795             :  * alarm_timer_nsleep_restart - restartblock alarmtimer nsleep
     796             :  * @restart: ptr to restart block
     797             :  *
     798             :  * Handles restarted clock_nanosleep calls
     799             :  */
     800           0 : static long __sched alarm_timer_nsleep_restart(struct restart_block *restart)
     801             : {
     802           0 :         enum  alarmtimer_type type = restart->nanosleep.clockid;
     803           0 :         ktime_t exp = restart->nanosleep.expires;
     804           0 :         struct alarm alarm;
     805             : 
     806           0 :         alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
     807             : 
     808           0 :         return alarmtimer_do_nsleep(&alarm, exp, type);
     809             : }
     810             : 
     811             : /**
     812             :  * alarm_timer_nsleep - alarmtimer nanosleep
     813             :  * @which_clock: clockid
     814             :  * @flags: determins abstime or relative
     815             :  * @tsreq: requested sleep time (abs or rel)
     816             :  *
     817             :  * Handles clock_nanosleep calls against _ALARM clockids
     818             :  */
     819           0 : static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
     820             :                               const struct timespec64 *tsreq)
     821             : {
     822           0 :         enum  alarmtimer_type type = clock2alarm(which_clock);
     823           0 :         struct restart_block *restart = &current->restart_block;
     824           0 :         struct alarm alarm;
     825           0 :         ktime_t exp;
     826           0 :         int ret = 0;
     827             : 
     828           0 :         if (!alarmtimer_get_rtcdev())
     829             :                 return -EOPNOTSUPP;
     830             : 
     831           0 :         if (flags & ~TIMER_ABSTIME)
     832             :                 return -EINVAL;
     833             : 
     834           0 :         if (!capable(CAP_WAKE_ALARM))
     835             :                 return -EPERM;
     836             : 
     837           0 :         alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
     838             : 
     839           0 :         exp = timespec64_to_ktime(*tsreq);
     840             :         /* Convert (if necessary) to absolute time */
     841           0 :         if (flags != TIMER_ABSTIME) {
     842           0 :                 ktime_t now = alarm_bases[type].get_ktime();
     843             : 
     844           0 :                 exp = ktime_add_safe(now, exp);
     845             :         } else {
     846           0 :                 exp = timens_ktime_to_host(which_clock, exp);
     847             :         }
     848             : 
     849           0 :         ret = alarmtimer_do_nsleep(&alarm, exp, type);
     850           0 :         if (ret != -ERESTART_RESTARTBLOCK)
     851             :                 return ret;
     852             : 
     853             :         /* abs timers don't set remaining time or restart */
     854           0 :         if (flags == TIMER_ABSTIME)
     855             :                 return -ERESTARTNOHAND;
     856             : 
     857           0 :         restart->fn = alarm_timer_nsleep_restart;
     858           0 :         restart->nanosleep.clockid = type;
     859           0 :         restart->nanosleep.expires = exp;
     860           0 :         return ret;
     861             : }
     862             : 
     863             : const struct k_clock alarm_clock = {
     864             :         .clock_getres           = alarm_clock_getres,
     865             :         .clock_get_ktime        = alarm_clock_get_ktime,
     866             :         .clock_get_timespec     = alarm_clock_get_timespec,
     867             :         .timer_create           = alarm_timer_create,
     868             :         .timer_set              = common_timer_set,
     869             :         .timer_del              = common_timer_del,
     870             :         .timer_get              = common_timer_get,
     871             :         .timer_arm              = alarm_timer_arm,
     872             :         .timer_rearm            = alarm_timer_rearm,
     873             :         .timer_forward          = alarm_timer_forward,
     874             :         .timer_remaining        = alarm_timer_remaining,
     875             :         .timer_try_to_cancel    = alarm_timer_try_to_cancel,
     876             :         .timer_wait_running     = alarm_timer_wait_running,
     877             :         .nsleep                 = alarm_timer_nsleep,
     878             : };
     879             : #endif /* CONFIG_POSIX_TIMERS */
     880             : 
     881             : 
     882             : /* Suspend hook structures */
     883             : static const struct dev_pm_ops alarmtimer_pm_ops = {
     884             :         .suspend = alarmtimer_suspend,
     885             :         .resume = alarmtimer_resume,
     886             : };
     887             : 
     888             : static struct platform_driver alarmtimer_driver = {
     889             :         .driver = {
     890             :                 .name = "alarmtimer",
     891             :                 .pm = &alarmtimer_pm_ops,
     892             :         }
     893             : };
     894             : 
     895           0 : static void get_boottime_timespec(struct timespec64 *tp)
     896             : {
     897           0 :         ktime_get_boottime_ts64(tp);
     898           0 :         timens_add_boottime(tp);
     899           0 : }
     900             : 
     901             : /**
     902             :  * alarmtimer_init - Initialize alarm timer code
     903             :  *
     904             :  * This function initializes the alarm bases and registers
     905             :  * the posix clock ids.
     906             :  */
     907           1 : static int __init alarmtimer_init(void)
     908             : {
     909           1 :         int error;
     910           1 :         int i;
     911             : 
     912           1 :         alarmtimer_rtc_timer_init();
     913             : 
     914             :         /* Initialize alarm bases */
     915           1 :         alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
     916           1 :         alarm_bases[ALARM_REALTIME].get_ktime = &ktime_get_real;
     917           1 :         alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64;
     918           1 :         alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
     919           1 :         alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
     920           1 :         alarm_bases[ALARM_BOOTTIME].get_timespec = get_boottime_timespec;
     921           3 :         for (i = 0; i < ALARM_NUMTYPE; i++) {
     922           2 :                 timerqueue_init_head(&alarm_bases[i].timerqueue);
     923           2 :                 spin_lock_init(&alarm_bases[i].lock);
     924             :         }
     925             : 
     926           1 :         error = alarmtimer_rtc_interface_setup();
     927           1 :         if (error)
     928             :                 return error;
     929             : 
     930           1 :         error = platform_driver_register(&alarmtimer_driver);
     931           1 :         if (error)
     932           0 :                 goto out_if;
     933             : 
     934             :         return 0;
     935           0 : out_if:
     936           0 :         alarmtimer_rtc_interface_remove();
     937           0 :         return error;
     938             : }
     939             : device_initcall(alarmtimer_init);

Generated by: LCOV version 1.14