LCOV - code coverage report
Current view: top level - kernel/time - alarmtimer.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 13 148 8.8 %
Date: 2023-04-06 08:38:28 Functions: 1 26 3.8 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Alarmtimer interface
       4             :  *
       5             :  * This interface provides a timer which is similar to 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 Corporation
      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             : struct rtc_device *alarmtimer_get_rtcdev(void)
      72             : {
      73             :         unsigned long flags;
      74             :         struct rtc_device *ret;
      75             : 
      76             :         spin_lock_irqsave(&rtcdev_lock, flags);
      77             :         ret = rtcdev;
      78             :         spin_unlock_irqrestore(&rtcdev_lock, flags);
      79             : 
      80             :         return ret;
      81             : }
      82             : EXPORT_SYMBOL_GPL(alarmtimer_get_rtcdev);
      83             : 
      84             : static int alarmtimer_rtc_add_device(struct device *dev,
      85             :                                 struct class_interface *class_intf)
      86             : {
      87             :         unsigned long flags;
      88             :         struct rtc_device *rtc = to_rtc_device(dev);
      89             :         struct platform_device *pdev;
      90             :         int ret = 0;
      91             : 
      92             :         if (rtcdev)
      93             :                 return -EBUSY;
      94             : 
      95             :         if (!test_bit(RTC_FEATURE_ALARM, rtc->features))
      96             :                 return -1;
      97             :         if (!device_may_wakeup(rtc->dev.parent))
      98             :                 return -1;
      99             : 
     100             :         pdev = platform_device_register_data(dev, "alarmtimer",
     101             :                                              PLATFORM_DEVID_AUTO, NULL, 0);
     102             :         if (!IS_ERR(pdev))
     103             :                 device_init_wakeup(&pdev->dev, true);
     104             : 
     105             :         spin_lock_irqsave(&rtcdev_lock, flags);
     106             :         if (!IS_ERR(pdev) && !rtcdev) {
     107             :                 if (!try_module_get(rtc->owner)) {
     108             :                         ret = -1;
     109             :                         goto unlock;
     110             :                 }
     111             : 
     112             :                 rtcdev = rtc;
     113             :                 /* hold a reference so it doesn't go away */
     114             :                 get_device(dev);
     115             :                 pdev = NULL;
     116             :         } else {
     117             :                 ret = -1;
     118             :         }
     119             : unlock:
     120             :         spin_unlock_irqrestore(&rtcdev_lock, flags);
     121             : 
     122             :         platform_device_unregister(pdev);
     123             : 
     124             :         return ret;
     125             : }
     126             : 
     127             : static inline void alarmtimer_rtc_timer_init(void)
     128             : {
     129             :         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             : static int alarmtimer_rtc_interface_setup(void)
     137             : {
     138             :         alarmtimer_rtc_interface.class = rtc_class;
     139             :         return class_interface_register(&alarmtimer_rtc_interface);
     140             : }
     141             : static void alarmtimer_rtc_interface_remove(void)
     142             : {
     143             :         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             : 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             :         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             : static int alarmtimer_suspend(struct device *dev)
     243             : {
     244             :         ktime_t min, now, expires;
     245             :         int i, ret, type;
     246             :         struct rtc_device *rtc;
     247             :         unsigned long flags;
     248             :         struct rtc_time tm;
     249             : 
     250             :         spin_lock_irqsave(&freezer_delta_lock, flags);
     251             :         min = freezer_delta;
     252             :         expires = freezer_expires;
     253             :         type = freezer_alarmtype;
     254             :         freezer_delta = 0;
     255             :         spin_unlock_irqrestore(&freezer_delta_lock, flags);
     256             : 
     257             :         rtc = alarmtimer_get_rtcdev();
     258             :         /* If we have no rtcdev, just return */
     259             :         if (!rtc)
     260             :                 return 0;
     261             : 
     262             :         /* Find the soonest timer to expire*/
     263             :         for (i = 0; i < ALARM_NUMTYPE; i++) {
     264             :                 struct alarm_base *base = &alarm_bases[i];
     265             :                 struct timerqueue_node *next;
     266             :                 ktime_t delta;
     267             : 
     268             :                 spin_lock_irqsave(&base->lock, flags);
     269             :                 next = timerqueue_getnext(&base->timerqueue);
     270             :                 spin_unlock_irqrestore(&base->lock, flags);
     271             :                 if (!next)
     272             :                         continue;
     273             :                 delta = ktime_sub(next->expires, base->get_ktime());
     274             :                 if (!min || (delta < min)) {
     275             :                         expires = next->expires;
     276             :                         min = delta;
     277             :                         type = i;
     278             :                 }
     279             :         }
     280             :         if (min == 0)
     281             :                 return 0;
     282             : 
     283             :         if (ktime_to_ns(min) < 2 * NSEC_PER_SEC) {
     284             :                 pm_wakeup_event(dev, 2 * MSEC_PER_SEC);
     285             :                 return -EBUSY;
     286             :         }
     287             : 
     288             :         trace_alarmtimer_suspend(expires, type);
     289             : 
     290             :         /* Setup an rtc timer to fire that far in the future */
     291             :         rtc_timer_cancel(rtc, &rtctimer);
     292             :         rtc_read_time(rtc, &tm);
     293             :         now = rtc_tm_to_ktime(tm);
     294             :         now = ktime_add(now, min);
     295             : 
     296             :         /* Set alarm, if in the past reject suspend briefly to handle */
     297             :         ret = rtc_timer_start(rtc, &rtctimer, now, 0);
     298             :         if (ret < 0)
     299             :                 pm_wakeup_event(dev, MSEC_PER_SEC);
     300             :         return ret;
     301             : }
     302             : 
     303             : static int alarmtimer_resume(struct device *dev)
     304             : {
     305             :         struct rtc_device *rtc;
     306             : 
     307             :         rtc = alarmtimer_get_rtcdev();
     308             :         if (rtc)
     309             :                 rtc_timer_cancel(rtc, &rtctimer);
     310             :         return 0;
     311             : }
     312             : 
     313             : #else
     314           0 : static int alarmtimer_suspend(struct device *dev)
     315             : {
     316           0 :         return 0;
     317             : }
     318             : 
     319           0 : static int alarmtimer_resume(struct device *dev)
     320             : {
     321           0 :         return 0;
     322             : }
     323             : #endif
     324             : 
     325             : static void
     326             : __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             :         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             :         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             :         unsigned long flags;
     409             :         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             :                 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             :         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             :         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             : static u64 __alarm_forward_now(struct alarm *alarm, ktime_t interval, bool throttle)
     474             : {
     475           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     476           0 :         ktime_t now = base->get_ktime();
     477             : 
     478             :         if (IS_ENABLED(CONFIG_HIGH_RES_TIMERS) && throttle) {
     479             :                 /*
     480             :                  * Same issue as with posix_timer_fn(). Timers which are
     481             :                  * periodic but the signal is ignored can starve the system
     482             :                  * with a very small interval. The real fix which was
     483             :                  * promised in the context of posix_timer_fn() never
     484             :                  * materialized, but someone should really work on it.
     485             :                  *
     486             :                  * To prevent DOS fake @now to be 1 jiffie out which keeps
     487             :                  * the overrun accounting correct but creates an
     488             :                  * inconsistency vs. timer_gettime(2).
     489             :                  */
     490             :                 ktime_t kj = NSEC_PER_SEC / HZ;
     491             : 
     492             :                 if (interval < kj)
     493             :                         now = ktime_add(now, kj);
     494             :         }
     495             : 
     496           0 :         return alarm_forward(alarm, now, interval);
     497             : }
     498             : 
     499           0 : u64 alarm_forward_now(struct alarm *alarm, ktime_t interval)
     500             : {
     501           0 :         return __alarm_forward_now(alarm, interval, false);
     502             : }
     503             : EXPORT_SYMBOL_GPL(alarm_forward_now);
     504             : 
     505             : #ifdef CONFIG_POSIX_TIMERS
     506             : 
     507             : static void alarmtimer_freezerset(ktime_t absexp, enum alarmtimer_type type)
     508             : {
     509             :         struct alarm_base *base;
     510             :         unsigned long flags;
     511             :         ktime_t delta;
     512             : 
     513             :         switch(type) {
     514             :         case ALARM_REALTIME:
     515             :                 base = &alarm_bases[ALARM_REALTIME];
     516             :                 type = ALARM_REALTIME_FREEZER;
     517             :                 break;
     518             :         case ALARM_BOOTTIME:
     519             :                 base = &alarm_bases[ALARM_BOOTTIME];
     520             :                 type = ALARM_BOOTTIME_FREEZER;
     521             :                 break;
     522             :         default:
     523             :                 WARN_ONCE(1, "Invalid alarm type: %d\n", type);
     524             :                 return;
     525             :         }
     526             : 
     527             :         delta = ktime_sub(absexp, base->get_ktime());
     528             : 
     529             :         spin_lock_irqsave(&freezer_delta_lock, flags);
     530             :         if (!freezer_delta || (delta < freezer_delta)) {
     531             :                 freezer_delta = delta;
     532             :                 freezer_expires = absexp;
     533             :                 freezer_alarmtype = type;
     534             :         }
     535             :         spin_unlock_irqrestore(&freezer_delta_lock, flags);
     536             : }
     537             : 
     538             : /**
     539             :  * clock2alarm - helper that converts from clockid to alarmtypes
     540             :  * @clockid: clockid.
     541             :  */
     542             : static enum alarmtimer_type clock2alarm(clockid_t clockid)
     543             : {
     544             :         if (clockid == CLOCK_REALTIME_ALARM)
     545             :                 return ALARM_REALTIME;
     546             :         if (clockid == CLOCK_BOOTTIME_ALARM)
     547             :                 return ALARM_BOOTTIME;
     548             :         return -1;
     549             : }
     550             : 
     551             : /**
     552             :  * alarm_handle_timer - Callback for posix timers
     553             :  * @alarm: alarm that fired
     554             :  * @now: time at the timer expiration
     555             :  *
     556             :  * Posix timer callback for expired alarm timers.
     557             :  *
     558             :  * Return: whether the timer is to be restarted
     559             :  */
     560             : static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
     561             :                                                         ktime_t now)
     562             : {
     563             :         struct k_itimer *ptr = container_of(alarm, struct k_itimer,
     564             :                                             it.alarm.alarmtimer);
     565             :         enum alarmtimer_restart result = ALARMTIMER_NORESTART;
     566             :         unsigned long flags;
     567             :         int si_private = 0;
     568             : 
     569             :         spin_lock_irqsave(&ptr->it_lock, flags);
     570             : 
     571             :         ptr->it_active = 0;
     572             :         if (ptr->it_interval)
     573             :                 si_private = ++ptr->it_requeue_pending;
     574             : 
     575             :         if (posix_timer_event(ptr, si_private) && ptr->it_interval) {
     576             :                 /*
     577             :                  * Handle ignored signals and rearm the timer. This will go
     578             :                  * away once we handle ignored signals proper. Ensure that
     579             :                  * small intervals cannot starve the system.
     580             :                  */
     581             :                 ptr->it_overrun += __alarm_forward_now(alarm, ptr->it_interval, true);
     582             :                 ++ptr->it_requeue_pending;
     583             :                 ptr->it_active = 1;
     584             :                 result = ALARMTIMER_RESTART;
     585             :         }
     586             :         spin_unlock_irqrestore(&ptr->it_lock, flags);
     587             : 
     588             :         return result;
     589             : }
     590             : 
     591             : /**
     592             :  * alarm_timer_rearm - Posix timer callback for rearming timer
     593             :  * @timr:       Pointer to the posixtimer data struct
     594             :  */
     595           0 : static void alarm_timer_rearm(struct k_itimer *timr)
     596             : {
     597           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     598             : 
     599           0 :         timr->it_overrun += alarm_forward_now(alarm, timr->it_interval);
     600           0 :         alarm_start(alarm, alarm->node.expires);
     601           0 : }
     602             : 
     603             : /**
     604             :  * alarm_timer_forward - Posix timer callback for forwarding timer
     605             :  * @timr:       Pointer to the posixtimer data struct
     606             :  * @now:        Current time to forward the timer against
     607             :  */
     608           0 : static s64 alarm_timer_forward(struct k_itimer *timr, ktime_t now)
     609             : {
     610           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     611             : 
     612           0 :         return alarm_forward(alarm, timr->it_interval, now);
     613             : }
     614             : 
     615             : /**
     616             :  * alarm_timer_remaining - Posix timer callback to retrieve remaining time
     617             :  * @timr:       Pointer to the posixtimer data struct
     618             :  * @now:        Current time to calculate against
     619             :  */
     620           0 : static ktime_t alarm_timer_remaining(struct k_itimer *timr, ktime_t now)
     621             : {
     622           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     623             : 
     624           0 :         return ktime_sub(alarm->node.expires, now);
     625             : }
     626             : 
     627             : /**
     628             :  * alarm_timer_try_to_cancel - Posix timer callback to cancel a timer
     629             :  * @timr:       Pointer to the posixtimer data struct
     630             :  */
     631           0 : static int alarm_timer_try_to_cancel(struct k_itimer *timr)
     632             : {
     633           0 :         return alarm_try_to_cancel(&timr->it.alarm.alarmtimer);
     634             : }
     635             : 
     636             : /**
     637             :  * alarm_timer_wait_running - Posix timer callback to wait for a timer
     638             :  * @timr:       Pointer to the posixtimer data struct
     639             :  *
     640             :  * Called from the core code when timer cancel detected that the callback
     641             :  * is running. @timr is unlocked and rcu read lock is held to prevent it
     642             :  * from being freed.
     643             :  */
     644           0 : static void alarm_timer_wait_running(struct k_itimer *timr)
     645             : {
     646           0 :         hrtimer_cancel_wait_running(&timr->it.alarm.alarmtimer.timer);
     647           0 : }
     648             : 
     649             : /**
     650             :  * alarm_timer_arm - Posix timer callback to arm a timer
     651             :  * @timr:       Pointer to the posixtimer data struct
     652             :  * @expires:    The new expiry time
     653             :  * @absolute:   Expiry value is absolute time
     654             :  * @sigev_none: Posix timer does not deliver signals
     655             :  */
     656           0 : static void alarm_timer_arm(struct k_itimer *timr, ktime_t expires,
     657             :                             bool absolute, bool sigev_none)
     658             : {
     659           0 :         struct alarm *alarm = &timr->it.alarm.alarmtimer;
     660           0 :         struct alarm_base *base = &alarm_bases[alarm->type];
     661             : 
     662           0 :         if (!absolute)
     663           0 :                 expires = ktime_add_safe(expires, base->get_ktime());
     664           0 :         if (sigev_none)
     665           0 :                 alarm->node.expires = expires;
     666             :         else
     667           0 :                 alarm_start(&timr->it.alarm.alarmtimer, expires);
     668           0 : }
     669             : 
     670             : /**
     671             :  * alarm_clock_getres - posix getres interface
     672             :  * @which_clock: clockid
     673             :  * @tp: timespec to fill
     674             :  *
     675             :  * Returns the granularity of underlying alarm base clock
     676             :  */
     677           0 : static int alarm_clock_getres(const clockid_t which_clock, struct timespec64 *tp)
     678             : {
     679             :         if (!alarmtimer_get_rtcdev())
     680             :                 return -EINVAL;
     681             : 
     682             :         tp->tv_sec = 0;
     683             :         tp->tv_nsec = hrtimer_resolution;
     684             :         return 0;
     685             : }
     686             : 
     687             : /**
     688             :  * alarm_clock_get_timespec - posix clock_get_timespec interface
     689             :  * @which_clock: clockid
     690             :  * @tp: timespec to fill.
     691             :  *
     692             :  * Provides the underlying alarm base time in a tasks time namespace.
     693             :  */
     694           0 : static int alarm_clock_get_timespec(clockid_t which_clock, struct timespec64 *tp)
     695             : {
     696           0 :         struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
     697             : 
     698             :         if (!alarmtimer_get_rtcdev())
     699             :                 return -EINVAL;
     700             : 
     701             :         base->get_timespec(tp);
     702             : 
     703             :         return 0;
     704             : }
     705             : 
     706             : /**
     707             :  * alarm_clock_get_ktime - posix clock_get_ktime interface
     708             :  * @which_clock: clockid
     709             :  *
     710             :  * Provides the underlying alarm base time in the root namespace.
     711             :  */
     712           0 : static ktime_t alarm_clock_get_ktime(clockid_t which_clock)
     713             : {
     714           0 :         struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
     715             : 
     716             :         if (!alarmtimer_get_rtcdev())
     717             :                 return -EINVAL;
     718             : 
     719             :         return base->get_ktime();
     720             : }
     721             : 
     722             : /**
     723             :  * alarm_timer_create - posix timer_create interface
     724             :  * @new_timer: k_itimer pointer to manage
     725             :  *
     726             :  * Initializes the k_itimer structure.
     727             :  */
     728           0 : static int alarm_timer_create(struct k_itimer *new_timer)
     729             : {
     730             :         enum  alarmtimer_type type;
     731             : 
     732             :         if (!alarmtimer_get_rtcdev())
     733             :                 return -EOPNOTSUPP;
     734             : 
     735             :         if (!capable(CAP_WAKE_ALARM))
     736             :                 return -EPERM;
     737             : 
     738             :         type = clock2alarm(new_timer->it_clock);
     739             :         alarm_init(&new_timer->it.alarm.alarmtimer, type, alarm_handle_timer);
     740             :         return 0;
     741             : }
     742             : 
     743             : /**
     744             :  * alarmtimer_nsleep_wakeup - Wakeup function for alarm_timer_nsleep
     745             :  * @alarm: ptr to alarm that fired
     746             :  * @now: time at the timer expiration
     747             :  *
     748             :  * Wakes up the task that set the alarmtimer
     749             :  *
     750             :  * Return: ALARMTIMER_NORESTART
     751             :  */
     752             : static enum alarmtimer_restart alarmtimer_nsleep_wakeup(struct alarm *alarm,
     753             :                                                                 ktime_t now)
     754             : {
     755             :         struct task_struct *task = (struct task_struct *)alarm->data;
     756             : 
     757             :         alarm->data = NULL;
     758             :         if (task)
     759             :                 wake_up_process(task);
     760             :         return ALARMTIMER_NORESTART;
     761             : }
     762             : 
     763             : /**
     764             :  * alarmtimer_do_nsleep - Internal alarmtimer nsleep implementation
     765             :  * @alarm: ptr to alarmtimer
     766             :  * @absexp: absolute expiration time
     767             :  * @type: alarm type (BOOTTIME/REALTIME).
     768             :  *
     769             :  * Sets the alarm timer and sleeps until it is fired or interrupted.
     770             :  */
     771             : static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp,
     772             :                                 enum alarmtimer_type type)
     773             : {
     774             :         struct restart_block *restart;
     775             :         alarm->data = (void *)current;
     776             :         do {
     777             :                 set_current_state(TASK_INTERRUPTIBLE);
     778             :                 alarm_start(alarm, absexp);
     779             :                 if (likely(alarm->data))
     780             :                         schedule();
     781             : 
     782             :                 alarm_cancel(alarm);
     783             :         } while (alarm->data && !signal_pending(current));
     784             : 
     785             :         __set_current_state(TASK_RUNNING);
     786             : 
     787             :         destroy_hrtimer_on_stack(&alarm->timer);
     788             : 
     789             :         if (!alarm->data)
     790             :                 return 0;
     791             : 
     792             :         if (freezing(current))
     793             :                 alarmtimer_freezerset(absexp, type);
     794             :         restart = &current->restart_block;
     795             :         if (restart->nanosleep.type != TT_NONE) {
     796             :                 struct timespec64 rmt;
     797             :                 ktime_t rem;
     798             : 
     799             :                 rem = ktime_sub(absexp, alarm_bases[type].get_ktime());
     800             : 
     801             :                 if (rem <= 0)
     802             :                         return 0;
     803             :                 rmt = ktime_to_timespec64(rem);
     804             : 
     805             :                 return nanosleep_copyout(restart, &rmt);
     806             :         }
     807             :         return -ERESTART_RESTARTBLOCK;
     808             : }
     809             : 
     810             : static void
     811             : alarm_init_on_stack(struct alarm *alarm, enum alarmtimer_type type,
     812             :                     enum alarmtimer_restart (*function)(struct alarm *, ktime_t))
     813             : {
     814             :         hrtimer_init_on_stack(&alarm->timer, alarm_bases[type].base_clockid,
     815             :                               HRTIMER_MODE_ABS);
     816             :         __alarm_init(alarm, type, function);
     817             : }
     818             : 
     819             : /**
     820             :  * alarm_timer_nsleep_restart - restartblock alarmtimer nsleep
     821             :  * @restart: ptr to restart block
     822             :  *
     823             :  * Handles restarted clock_nanosleep calls
     824             :  */
     825             : static long __sched alarm_timer_nsleep_restart(struct restart_block *restart)
     826             : {
     827             :         enum  alarmtimer_type type = restart->nanosleep.clockid;
     828             :         ktime_t exp = restart->nanosleep.expires;
     829             :         struct alarm alarm;
     830             : 
     831             :         alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
     832             : 
     833             :         return alarmtimer_do_nsleep(&alarm, exp, type);
     834             : }
     835             : 
     836             : /**
     837             :  * alarm_timer_nsleep - alarmtimer nanosleep
     838             :  * @which_clock: clockid
     839             :  * @flags: determines abstime or relative
     840             :  * @tsreq: requested sleep time (abs or rel)
     841             :  *
     842             :  * Handles clock_nanosleep calls against _ALARM clockids
     843             :  */
     844           0 : static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
     845             :                               const struct timespec64 *tsreq)
     846             : {
     847           0 :         enum  alarmtimer_type type = clock2alarm(which_clock);
     848           0 :         struct restart_block *restart = &current->restart_block;
     849             :         struct alarm alarm;
     850             :         ktime_t exp;
     851           0 :         int ret = 0;
     852             : 
     853             :         if (!alarmtimer_get_rtcdev())
     854             :                 return -EOPNOTSUPP;
     855             : 
     856             :         if (flags & ~TIMER_ABSTIME)
     857             :                 return -EINVAL;
     858             : 
     859             :         if (!capable(CAP_WAKE_ALARM))
     860             :                 return -EPERM;
     861             : 
     862             :         alarm_init_on_stack(&alarm, type, alarmtimer_nsleep_wakeup);
     863             : 
     864             :         exp = timespec64_to_ktime(*tsreq);
     865             :         /* Convert (if necessary) to absolute time */
     866             :         if (flags != TIMER_ABSTIME) {
     867             :                 ktime_t now = alarm_bases[type].get_ktime();
     868             : 
     869             :                 exp = ktime_add_safe(now, exp);
     870             :         } else {
     871             :                 exp = timens_ktime_to_host(which_clock, exp);
     872             :         }
     873             : 
     874             :         ret = alarmtimer_do_nsleep(&alarm, exp, type);
     875             :         if (ret != -ERESTART_RESTARTBLOCK)
     876             :                 return ret;
     877             : 
     878             :         /* abs timers don't set remaining time or restart */
     879             :         if (flags == TIMER_ABSTIME)
     880             :                 return -ERESTARTNOHAND;
     881             : 
     882             :         restart->nanosleep.clockid = type;
     883             :         restart->nanosleep.expires = exp;
     884             :         set_restart_fn(restart, alarm_timer_nsleep_restart);
     885             :         return ret;
     886             : }
     887             : 
     888             : const struct k_clock alarm_clock = {
     889             :         .clock_getres           = alarm_clock_getres,
     890             :         .clock_get_ktime        = alarm_clock_get_ktime,
     891             :         .clock_get_timespec     = alarm_clock_get_timespec,
     892             :         .timer_create           = alarm_timer_create,
     893             :         .timer_set              = common_timer_set,
     894             :         .timer_del              = common_timer_del,
     895             :         .timer_get              = common_timer_get,
     896             :         .timer_arm              = alarm_timer_arm,
     897             :         .timer_rearm            = alarm_timer_rearm,
     898             :         .timer_forward          = alarm_timer_forward,
     899             :         .timer_remaining        = alarm_timer_remaining,
     900             :         .timer_try_to_cancel    = alarm_timer_try_to_cancel,
     901             :         .timer_wait_running     = alarm_timer_wait_running,
     902             :         .nsleep                 = alarm_timer_nsleep,
     903             : };
     904             : #endif /* CONFIG_POSIX_TIMERS */
     905             : 
     906             : 
     907             : /* Suspend hook structures */
     908             : static const struct dev_pm_ops alarmtimer_pm_ops = {
     909             :         .suspend = alarmtimer_suspend,
     910             :         .resume = alarmtimer_resume,
     911             : };
     912             : 
     913             : static struct platform_driver alarmtimer_driver = {
     914             :         .driver = {
     915             :                 .name = "alarmtimer",
     916             :                 .pm = &alarmtimer_pm_ops,
     917             :         }
     918             : };
     919             : 
     920           0 : static void get_boottime_timespec(struct timespec64 *tp)
     921             : {
     922           0 :         ktime_get_boottime_ts64(tp);
     923           0 :         timens_add_boottime(tp);
     924           0 : }
     925             : 
     926             : /**
     927             :  * alarmtimer_init - Initialize alarm timer code
     928             :  *
     929             :  * This function initializes the alarm bases and registers
     930             :  * the posix clock ids.
     931             :  */
     932           1 : static int __init alarmtimer_init(void)
     933             : {
     934             :         int error;
     935             :         int i;
     936             : 
     937             :         alarmtimer_rtc_timer_init();
     938             : 
     939             :         /* Initialize alarm bases */
     940           1 :         alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
     941           1 :         alarm_bases[ALARM_REALTIME].get_ktime = &ktime_get_real;
     942           1 :         alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64;
     943           1 :         alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
     944           1 :         alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
     945           1 :         alarm_bases[ALARM_BOOTTIME].get_timespec = get_boottime_timespec;
     946           3 :         for (i = 0; i < ALARM_NUMTYPE; i++) {
     947           4 :                 timerqueue_init_head(&alarm_bases[i].timerqueue);
     948           2 :                 spin_lock_init(&alarm_bases[i].lock);
     949             :         }
     950             : 
     951           1 :         error = alarmtimer_rtc_interface_setup();
     952             :         if (error)
     953             :                 return error;
     954             : 
     955           1 :         error = platform_driver_register(&alarmtimer_driver);
     956           1 :         if (error)
     957             :                 goto out_if;
     958             : 
     959             :         return 0;
     960             : out_if:
     961             :         alarmtimer_rtc_interface_remove();
     962           0 :         return error;
     963             : }
     964             : device_initcall(alarmtimer_init);

Generated by: LCOV version 1.14