Blame view

kernel/hrtimer.c 19.8 KB
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   *  linux/kernel/hrtimer.c
   *
   *  Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de>
   *  Copyright(C) 2005, Red Hat, Inc., Ingo Molnar
   *
   *  High-resolution kernel timers
   *
   *  In contrast to the low-resolution timeout API implemented in
   *  kernel/timer.c, hrtimers provide finer resolution and accuracy
   *  depending on system configuration and capabilities.
   *
   *  These timers are currently used for:
   *   - itimers
   *   - POSIX timers
   *   - nanosleep
   *   - precise in-kernel timing
   *
   *  Started by: Thomas Gleixner and Ingo Molnar
   *
   *  Credits:
   *	based on kernel/timer.c
   *
66188fae3   Thomas Gleixner   [PATCH] hrtimers:...
24
25
26
27
28
29
   *	Help, testing, suggestions, bugfixes, improvements were
   *	provided by:
   *
   *	George Anzinger, Andrew Morton, Steven Rostedt, Roman Zippel
   *	et. al.
   *
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
   *  For licencing details see kernel-base/COPYING
   */
  
  #include <linux/cpu.h>
  #include <linux/module.h>
  #include <linux/percpu.h>
  #include <linux/hrtimer.h>
  #include <linux/notifier.h>
  #include <linux/syscalls.h>
  #include <linux/interrupt.h>
  
  #include <asm/uaccess.h>
  
  /**
   * ktime_get - get the monotonic time in ktime_t format
   *
   * returns the time in ktime_t format
   */
  static ktime_t ktime_get(void)
  {
  	struct timespec now;
  
  	ktime_get_ts(&now);
  
  	return timespec_to_ktime(now);
  }
  
  /**
   * ktime_get_real - get the real (wall-) time in ktime_t format
   *
   * returns the time in ktime_t format
   */
  static ktime_t ktime_get_real(void)
  {
  	struct timespec now;
  
  	getnstimeofday(&now);
  
  	return timespec_to_ktime(now);
  }
  
  EXPORT_SYMBOL_GPL(ktime_get_real);
  
  /*
   * The timer bases:
7978672c4   George Anzinger   [PATCH] hrtimers:...
75
76
77
78
79
80
   *
   * Note: If we want to add new timer bases, we have to skip the two
   * clock ids captured by the cpu-timers. We do this by holding empty
   * entries rather than doing math adjustment of the clock ids.
   * This ensures that we capture erroneous accesses to these clock ids
   * rather than moving them into the range of valid clock id's.
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
   */
  
  #define MAX_HRTIMER_BASES 2
  
  static DEFINE_PER_CPU(struct hrtimer_base, hrtimer_bases[MAX_HRTIMER_BASES]) =
  {
  	{
  		.index = CLOCK_REALTIME,
  		.get_time = &ktime_get_real,
  		.resolution = KTIME_REALTIME_RES,
  	},
  	{
  		.index = CLOCK_MONOTONIC,
  		.get_time = &ktime_get,
  		.resolution = KTIME_MONOTONIC_RES,
  	},
  };
  
  /**
   * ktime_get_ts - get the monotonic clock in timespec format
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
   * @ts:		pointer to timespec variable
   *
   * The function calculates the monotonic clock from the realtime
   * clock and the wall_to_monotonic offset and stores the result
   * in normalized timespec format in the variable pointed to by ts.
   */
  void ktime_get_ts(struct timespec *ts)
  {
  	struct timespec tomono;
  	unsigned long seq;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		getnstimeofday(ts);
  		tomono = wall_to_monotonic;
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec,
  				ts->tv_nsec + tomono.tv_nsec);
  }
69778e325   Matt Helsley   [PATCH] Export kt...
122
  EXPORT_SYMBOL_GPL(ktime_get_ts);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
