hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/kernel/time/alarmtimer.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Alarmtimer interface
34 *
....@@ -10,10 +11,6 @@
1011 * Copyright (C) 2010 IBM Corperation
1112 *
1213 * Author: John Stultz <john.stultz@linaro.org>
13
- *
14
- * This program is free software; you can redistribute it and/or modify
15
- * it under the terms of the GNU General Public License version 2 as
16
- * published by the Free Software Foundation.
1714 */
1815 #include <linux/time.h>
1916 #include <linux/hrtimer.h>
....@@ -29,6 +26,7 @@
2926 #include <linux/freezer.h>
3027 #include <linux/compat.h>
3128 #include <linux/module.h>
29
+#include <linux/time_namespace.h>
3230
3331 #include "posix-timers.h"
3432
....@@ -39,13 +37,15 @@
3937 * struct alarm_base - Alarm timer bases
4038 * @lock: Lock for syncrhonized access to the base
4139 * @timerqueue: Timerqueue head managing the list of events
42
- * @gettime: Function to read the time correlating to the base
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
4342 * @base_clockid: clockid for the base
4443 */
4544 static struct alarm_base {
4645 spinlock_t lock;
4746 struct timerqueue_head timerqueue;
48
- ktime_t (*gettime)(void);
47
+ ktime_t (*get_ktime)(void);
48
+ void (*get_timespec)(struct timespec64 *tp);
4949 clockid_t base_clockid;
5050 } alarm_bases[ALARM_NUMTYPE];
5151
....@@ -58,8 +58,6 @@
5858 #endif
5959
6060 #ifdef CONFIG_RTC_CLASS
61
-static struct wakeup_source *ws;
62
-
6361 /* rtc timer and device for setting alarm wakeups at suspend */
6462 static struct rtc_timer rtctimer;
6563 static struct rtc_device *rtcdev;
....@@ -69,8 +67,6 @@
6967 * alarmtimer_get_rtcdev - Return selected rtcdevice
7068 *
7169 * This function returns the rtc device to use for wakealarms.
72
- * If one has not already been chosen, it checks to see if a
73
- * functional rtc device is available.
7470 */
7571 struct rtc_device *alarmtimer_get_rtcdev(void)
7672 {
....@@ -90,7 +86,7 @@
9086 {
9187 unsigned long flags;
9288 struct rtc_device *rtc = to_rtc_device(dev);
93
- struct wakeup_source *__ws;
89
+ struct platform_device *pdev;
9490 int ret = 0;
9591
9692 if (rtcdev)
....@@ -101,10 +97,13 @@
10197 if (!device_may_wakeup(rtc->dev.parent))
10298 return -1;
10399
104
- __ws = wakeup_source_register(dev, "alarmtimer");
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);
105104
106105 spin_lock_irqsave(&rtcdev_lock, flags);
107
- if (!rtcdev) {
106
+ if (!IS_ERR(pdev) && !rtcdev) {
108107 if (!try_module_get(rtc->owner)) {
109108 ret = -1;
110109 goto unlock;
....@@ -113,13 +112,14 @@
113112 rtcdev = rtc;
114113 /* hold a reference so it doesn't go away */
115114 get_device(dev);
116
- ws = __ws;
117
- __ws = NULL;
115
+ pdev = NULL;
116
+ } else {
117
+ ret = -1;
118118 }
119119 unlock:
120120 spin_unlock_irqrestore(&rtcdev_lock, flags);
121121
122
- wakeup_source_unregister(__ws);
122
+ platform_device_unregister(pdev);
123123
124124 return ret;
125125 }
....@@ -143,11 +143,6 @@
143143 class_interface_unregister(&alarmtimer_rtc_interface);
144144 }
145145 #else
146
-struct rtc_device *alarmtimer_get_rtcdev(void)
147
-{
148
- return NULL;
149
-}
150
-#define rtcdev (NULL)
151146 static inline int alarmtimer_rtc_interface_setup(void) { return 0; }
152147 static inline void alarmtimer_rtc_interface_remove(void) { }
153148 static inline void alarmtimer_rtc_timer_init(void) { }
....@@ -197,7 +192,7 @@
197192 * When a alarm timer fires, this runs through the timerqueue to
198193 * see which alarms expired, and runs those. If there are more alarm
199194 * timers queued for the future, we set the hrtimer to fire when
200
- * when the next future alarm timer expires.
195
+ * the next future alarm timer expires.
201196 */
202197 static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)
203198 {
....@@ -212,7 +207,7 @@
212207 spin_unlock_irqrestore(&base->lock, flags);
213208
214209 if (alarm->function)
215
- restart = alarm->function(alarm, base->gettime());
210
+ restart = alarm->function(alarm, base->get_ktime());
216211
217212 spin_lock_irqsave(&base->lock, flags);
218213 if (restart != ALARMTIMER_NORESTART) {
....@@ -222,7 +217,7 @@
222217 }
223218 spin_unlock_irqrestore(&base->lock, flags);
224219
225
- trace_alarmtimer_fired(alarm, base->gettime());
220
+ trace_alarmtimer_fired(alarm, base->get_ktime());
226221 return ret;
227222
228223 }
....@@ -230,7 +225,7 @@
230225 ktime_t alarm_expires_remaining(const struct alarm *alarm)
231226 {
232227 struct alarm_base *base = &alarm_bases[alarm->type];
233
- return ktime_sub(alarm->node.expires, base->gettime());
228
+ return ktime_sub(alarm->node.expires, base->get_ktime());
234229 }
235230 EXPORT_SYMBOL_GPL(alarm_expires_remaining);
236231
....@@ -238,7 +233,6 @@
238233 /**
239234 * alarmtimer_suspend - Suspend time callback
240235 * @dev: unused
241
- * @state: unused
242236 *
243237 * When we are going into suspend, we look through the bases
244238 * to see which is the soonest timer to expire. We then
....@@ -276,7 +270,7 @@
276270 spin_unlock_irqrestore(&base->lock, flags);
277271 if (!next)
278272 continue;
279
- delta = ktime_sub(next->expires, base->gettime());
273
+ delta = ktime_sub(next->expires, base->get_ktime());
280274 if (!min || (delta < min)) {
281275 expires = next->expires;
282276 min = delta;
....@@ -287,7 +281,7 @@
287281 return 0;
288282
289283 if (ktime_to_ns(min) < 2 * NSEC_PER_SEC) {
290
- __pm_wakeup_event(ws, 2 * MSEC_PER_SEC);
284
+ pm_wakeup_event(dev, 2 * MSEC_PER_SEC);
291285 return -EBUSY;
292286 }
293287
....@@ -302,7 +296,7 @@
302296 /* Set alarm, if in the past reject suspend briefly to handle */
303297 ret = rtc_timer_start(rtc, &rtctimer, now, 0);
304298 if (ret < 0)
305
- __pm_wakeup_event(ws, MSEC_PER_SEC);
299
+ pm_wakeup_event(dev, MSEC_PER_SEC);
306300 return ret;
307301 }
308302
....@@ -370,7 +364,7 @@
370364 hrtimer_start(&alarm->timer, alarm->node.expires, HRTIMER_MODE_ABS);
371365 spin_unlock_irqrestore(&base->lock, flags);
372366
373
- trace_alarmtimer_start(alarm, base->gettime());
367
+ trace_alarmtimer_start(alarm, base->get_ktime());
374368 }
375369 EXPORT_SYMBOL_GPL(alarm_start);
376370
....@@ -383,7 +377,7 @@
383377 {
384378 struct alarm_base *base = &alarm_bases[alarm->type];
385379
386
- start = ktime_add_safe(start, base->gettime());
380
+ start = ktime_add_safe(start, base->get_ktime());
387381 alarm_start(alarm, start);
388382 }
389383 EXPORT_SYMBOL_GPL(alarm_start_relative);
....@@ -420,7 +414,7 @@
420414 alarmtimer_dequeue(base, alarm);
421415 spin_unlock_irqrestore(&base->lock, flags);
422416
423
- trace_alarmtimer_cancel(alarm, base->gettime());
417
+ trace_alarmtimer_cancel(alarm, base->get_ktime());
424418 return ret;
425419 }
426420 EXPORT_SYMBOL_GPL(alarm_try_to_cancel);
....@@ -438,7 +432,7 @@
438432 int ret = alarm_try_to_cancel(alarm);
439433 if (ret >= 0)
440434 return ret;
441
- hrtimer_grab_expiry_lock(&alarm->timer);
435
+ hrtimer_cancel_wait_running(&alarm->timer);
442436 }
443437 }
444438 EXPORT_SYMBOL_GPL(alarm_cancel);
....@@ -480,7 +474,7 @@
480474 {
481475 struct alarm_base *base = &alarm_bases[alarm->type];
482476
483
- return alarm_forward(alarm, base->gettime(), interval);
477
+ return alarm_forward(alarm, base->get_ktime(), interval);
484478 }
485479 EXPORT_SYMBOL_GPL(alarm_forward_now);
486480
....@@ -506,7 +500,7 @@
506500 return;
507501 }
508502
509
- delta = ktime_sub(absexp, base->gettime());
503
+ delta = ktime_sub(absexp, base->get_ktime());
510504
511505 spin_lock_irqsave(&freezer_delta_lock, flags);
512506 if (!freezer_delta || (delta < freezer_delta)) {
....@@ -612,6 +606,19 @@
612606 }
613607
614608 /**
609
+ * alarm_timer_wait_running - Posix timer callback to wait for a timer
610
+ * @timr: Pointer to the posixtimer data struct
611
+ *
612
+ * Called from the core code when timer cancel detected that the callback
613
+ * is running. @timr is unlocked and rcu read lock is held to prevent it
614
+ * from being freed.
615
+ */
616
+static void alarm_timer_wait_running(struct k_itimer *timr)
617
+{
618
+ hrtimer_cancel_wait_running(&timr->it.alarm.alarmtimer.timer);
619
+}
620
+
621
+/**
615622 * alarm_timer_arm - Posix timer callback to arm a timer
616623 * @timr: Pointer to the posixtimer data struct
617624 * @expires: The new expiry time
....@@ -625,7 +632,7 @@
625632 struct alarm_base *base = &alarm_bases[alarm->type];
626633
627634 if (!absolute)
628
- expires = ktime_add_safe(expires, base->gettime());
635
+ expires = ktime_add_safe(expires, base->get_ktime());
629636 if (sigev_none)
630637 alarm->node.expires = expires;
631638 else
....@@ -650,21 +657,38 @@
650657 }
651658
652659 /**
653
- * alarm_clock_get - posix clock_get interface
660
+ * alarm_clock_get_timespec - posix clock_get_timespec interface
654661 * @which_clock: clockid
655662 * @tp: timespec to fill.
656663 *
657
- * Provides the underlying alarm base time.
664
+ * Provides the underlying alarm base time in a tasks time namespace.
658665 */
659
-static int alarm_clock_get(clockid_t which_clock, struct timespec64 *tp)
666
+static int alarm_clock_get_timespec(clockid_t which_clock, struct timespec64 *tp)
660667 {
661668 struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
662669
663670 if (!alarmtimer_get_rtcdev())
664671 return -EINVAL;
665672
666
- *tp = ktime_to_timespec64(base->gettime());
673
+ base->get_timespec(tp);
674
+
667675 return 0;
676
+}
677
+
678
+/**
679
+ * alarm_clock_get_ktime - posix clock_get_ktime interface
680
+ * @which_clock: clockid
681
+ *
682
+ * Provides the underlying alarm base time in the root namespace.
683
+ */
684
+static ktime_t alarm_clock_get_ktime(clockid_t which_clock)
685
+{
686
+ struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];
687
+
688
+ if (!alarmtimer_get_rtcdev())
689
+ return -EINVAL;
690
+
691
+ return base->get_ktime();
668692 }
669693
670694 /**
....@@ -740,7 +764,7 @@
740764 struct timespec64 rmt;
741765 ktime_t rem;
742766
743
- rem = ktime_sub(absexp, alarm_bases[type].gettime());
767
+ rem = ktime_sub(absexp, alarm_bases[type].get_ktime());
744768
745769 if (rem <= 0)
746770 return 0;
....@@ -809,9 +833,11 @@
809833 exp = timespec64_to_ktime(*tsreq);
810834 /* Convert (if necessary) to absolute time */
811835 if (flags != TIMER_ABSTIME) {
812
- ktime_t now = alarm_bases[type].gettime();
836
+ ktime_t now = alarm_bases[type].get_ktime();
813837
814838 exp = ktime_add_safe(now, exp);
839
+ } else {
840
+ exp = timens_ktime_to_host(which_clock, exp);
815841 }
816842
817843 ret = alarmtimer_do_nsleep(&alarm, exp, type);
....@@ -830,7 +856,8 @@
830856
831857 const struct k_clock alarm_clock = {
832858 .clock_getres = alarm_clock_getres,
833
- .clock_get = alarm_clock_get,
859
+ .clock_get_ktime = alarm_clock_get_ktime,
860
+ .clock_get_timespec = alarm_clock_get_timespec,
834861 .timer_create = alarm_timer_create,
835862 .timer_set = common_timer_set,
836863 .timer_del = common_timer_del,
....@@ -840,6 +867,7 @@
840867 .timer_forward = alarm_timer_forward,
841868 .timer_remaining = alarm_timer_remaining,
842869 .timer_try_to_cancel = alarm_timer_try_to_cancel,
870
+ .timer_wait_running = alarm_timer_wait_running,
843871 .nsleep = alarm_timer_nsleep,
844872 };
845873 #endif /* CONFIG_POSIX_TIMERS */
....@@ -858,6 +886,12 @@
858886 }
859887 };
860888
889
+static void get_boottime_timespec(struct timespec64 *tp)
890
+{
891
+ ktime_get_boottime_ts64(tp);
892
+ timens_add_boottime(tp);
893
+}
894
+
861895 /**
862896 * alarmtimer_init - Initialize alarm timer code
863897 *
....@@ -866,17 +900,18 @@
866900 */
867901 static int __init alarmtimer_init(void)
868902 {
869
- struct platform_device *pdev;
870
- int error = 0;
903
+ int error;
871904 int i;
872905
873906 alarmtimer_rtc_timer_init();
874907
875908 /* Initialize alarm bases */
876909 alarm_bases[ALARM_REALTIME].base_clockid = CLOCK_REALTIME;
877
- alarm_bases[ALARM_REALTIME].gettime = &ktime_get_real;
910
+ alarm_bases[ALARM_REALTIME].get_ktime = &ktime_get_real;
911
+ alarm_bases[ALARM_REALTIME].get_timespec = ktime_get_real_ts64;
878912 alarm_bases[ALARM_BOOTTIME].base_clockid = CLOCK_BOOTTIME;
879
- alarm_bases[ALARM_BOOTTIME].gettime = &ktime_get_boottime;
913
+ alarm_bases[ALARM_BOOTTIME].get_ktime = &ktime_get_boottime;
914
+ alarm_bases[ALARM_BOOTTIME].get_timespec = get_boottime_timespec;
880915 for (i = 0; i < ALARM_NUMTYPE; i++) {
881916 timerqueue_init_head(&alarm_bases[i].timerqueue);
882917 spin_lock_init(&alarm_bases[i].lock);
....@@ -890,15 +925,7 @@
890925 if (error)
891926 goto out_if;
892927
893
- pdev = platform_device_register_simple("alarmtimer", -1, NULL, 0);
894
- if (IS_ERR(pdev)) {
895
- error = PTR_ERR(pdev);
896
- goto out_drv;
897
- }
898928 return 0;
899
-
900
-out_drv:
901
- platform_driver_unregister(&alarmtimer_driver);
902929 out_if:
903930 alarmtimer_rtc_interface_remove();
904931 return error;