hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
kernel/include/linux/hrtimer.h
....@@ -42,6 +42,7 @@
4242 HRTIMER_MODE_REL = 0x01,
4343 HRTIMER_MODE_PINNED = 0x02,
4444 HRTIMER_MODE_SOFT = 0x04,
45
+ HRTIMER_MODE_HARD = 0x08,
4546
4647 HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED,
4748 HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED,
....@@ -52,6 +53,11 @@
5253 HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT,
5354 HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT,
5455
56
+ HRTIMER_MODE_ABS_HARD = HRTIMER_MODE_ABS | HRTIMER_MODE_HARD,
57
+ HRTIMER_MODE_REL_HARD = HRTIMER_MODE_REL | HRTIMER_MODE_HARD,
58
+
59
+ HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD,
60
+ HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD,
5561 };
5662
5763 /*
....@@ -189,6 +195,8 @@
189195 * @nr_retries: Total number of hrtimer interrupt retries
190196 * @nr_hangs: Total number of hrtimer interrupt hangs
191197 * @max_hang_time: Maximum time spent in hrtimer_interrupt
198
+ * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are
199
+ * expired
192200 * @expires_next: absolute time of the next event, is required for remote
193201 * hrtimer enqueue; it is the total first expiry time (hard
194202 * and soft hrtimer are taken into account)
....@@ -216,6 +224,7 @@
216224 unsigned short nr_hangs;
217225 unsigned int max_hang_time;
218226 #endif
227
+ spinlock_t softirq_expiry_lock;
219228 ktime_t expires_next;
220229 struct hrtimer *next_timer;
221230 ktime_t softirq_expires_next;
....@@ -353,10 +362,17 @@
353362 /* Initialize timers: */
354363 extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
355364 enum hrtimer_mode mode);
365
+extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id,
366
+ enum hrtimer_mode mode,
367
+ struct task_struct *task);
356368
357369 #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
358370 extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock,
359371 enum hrtimer_mode mode);
372
+extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
373
+ clockid_t clock_id,
374
+ enum hrtimer_mode mode,
375
+ struct task_struct *task);
360376
361377 extern void destroy_hrtimer_on_stack(struct hrtimer *timer);
362378 #else
....@@ -366,6 +382,15 @@
366382 {
367383 hrtimer_init(timer, which_clock, mode);
368384 }
385
+
386
+static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
387
+ clockid_t clock_id,
388
+ enum hrtimer_mode mode,
389
+ struct task_struct *task)
390
+{
391
+ hrtimer_init_sleeper(sl, clock_id, mode, task);
392
+}
393
+
369394 static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { }
370395 #endif
371396
....@@ -389,6 +414,7 @@
389414
390415 extern int hrtimer_cancel(struct hrtimer *timer);
391416 extern int hrtimer_try_to_cancel(struct hrtimer *timer);
417
+extern void hrtimer_grab_expiry_lock(const struct hrtimer *timer);
392418
393419 static inline void hrtimer_start_expires(struct hrtimer *timer,
394420 enum hrtimer_mode mode)
....@@ -474,9 +500,6 @@
474500 extern long hrtimer_nanosleep(const struct timespec64 *rqtp,
475501 const enum hrtimer_mode mode,
476502 const clockid_t clockid);
477
-
478
-extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
479
- struct task_struct *tsk);
480503
481504 extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta,
482505 const enum hrtimer_mode mode);