123
124
  
  /*
92127c7a4   Thomas Gleixner   [PATCH] hrtimers:...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
   * Get the coarse grained time at the softirq based on xtime and
   * wall_to_monotonic.
   */
  static void hrtimer_get_softirq_time(struct hrtimer_base *base)
  {
  	ktime_t xtim, tomono;
  	unsigned long seq;
  
  	do {
  		seq = read_seqbegin(&xtime_lock);
  		xtim = timespec_to_ktime(xtime);
  		tomono = timespec_to_ktime(wall_to_monotonic);
  
  	} while (read_seqretry(&xtime_lock, seq));
  
  	base[CLOCK_REALTIME].softirq_time = xtim;
  	base[CLOCK_MONOTONIC].softirq_time = ktime_add(xtim, tomono);
  }
  
  /*
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
   * Functions and macros which are different for UP/SMP systems are kept in a
   * single place
   */
  #ifdef CONFIG_SMP
  
  #define set_curr_timer(b, t)		do { (b)->curr_timer = (t); } while (0)
  
  /*
   * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock
   * means that all timers which are tied to this base via timer->base are
   * locked, and the base itself is locked too.
   *
   * So __run_timers/migrate_timers can safely modify all timers which could
   * be found on the lists/queues.
   *
   * When the timer's base is locked, and the timer removed from list, it is
   * possible to set timer->base = NULL and drop the lock: the timer remains
   * locked.
   */
  static struct hrtimer_base *lock_hrtimer_base(const struct hrtimer *timer,
  					      unsigned long *flags)
  {
  	struct hrtimer_base *base;
  
  	for (;;) {
  		base = timer->base;
  		if (likely(base != NULL)) {
  			spin_lock_irqsave(&base->lock, *flags);
  			if (likely(base == timer->base))
  				return base;
  			/* The timer has migrated to another CPU: */
  			spin_unlock_irqrestore(&base->lock, *flags);
  		}
  		cpu_relax();
  	}
  }
  
  /*
   * Switch the timer base to the current CPU when possible.
   */
  static inline struct hrtimer_base *
  switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base)
  {
  	struct hrtimer_base *new_base;
3773dc920   Jan Blunck   [PATCH] fix hrtim...
189
  	new_base = &__get_cpu_var(hrtimer_bases)[base->index];
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
  
  	if (base != new_base) {
  		/*
  		 * We are trying to schedule the timer on the local CPU.
  		 * However we can't change timer's base while it is running,
  		 * so we keep it on the same CPU. No hassle vs. reprogramming
  		 * the event source in the high resolution case. The softirq
  		 * code will take care of this when the timer function has
  		 * completed. There is no conflict as we hold the lock until
  		 * the timer is enqueued.
  		 */
  		if (unlikely(base->curr_timer == timer))
  			return base;
  
  		/* See the comment in lock_timer_base() */
  		timer->base = NULL;
  		spin_unlock(&base->lock);
  		spin_lock(&new_base->lock);
  		timer->base = new_base;
  	}
  	return new_base;
  }
  
  #else /* CONFIG_SMP */
  
  #define set_curr_timer(b, t)		do { } while (0)
  
  static inline struct hrtimer_base *
  lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
  {
  	struct hrtimer_base *base = timer->base;
  
  	spin_lock_irqsave(&base->lock, *flags);
  
  	return base;
  }
  
  #define switch_hrtimer_base(t, b)	(b)
  
  #endif	/* !CONFIG_SMP */
  
  /*
   * Functions for the union type storage format of ktime_t which are
   * too large for inlining:
   */
  #if BITS_PER_LONG < 64
  # ifndef CONFIG_KTIME_SCALAR
  /**
   * ktime_add_ns - Add a scalar nanoseconds value to a ktime_t variable
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
   * @kt:		addend
   * @nsec:	the scalar nsec value to add
   *
   * Returns the sum of kt and nsec in ktime_t format
   */
  ktime_t ktime_add_ns(const ktime_t kt, u64 nsec)
  {
  	ktime_t tmp;
  
  	if (likely(nsec < NSEC_PER_SEC)) {
  		tmp.tv64 = nsec;
  	} else {
  		unsigned long rem = do_div(nsec, NSEC_PER_SEC);
  
  		tmp = ktime_set((long)nsec, rem);
  	}
  
  	return ktime_add(kt, tmp);
  }
  
  #else /* CONFIG_KTIME_SCALAR */
  
  # endif /* !CONFIG_KTIME_SCALAR */
  
  /*
   * Divide a ktime value by a nanosecond value
   */
df869b630   Roman Zippel   [PATCH] hrtimers:...
266
  static unsigned long ktime_divns(const ktime_t kt, s64 div)
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  {
  	u64 dclc, inc, dns;
  	int sft = 0;
  
  	dclc = dns = ktime_to_ns(kt);
  	inc = div;
  	/* Make sure the divisor is less than 2^32: */
  	while (div >> 32) {
  		sft++;
  		div >>= 1;
  	}
  	dclc >>= sft;
  	do_div(dclc, (unsigned long) div);
  
  	return (unsigned long) dclc;
  }
  
  #else /* BITS_PER_LONG < 64 */
  # define ktime_divns(kt, div)		(unsigned long)((kt).tv64 / (div))
  #endif /* BITS_PER_LONG >= 64 */
  
  /*
   * Counterpart to lock_timer_base above:
   */
  static inline
  void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
  {
  	spin_unlock_irqrestore(&timer->base->lock, *flags);
  }
  
  /**
   * hrtimer_forward - forward the timer expiry
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
299
   * @timer:	hrtimer to forward
44f214755   Roman Zippel   [PATCH] hrtimers:...
300
   * @now:	forward past this time
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
301
302
303
   * @interval:	the interval to forward
   *
   * Forward the timer expiry so it will expire in the future.
8dca6f33f   Jonathan Corbet   [PATCH] hrtimer c...
304
   * Returns the number of overruns.
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
305
306
   */
  unsigned long
44f214755   Roman Zippel   [PATCH] hrtimers:...
307
  hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
308
309
  {
  	unsigned long orun = 1;
44f214755   Roman Zippel   [PATCH] hrtimers:...
310
  	ktime_t delta;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
311
312
313
314
315
  
  	delta = ktime_sub(now, timer->expires);
  
  	if (delta.tv64 < 0)
  		return 0;
c9db4fa11   Thomas Gleixner   [hrtimer] Enforce...
316
317
  	if (interval.tv64 < timer->base->resolution.tv64)
  		interval.tv64 = timer->base->resolution.tv64;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
318
  	if (unlikely(delta.tv64 >= interval.tv64)) {
df869b630   Roman Zippel   [PATCH] hrtimers:...
319
  		s64 incr = ktime_to_ns(interval);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  
  		orun = ktime_divns(delta, incr);
  		timer->expires = ktime_add_ns(timer->expires, incr * orun);
  		if (timer->expires.tv64 > now.tv64)
  			return orun;
  		/*
  		 * This (and the ktime_add() below) is the
  		 * correction for exact:
  		 */
  		orun++;
  	}
  	timer->expires = ktime_add(timer->expires, interval);
  
  	return orun;
  }
  
  /*
   * enqueue_hrtimer - internal function to (re)start a timer
   *
   * The timer is inserted in expiry order. Insertion into the
   * red black tree is O(log(n)). Must hold the base lock.
   */
  static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
  {
  	struct rb_node **link = &base->active.rb_node;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
  	struct rb_node *parent = NULL;
  	struct hrtimer *entry;
  
  	/*
  	 * Find the right place in the rbtree:
  	 */
  	while (*link) {
  		parent = *link;
  		entry = rb_entry(parent, struct hrtimer, node);
  		/*
  		 * We dont care about collisions. Nodes with
  		 * the same expiry time stay together.
  		 */
  		if (timer->expires.tv64 < entry->expires.tv64)
  			link = &(*link)->rb_left;
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
360
  		else
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
361
  			link = &(*link)->rb_right;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
362
363
364
  	}
  
  	/*
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
365
366
  	 * Insert the timer to the rbtree and check whether it
  	 * replaces the first pending timer
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
367
368
369
  	 */
  	rb_link_node(&timer->node, parent, link);
  	rb_insert_color(&timer->node, &base->active);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
370

288867ec5   Thomas Gleixner   [hrtimer] Remove ...
371
372
373
374
  	if (!base->first || timer->expires.tv64 <
  	    rb_entry(base->first, struct hrtimer, node)->expires.tv64)
  		base->first = &timer->node;
  }
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
375
376
377
378
379
380
381
382
383
  
  /*
   * __remove_hrtimer - internal function to remove a timer
   *
   * Caller must hold the base lock.
   */
  static void __remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
  {
  	/*
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
384
385
  	 * Remove the timer from the rbtree and replace the
  	 * first entry pointer if necessary.
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
386
  	 */
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
387
388
  	if (base->first == &timer->node)
  		base->first = rb_next(&timer->node);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
389
  	rb_erase(&timer->node, &base->active);
ed198cb49   David Woodhouse   [RBTREE] Update h...
390
  	rb_set_parent(&timer->node, &timer->node);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
391
392
393
394
395
396
397
398
399
400
  }
  
  /*
   * remove hrtimer, called with base lock held
   */
  static inline int
  remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
  {
  	if (hrtimer_active(timer)) {
  		__remove_hrtimer(timer, base);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
401
402
403
404
405
406
407
  		return 1;
  	}
  	return 0;
  }
  
  /**
   * hrtimer_start - (re)start an relative timer on the current CPU
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
   * @timer:	the timer to be added
   * @tim:	expiry time
   * @mode:	expiry mode: absolute (HRTIMER_ABS) or relative (HRTIMER_REL)
   *
   * Returns:
   *  0 on success
   *  1 when the timer was active
   */
  int
  hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
  {
  	struct hrtimer_base *base, *new_base;
  	unsigned long flags;
  	int ret;
  
  	base = lock_hrtimer_base(timer, &flags);
  
  	/* Remove an active timer from the queue: */
  	ret = remove_hrtimer(timer, base);
  
  	/* Switch the timer base, if necessary: */
  	new_base = switch_hrtimer_base(timer, base);
06027bdd2   Ingo Molnar   [PATCH] hrtimer: ...
430
  	if (mode == HRTIMER_REL) {
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
431
  		tim = ktime_add(tim, new_base->get_time());
06027bdd2   Ingo Molnar   [PATCH] hrtimer: ...
432
433
434
435
436
437
438
439
440
441
442
  		/*
  		 * CONFIG_TIME_LOW_RES is a temporary way for architectures
  		 * to signal that they simply return xtime in
  		 * do_gettimeoffset(). In this case we want to round up by
  		 * resolution when starting a relative timer, to avoid short
  		 * timeouts. This will go away with the GTOD framework.
  		 */
  #ifdef CONFIG_TIME_LOW_RES
  		tim = ktime_add(tim, base->resolution);
  #endif
  	}
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
443
444
445
446
447
448
449
450
  	timer->expires = tim;
  
  	enqueue_hrtimer(timer, new_base);
  
  	unlock_hrtimer_base(timer, &flags);
  
  	return ret;
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
451
  EXPORT_SYMBOL_GPL(hrtimer_start);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
452
453
454
  
  /**
   * hrtimer_try_to_cancel - try to deactivate a timer
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
455
456
457
458
459
460
   * @timer:	hrtimer to stop
   *
   * Returns:
   *  0 when the timer was not active
   *  1 when the timer was active
   * -1 when the timer is currently excuting the callback function and
fa9799e33   Randy Dunlap   [PATCH] ktime/hrt...
461
   *    cannot be stopped
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
   */
  int hrtimer_try_to_cancel(struct hrtimer *timer)
  {
  	struct hrtimer_base *base;
  	unsigned long flags;
  	int ret = -1;
  
  	base = lock_hrtimer_base(timer, &flags);
  
  	if (base->curr_timer != timer)
  		ret = remove_hrtimer(timer, base);
  
  	unlock_hrtimer_base(timer, &flags);
  
  	return ret;
  
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
479
  EXPORT_SYMBOL_GPL(hrtimer_try_to_cancel);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
480
481
482
  
  /**
   * hrtimer_cancel - cancel a timer and wait for the handler to finish.
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
483
484
485
486
487
488
489
490
491
492
493
494
495
   * @timer:	the timer to be cancelled
   *
   * Returns:
   *  0 when the timer was not active
   *  1 when the timer was active
   */
  int hrtimer_cancel(struct hrtimer *timer)
  {
  	for (;;) {
  		int ret = hrtimer_try_to_cancel(timer);
  
  		if (ret >= 0)
  			return ret;
5ef37b196   Joe Korty   [PATCH] add cpu_r...
496
  		cpu_relax();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
497
498
  	}
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
499
  EXPORT_SYMBOL_GPL(hrtimer_cancel);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
500
501
502
  
  /**
   * hrtimer_get_remaining - get remaining time for the timer
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
503
504
505
506
507
508
509
510
511
512
513
514
515
516
   * @timer:	the timer to read
   */
  ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
  {
  	struct hrtimer_base *base;
  	unsigned long flags;
  	ktime_t rem;
  
  	base = lock_hrtimer_base(timer, &flags);
  	rem = ktime_sub(timer->expires, timer->base->get_time());
  	unlock_hrtimer_base(timer, &flags);
  
  	return rem;
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
517
  EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
518

69239749e   Tony Lindgren   [PATCH] fix next_...
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
  #ifdef CONFIG_NO_IDLE_HZ
  /**
   * hrtimer_get_next_event - get the time until next expiry event
   *
   * Returns the delta to the next expiry event or KTIME_MAX if no timer
   * is pending.
   */
  ktime_t hrtimer_get_next_event(void)
  {
  	struct hrtimer_base *base = __get_cpu_var(hrtimer_bases);
  	ktime_t delta, mindelta = { .tv64 = KTIME_MAX };
  	unsigned long flags;
  	int i;
  
  	for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) {
  		struct hrtimer *timer;
  
  		spin_lock_irqsave(&base->lock, flags);
  		if (!base->first) {
  			spin_unlock_irqrestore(&base->lock, flags);
  			continue;
  		}
  		timer = rb_entry(base->first, struct hrtimer, node);
  		delta.tv64 = timer->expires.tv64;
  		spin_unlock_irqrestore(&base->lock, flags);
  		delta = ktime_sub(delta, base->get_time());
  		if (delta.tv64 < mindelta.tv64)
  			mindelta.tv64 = delta.tv64;
  	}
  	if (mindelta.tv64 < 0)
  		mindelta.tv64 = 0;
  	return mindelta;
  }
  #endif
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
553
  /**
7978672c4   George Anzinger   [PATCH] hrtimers:...
554
   * hrtimer_init - initialize a timer to the given clock
7978672c4   George Anzinger   [PATCH] hrtimers:...
555
   * @timer:	the timer to be initialized
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
556
   * @clock_id:	the clock to be used
7978672c4   George Anzinger   [PATCH] hrtimers:...
557
   * @mode:	timer mode abs/rel
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
558
   */
7978672c4   George Anzinger   [PATCH] hrtimers:...
559
560
  void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
  		  enum hrtimer_mode mode)
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
561
562
  {
  	struct hrtimer_base *bases;
7978672c4   George Anzinger   [PATCH] hrtimers:...
563
  	memset(timer, 0, sizeof(struct hrtimer));
bfe5d8341   Paul Mackerras   [PATCH] Define __...
564
  	bases = __raw_get_cpu_var(hrtimer_bases);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
565

7978672c4   George Anzinger   [PATCH] hrtimers:...
566
567
568
569
  	if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS)
  		clock_id = CLOCK_MONOTONIC;
  
  	timer->base = &bases[clock_id];
ed198cb49   David Woodhouse   [RBTREE] Update h...
570
  	rb_set_parent(&timer->node, &timer->node);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
571
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
572
  EXPORT_SYMBOL_GPL(hrtimer_init);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
573
574
575
  
  /**
   * hrtimer_get_res - get the timer resolution for a clock
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
576
577
578
579
580
581
582
583
584
   * @which_clock: which clock to query
   * @tp:		 pointer to timespec variable to store the resolution
   *
   * Store the resolution of the clock selected by which_clock in the
   * variable pointed to by tp.
   */
  int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
  {
  	struct hrtimer_base *bases;
bfe5d8341   Paul Mackerras   [PATCH] Define __...
585
  	bases = __raw_get_cpu_var(hrtimer_bases);
e2787630c   Thomas Gleixner   [hrtimer] Change ...
586
  	*tp = ktime_to_timespec(bases[which_clock].resolution);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
587
588
589
  
  	return 0;
  }
8d16b7642   Stephen Hemminger   [PATCH] hrtimer: ...
590
  EXPORT_SYMBOL_GPL(hrtimer_get_res);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
591
592
593
594
595
596
  
  /*
   * Expire the per base hrtimer-queue:
   */
  static inline void run_hrtimer_queue(struct hrtimer_base *base)
  {
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
597
  	struct rb_node *node;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
598

3055addad   Dimitri Sivanich   [PATCH] hrtimer: ...
599
600
  	if (!base->first)
  		return;
92127c7a4   Thomas Gleixner   [PATCH] hrtimers:...
601
602
  	if (base->get_softirq_time)
  		base->softirq_time = base->get_softirq_time();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
603
  	spin_lock_irq(&base->lock);
288867ec5   Thomas Gleixner   [hrtimer] Remove ...
604
  	while ((node = base->first)) {
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
605
  		struct hrtimer *timer;
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
606
  		int (*fn)(struct hrtimer *);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
607
  		int restart;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
608

288867ec5   Thomas Gleixner   [hrtimer] Remove ...
609
  		timer = rb_entry(node, struct hrtimer, node);
92127c7a4   Thomas Gleixner   [PATCH] hrtimers:...
610
  		if (base->softirq_time.tv64 <= timer->expires.tv64)
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
611
612
613
  			break;
  
  		fn = timer->function;
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
614
615
616
  		set_curr_timer(base, timer);
  		__remove_hrtimer(timer, base);
  		spin_unlock_irq(&base->lock);
05cfb614d   Roman Zippel   [PATCH] hrtimers:...
617
  		restart = fn(timer);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
618
619
  
  		spin_lock_irq(&base->lock);
b75f7a51c   Roman Zippel   [PATCH] hrtimers:...
620
621
  		if (restart != HRTIMER_NORESTART) {
  			BUG_ON(hrtimer_active(timer));
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
622
  			enqueue_hrtimer(timer, base);
b75f7a51c   Roman Zippel   [PATCH] hrtimers:...
623
  		}
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
624
625
626
627
628
629
630
631
632
633
634
635
  	}
  	set_curr_timer(base, NULL);
  	spin_unlock_irq(&base->lock);
  }
  
  /*
   * Called from timer softirq every jiffy, expire hrtimers:
   */
  void hrtimer_run_queues(void)
  {
  	struct hrtimer_base *base = __get_cpu_var(hrtimer_bases);
  	int i;
92127c7a4   Thomas Gleixner   [PATCH] hrtimers:...
636
  	hrtimer_get_softirq_time(base);
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
637
638
639
640
641
  	for (i = 0; i < MAX_HRTIMER_BASES; i++)
  		run_hrtimer_queue(&base[i]);
  }
  
  /*
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
642
643
   * Sleep related functions:
   */
00362e33f   Thomas Gleixner   [PATCH] hrtimer: ...
644
645
646
647
648
649
650
651
652
653
654
655
  static int hrtimer_wakeup(struct hrtimer *timer)
  {
  	struct hrtimer_sleeper *t =
  		container_of(timer, struct hrtimer_sleeper, timer);
  	struct task_struct *task = t->task;
  
  	t->task = NULL;
  	if (task)
  		wake_up_process(task);
  
  	return HRTIMER_NORESTART;
  }
36c8b5868   Ingo Molnar   [PATCH] sched: cl...
656
  void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
00362e33f   Thomas Gleixner   [PATCH] hrtimer: ...
657
658
659
660
  {
  	sl->timer.function = hrtimer_wakeup;
  	sl->task = task;
  }
669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
661
  static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
432569bb9   Roman Zippel   [PATCH] hrtimers:...
662
  {
669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
663
  	hrtimer_init_sleeper(t, current);
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
664

432569bb9   Roman Zippel   [PATCH] hrtimers:...
665
666
667
668
669
  	do {
  		set_current_state(TASK_INTERRUPTIBLE);
  		hrtimer_start(&t->timer, t->timer.expires, mode);
  
  		schedule();
669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
670
671
672
673
  		hrtimer_cancel(&t->timer);
  		mode = HRTIMER_ABS;
  
  	} while (t->task && !signal_pending(current));
432569bb9   Roman Zippel   [PATCH] hrtimers:...
674

669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
675
  	return t->task == NULL;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
676
  }
1711ef386   Toyo Abe   [PATCH] posix-tim...
677
  long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
678
  {
669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
679
  	struct hrtimer_sleeper t;
ea13dbc89   Ingo Molnar   [PATCH] kernel/hr...
680
681
  	struct timespec __user *rmtp;
  	struct timespec tu;
432569bb9   Roman Zippel   [PATCH] hrtimers:...
682
  	ktime_t time;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
683
684
  
  	restart->fn = do_no_restart_syscall;
1711ef386   Toyo Abe   [PATCH] posix-tim...
685
686
  	hrtimer_init(&t.timer, restart->arg0, HRTIMER_ABS);
  	t.timer.expires.tv64 = ((u64)restart->arg3 << 32) | (u64) restart->arg2;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
687

432569bb9   Roman Zippel   [PATCH] hrtimers:...
688
  	if (do_nanosleep(&t, HRTIMER_ABS))
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
689
  		return 0;
1711ef386   Toyo Abe   [PATCH] posix-tim...
690
  	rmtp = (struct timespec __user *) restart->arg1;
432569bb9   Roman Zippel   [PATCH] hrtimers:...
691
692
693
694
695
696
697
698
  	if (rmtp) {
  		time = ktime_sub(t.timer.expires, t.timer.base->get_time());
  		if (time.tv64 <= 0)
  			return 0;
  		tu = ktime_to_timespec(time);
  		if (copy_to_user(rmtp, &tu, sizeof(tu)))
  			return -EFAULT;
  	}
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
699

1711ef386   Toyo Abe   [PATCH] posix-tim...
700
  	restart->fn = hrtimer_nanosleep_restart;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
701
702
703
704
  
  	/* The other values in restart are already filled in */
  	return -ERESTART_RESTARTBLOCK;
  }
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
705
706
707
708
  long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
  		       const enum hrtimer_mode mode, const clockid_t clockid)
  {
  	struct restart_block *restart;
669d7868a   Thomas Gleixner   [PATCH] hrtimer: ...
709
  	struct hrtimer_sleeper t;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
710
711
  	struct timespec tu;
  	ktime_t rem;
432569bb9   Roman Zippel   [PATCH] hrtimers:...
712
713
714
  	hrtimer_init(&t.timer, clockid, mode);
  	t.timer.expires = timespec_to_ktime(*rqtp);
  	if (do_nanosleep(&t, mode))
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
715
  		return 0;
7978672c4   George Anzinger   [PATCH] hrtimers:...
716
  	/* Absolute timers do not update the rmtp value and restart: */
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
717
718
  	if (mode == HRTIMER_ABS)
  		return -ERESTARTNOHAND;
432569bb9   Roman Zippel   [PATCH] hrtimers:...
719
720
721
722
723
724
725
726
  	if (rmtp) {
  		rem = ktime_sub(t.timer.expires, t.timer.base->get_time());
  		if (rem.tv64 <= 0)
  			return 0;
  		tu = ktime_to_timespec(rem);
  		if (copy_to_user(rmtp, &tu, sizeof(tu)))
  			return -EFAULT;
  	}
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
727
728
  
  	restart = &current_thread_info()->restart_block;
1711ef386   Toyo Abe   [PATCH] posix-tim...
729
730
731
732
733
  	restart->fn = hrtimer_nanosleep_restart;
  	restart->arg0 = (unsigned long) t.timer.base->index;
  	restart->arg1 = (unsigned long) rmtp;
  	restart->arg2 = t.timer.expires.tv64 & 0xFFFFFFFF;
  	restart->arg3 = t.timer.expires.tv64 >> 32;
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
734
735
736
  
  	return -ERESTART_RESTARTBLOCK;
  }
6ba1b9121   Thomas Gleixner   [PATCH] hrtimer: ...
737
738
739
740
741
742
743
744
745
746
747
748
749
  asmlinkage long
  sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
  {
  	struct timespec tu;
  
  	if (copy_from_user(&tu, rqtp, sizeof(tu)))
  		return -EFAULT;
  
  	if (!timespec_valid(&tu))
  		return -EINVAL;
  
  	return hrtimer_nanosleep(&tu, rmtp, HRTIMER_REL, CLOCK_MONOTONIC);
  }
10c94ec16   Thomas Gleixner   [PATCH] hrtimer: ...
750
  /*
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
751
752
753
754
755
756
   * Functions related to boot-time initialization:
   */
  static void __devinit init_hrtimers_cpu(int cpu)
  {
  	struct hrtimer_base *base = per_cpu(hrtimer_bases, cpu);
  	int i;
543655244   Ingo Molnar   [PATCH] lockdep: ...
757
  	for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) {
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
758
  		spin_lock_init(&base->lock);
543655244   Ingo Molnar   [PATCH] lockdep: ...
759
760
  		lockdep_set_class(&base->lock, &base->lock_key);
  	}
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
  }
  
  #ifdef CONFIG_HOTPLUG_CPU
  
  static void migrate_hrtimer_list(struct hrtimer_base *old_base,
  				struct hrtimer_base *new_base)
  {
  	struct hrtimer *timer;
  	struct rb_node *node;
  
  	while ((node = rb_first(&old_base->active))) {
  		timer = rb_entry(node, struct hrtimer, node);
  		__remove_hrtimer(timer, old_base);
  		timer->base = new_base;
  		enqueue_hrtimer(timer, new_base);
  	}
  }
  
  static void migrate_hrtimers(int cpu)
  {
  	struct hrtimer_base *old_base, *new_base;
  	int i;
  
  	BUG_ON(cpu_online(cpu));
  	old_base = per_cpu(hrtimer_bases, cpu);
  	new_base = get_cpu_var(hrtimer_bases);
  
  	local_irq_disable();
  
  	for (i = 0; i < MAX_HRTIMER_BASES; i++) {
  
  		spin_lock(&new_base->lock);
  		spin_lock(&old_base->lock);
  
  		BUG_ON(old_base->curr_timer);
  
  		migrate_hrtimer_list(old_base, new_base);
  
  		spin_unlock(&old_base->lock);
  		spin_unlock(&new_base->lock);
  		old_base++;
  		new_base++;
  	}
  
  	local_irq_enable();
  	put_cpu_var(hrtimer_bases);
  }
  #endif /* CONFIG_HOTPLUG_CPU */
8c78f3075   Chandra Seetharaman   [PATCH] cpu hotpl...
809
  static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self,
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
  					unsigned long action, void *hcpu)
  {
  	long cpu = (long)hcpu;
  
  	switch (action) {
  
  	case CPU_UP_PREPARE:
  		init_hrtimers_cpu(cpu);
  		break;
  
  #ifdef CONFIG_HOTPLUG_CPU
  	case CPU_DEAD:
  		migrate_hrtimers(cpu);
  		break;
  #endif
  
  	default:
  		break;
  	}
  
  	return NOTIFY_OK;
  }
8c78f3075   Chandra Seetharaman   [PATCH] cpu hotpl...
832
  static struct notifier_block __cpuinitdata hrtimers_nb = {
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
833
834
835
836
837
838
839
840
841
  	.notifier_call = hrtimer_cpu_notify,
  };
  
  void __init hrtimers_init(void)
  {
  	hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE,
  			  (void *)(long)smp_processor_id());
  	register_cpu_notifier(&hrtimers_nb);
  }