These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / qemu-timer.c
1 /*
2  * QEMU System Emulator
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24
25 #include "qemu/osdep.h"
26 #include "qemu/main-loop.h"
27 #include "qemu/timer.h"
28 #include "sysemu/replay.h"
29 #include "sysemu/sysemu.h"
30
31 #ifdef CONFIG_POSIX
32 #include <pthread.h>
33 #endif
34
35 #ifdef CONFIG_PPOLL
36 #include <poll.h>
37 #endif
38
39 #ifdef CONFIG_PRCTL_PR_SET_TIMERSLACK
40 #include <sys/prctl.h>
41 #endif
42
43 /***********************************************************/
44 /* timers */
45
46 typedef struct QEMUClock {
47     /* We rely on BQL to protect the timerlists */
48     QLIST_HEAD(, QEMUTimerList) timerlists;
49
50     NotifierList reset_notifiers;
51     int64_t last;
52
53     QEMUClockType type;
54     bool enabled;
55 } QEMUClock;
56
57 QEMUTimerListGroup main_loop_tlg;
58 static QEMUClock qemu_clocks[QEMU_CLOCK_MAX];
59
60 /* A QEMUTimerList is a list of timers attached to a clock. More
61  * than one QEMUTimerList can be attached to each clock, for instance
62  * used by different AioContexts / threads. Each clock also has
63  * a list of the QEMUTimerLists associated with it, in order that
64  * reenabling the clock can call all the notifiers.
65  */
66
67 struct QEMUTimerList {
68     QEMUClock *clock;
69     QemuMutex active_timers_lock;
70     QEMUTimer *active_timers;
71     QLIST_ENTRY(QEMUTimerList) list;
72     QEMUTimerListNotifyCB *notify_cb;
73     void *notify_opaque;
74
75     /* lightweight method to mark the end of timerlist's running */
76     QemuEvent timers_done_ev;
77 };
78
79 /**
80  * qemu_clock_ptr:
81  * @type: type of clock
82  *
83  * Translate a clock type into a pointer to QEMUClock object.
84  *
85  * Returns: a pointer to the QEMUClock object
86  */
87 static inline QEMUClock *qemu_clock_ptr(QEMUClockType type)
88 {
89     return &qemu_clocks[type];
90 }
91
92 static bool timer_expired_ns(QEMUTimer *timer_head, int64_t current_time)
93 {
94     return timer_head && (timer_head->expire_time <= current_time);
95 }
96
97 QEMUTimerList *timerlist_new(QEMUClockType type,
98                              QEMUTimerListNotifyCB *cb,
99                              void *opaque)
100 {
101     QEMUTimerList *timer_list;
102     QEMUClock *clock = qemu_clock_ptr(type);
103
104     timer_list = g_malloc0(sizeof(QEMUTimerList));
105     qemu_event_init(&timer_list->timers_done_ev, true);
106     timer_list->clock = clock;
107     timer_list->notify_cb = cb;
108     timer_list->notify_opaque = opaque;
109     qemu_mutex_init(&timer_list->active_timers_lock);
110     QLIST_INSERT_HEAD(&clock->timerlists, timer_list, list);
111     return timer_list;
112 }
113
114 void timerlist_free(QEMUTimerList *timer_list)
115 {
116     assert(!timerlist_has_timers(timer_list));
117     if (timer_list->clock) {
118         QLIST_REMOVE(timer_list, list);
119     }
120     qemu_mutex_destroy(&timer_list->active_timers_lock);
121     g_free(timer_list);
122 }
123
124 static void qemu_clock_init(QEMUClockType type)
125 {
126     QEMUClock *clock = qemu_clock_ptr(type);
127
128     /* Assert that the clock of type TYPE has not been initialized yet. */
129     assert(main_loop_tlg.tl[type] == NULL);
130
131     clock->type = type;
132     clock->enabled = true;
133     clock->last = INT64_MIN;
134     QLIST_INIT(&clock->timerlists);
135     notifier_list_init(&clock->reset_notifiers);
136     main_loop_tlg.tl[type] = timerlist_new(type, NULL, NULL);
137 }
138
139 bool qemu_clock_use_for_deadline(QEMUClockType type)
140 {
141     return !(use_icount && (type == QEMU_CLOCK_VIRTUAL));
142 }
143
144 void qemu_clock_notify(QEMUClockType type)
145 {
146     QEMUTimerList *timer_list;
147     QEMUClock *clock = qemu_clock_ptr(type);
148     QLIST_FOREACH(timer_list, &clock->timerlists, list) {
149         timerlist_notify(timer_list);
150     }
151 }
152
153 /* Disabling the clock will wait for related timerlists to stop
154  * executing qemu_run_timers.  Thus, this functions should not
155  * be used from the callback of a timer that is based on @clock.
156  * Doing so would cause a deadlock.
157  *
158  * Caller should hold BQL.
159  */
160 void qemu_clock_enable(QEMUClockType type, bool enabled)
161 {
162     QEMUClock *clock = qemu_clock_ptr(type);
163     QEMUTimerList *tl;
164     bool old = clock->enabled;
165     clock->enabled = enabled;
166     if (enabled && !old) {
167         qemu_clock_notify(type);
168     } else if (!enabled && old) {
169         QLIST_FOREACH(tl, &clock->timerlists, list) {
170             qemu_event_wait(&tl->timers_done_ev);
171         }
172     }
173 }
174
175 bool timerlist_has_timers(QEMUTimerList *timer_list)
176 {
177     return !!timer_list->active_timers;
178 }
179
180 bool qemu_clock_has_timers(QEMUClockType type)
181 {
182     return timerlist_has_timers(
183         main_loop_tlg.tl[type]);
184 }
185
186 bool timerlist_expired(QEMUTimerList *timer_list)
187 {
188     int64_t expire_time;
189
190     qemu_mutex_lock(&timer_list->active_timers_lock);
191     if (!timer_list->active_timers) {
192         qemu_mutex_unlock(&timer_list->active_timers_lock);
193         return false;
194     }
195     expire_time = timer_list->active_timers->expire_time;
196     qemu_mutex_unlock(&timer_list->active_timers_lock);
197
198     return expire_time < qemu_clock_get_ns(timer_list->clock->type);
199 }
200
201 bool qemu_clock_expired(QEMUClockType type)
202 {
203     return timerlist_expired(
204         main_loop_tlg.tl[type]);
205 }
206
207 /*
208  * As above, but return -1 for no deadline, and do not cap to 2^32
209  * as we know the result is always positive.
210  */
211
212 int64_t timerlist_deadline_ns(QEMUTimerList *timer_list)
213 {
214     int64_t delta;
215     int64_t expire_time;
216
217     if (!timer_list->clock->enabled) {
218         return -1;
219     }
220
221     /* The active timers list may be modified before the caller uses our return
222      * value but ->notify_cb() is called when the deadline changes.  Therefore
223      * the caller should notice the change and there is no race condition.
224      */
225     qemu_mutex_lock(&timer_list->active_timers_lock);
226     if (!timer_list->active_timers) {
227         qemu_mutex_unlock(&timer_list->active_timers_lock);
228         return -1;
229     }
230     expire_time = timer_list->active_timers->expire_time;
231     qemu_mutex_unlock(&timer_list->active_timers_lock);
232
233     delta = expire_time - qemu_clock_get_ns(timer_list->clock->type);
234
235     if (delta <= 0) {
236         return 0;
237     }
238
239     return delta;
240 }
241
242 /* Calculate the soonest deadline across all timerlists attached
243  * to the clock. This is used for the icount timeout so we
244  * ignore whether or not the clock should be used in deadline
245  * calculations.
246  */
247 int64_t qemu_clock_deadline_ns_all(QEMUClockType type)
248 {
249     int64_t deadline = -1;
250     QEMUTimerList *timer_list;
251     QEMUClock *clock = qemu_clock_ptr(type);
252     QLIST_FOREACH(timer_list, &clock->timerlists, list) {
253         deadline = qemu_soonest_timeout(deadline,
254                                         timerlist_deadline_ns(timer_list));
255     }
256     return deadline;
257 }
258
259 QEMUClockType timerlist_get_clock(QEMUTimerList *timer_list)
260 {
261     return timer_list->clock->type;
262 }
263
264 QEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type)
265 {
266     return main_loop_tlg.tl[type];
267 }
268
269 void timerlist_notify(QEMUTimerList *timer_list)
270 {
271     if (timer_list->notify_cb) {
272         timer_list->notify_cb(timer_list->notify_opaque);
273     } else {
274         qemu_notify_event();
275     }
276 }
277
278 /* Transition function to convert a nanosecond timeout to ms
279  * This is used where a system does not support ppoll
280  */
281 int qemu_timeout_ns_to_ms(int64_t ns)
282 {
283     int64_t ms;
284     if (ns < 0) {
285         return -1;
286     }
287
288     if (!ns) {
289         return 0;
290     }
291
292     /* Always round up, because it's better to wait too long than to wait too
293      * little and effectively busy-wait
294      */
295     ms = (ns + SCALE_MS - 1) / SCALE_MS;
296
297     /* To avoid overflow problems, limit this to 2^31, i.e. approx 25 days */
298     if (ms > (int64_t) INT32_MAX) {
299         ms = INT32_MAX;
300     }
301
302     return (int) ms;
303 }
304
305
306 /* qemu implementation of g_poll which uses a nanosecond timeout but is
307  * otherwise identical to g_poll
308  */
309 int qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout)
310 {
311 #ifdef CONFIG_PPOLL
312     if (timeout < 0) {
313         return ppoll((struct pollfd *)fds, nfds, NULL, NULL);
314     } else {
315         struct timespec ts;
316         int64_t tvsec = timeout / 1000000000LL;
317         /* Avoid possibly overflowing and specifying a negative number of
318          * seconds, which would turn a very long timeout into a busy-wait.
319          */
320         if (tvsec > (int64_t)INT32_MAX) {
321             tvsec = INT32_MAX;
322         }
323         ts.tv_sec = tvsec;
324         ts.tv_nsec = timeout % 1000000000LL;
325         return ppoll((struct pollfd *)fds, nfds, &ts, NULL);
326     }
327 #else
328     return g_poll(fds, nfds, qemu_timeout_ns_to_ms(timeout));
329 #endif
330 }
331
332
333 void timer_init_tl(QEMUTimer *ts,
334                    QEMUTimerList *timer_list, int scale,
335                    QEMUTimerCB *cb, void *opaque)
336 {
337     ts->timer_list = timer_list;
338     ts->cb = cb;
339     ts->opaque = opaque;
340     ts->scale = scale;
341     ts->expire_time = -1;
342 }
343
344 void timer_deinit(QEMUTimer *ts)
345 {
346     assert(ts->expire_time == -1);
347     ts->timer_list = NULL;
348 }
349
350 void timer_free(QEMUTimer *ts)
351 {
352     g_free(ts);
353 }
354
355 static void timer_del_locked(QEMUTimerList *timer_list, QEMUTimer *ts)
356 {
357     QEMUTimer **pt, *t;
358
359     ts->expire_time = -1;
360     pt = &timer_list->active_timers;
361     for(;;) {
362         t = *pt;
363         if (!t)
364             break;
365         if (t == ts) {
366             *pt = t->next;
367             break;
368         }
369         pt = &t->next;
370     }
371 }
372
373 static bool timer_mod_ns_locked(QEMUTimerList *timer_list,
374                                 QEMUTimer *ts, int64_t expire_time)
375 {
376     QEMUTimer **pt, *t;
377
378     /* add the timer in the sorted list */
379     pt = &timer_list->active_timers;
380     for (;;) {
381         t = *pt;
382         if (!timer_expired_ns(t, expire_time)) {
383             break;
384         }
385         pt = &t->next;
386     }
387     ts->expire_time = MAX(expire_time, 0);
388     ts->next = *pt;
389     *pt = ts;
390
391     return pt == &timer_list->active_timers;
392 }
393
394 static void timerlist_rearm(QEMUTimerList *timer_list)
395 {
396     /* Interrupt execution to force deadline recalculation.  */
397     if (timer_list->clock->type == QEMU_CLOCK_VIRTUAL) {
398         qemu_start_warp_timer();
399     }
400     timerlist_notify(timer_list);
401 }
402
403 /* stop a timer, but do not dealloc it */
404 void timer_del(QEMUTimer *ts)
405 {
406     QEMUTimerList *timer_list = ts->timer_list;
407
408     if (timer_list) {
409         qemu_mutex_lock(&timer_list->active_timers_lock);
410         timer_del_locked(timer_list, ts);
411         qemu_mutex_unlock(&timer_list->active_timers_lock);
412     }
413 }
414
415 /* modify the current timer so that it will be fired when current_time
416    >= expire_time. The corresponding callback will be called. */
417 void timer_mod_ns(QEMUTimer *ts, int64_t expire_time)
418 {
419     QEMUTimerList *timer_list = ts->timer_list;
420     bool rearm;
421
422     qemu_mutex_lock(&timer_list->active_timers_lock);
423     timer_del_locked(timer_list, ts);
424     rearm = timer_mod_ns_locked(timer_list, ts, expire_time);
425     qemu_mutex_unlock(&timer_list->active_timers_lock);
426
427     if (rearm) {
428         timerlist_rearm(timer_list);
429     }
430 }
431
432 /* modify the current timer so that it will be fired when current_time
433    >= expire_time or the current deadline, whichever comes earlier.
434    The corresponding callback will be called. */
435 void timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time)
436 {
437     QEMUTimerList *timer_list = ts->timer_list;
438     bool rearm;
439
440     qemu_mutex_lock(&timer_list->active_timers_lock);
441     if (ts->expire_time == -1 || ts->expire_time > expire_time) {
442         if (ts->expire_time != -1) {
443             timer_del_locked(timer_list, ts);
444         }
445         rearm = timer_mod_ns_locked(timer_list, ts, expire_time);
446     } else {
447         rearm = false;
448     }
449     qemu_mutex_unlock(&timer_list->active_timers_lock);
450
451     if (rearm) {
452         timerlist_rearm(timer_list);
453     }
454 }
455
456 void timer_mod(QEMUTimer *ts, int64_t expire_time)
457 {
458     timer_mod_ns(ts, expire_time * ts->scale);
459 }
460
461 void timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time)
462 {
463     timer_mod_anticipate_ns(ts, expire_time * ts->scale);
464 }
465
466 bool timer_pending(QEMUTimer *ts)
467 {
468     return ts->expire_time >= 0;
469 }
470
471 bool timer_expired(QEMUTimer *timer_head, int64_t current_time)
472 {
473     return timer_expired_ns(timer_head, current_time * timer_head->scale);
474 }
475
476 bool timerlist_run_timers(QEMUTimerList *timer_list)
477 {
478     QEMUTimer *ts;
479     int64_t current_time;
480     bool progress = false;
481     QEMUTimerCB *cb;
482     void *opaque;
483
484     qemu_event_reset(&timer_list->timers_done_ev);
485     if (!timer_list->clock->enabled || !timer_list->active_timers) {
486         goto out;
487     }
488
489     switch (timer_list->clock->type) {
490     case QEMU_CLOCK_REALTIME:
491         break;
492     default:
493     case QEMU_CLOCK_VIRTUAL:
494         if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL)) {
495             goto out;
496         }
497         break;
498     case QEMU_CLOCK_HOST:
499         if (!replay_checkpoint(CHECKPOINT_CLOCK_HOST)) {
500             goto out;
501         }
502         break;
503     case QEMU_CLOCK_VIRTUAL_RT:
504         if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL_RT)) {
505             goto out;
506         }
507         break;
508     }
509
510     current_time = qemu_clock_get_ns(timer_list->clock->type);
511     for(;;) {
512         qemu_mutex_lock(&timer_list->active_timers_lock);
513         ts = timer_list->active_timers;
514         if (!timer_expired_ns(ts, current_time)) {
515             qemu_mutex_unlock(&timer_list->active_timers_lock);
516             break;
517         }
518
519         /* remove timer from the list before calling the callback */
520         timer_list->active_timers = ts->next;
521         ts->next = NULL;
522         ts->expire_time = -1;
523         cb = ts->cb;
524         opaque = ts->opaque;
525         qemu_mutex_unlock(&timer_list->active_timers_lock);
526
527         /* run the callback (the timer list can be modified) */
528         cb(opaque);
529         progress = true;
530     }
531
532 out:
533     qemu_event_set(&timer_list->timers_done_ev);
534     return progress;
535 }
536
537 bool qemu_clock_run_timers(QEMUClockType type)
538 {
539     return timerlist_run_timers(main_loop_tlg.tl[type]);
540 }
541
542 void timerlistgroup_init(QEMUTimerListGroup *tlg,
543                          QEMUTimerListNotifyCB *cb, void *opaque)
544 {
545     QEMUClockType type;
546     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
547         tlg->tl[type] = timerlist_new(type, cb, opaque);
548     }
549 }
550
551 void timerlistgroup_deinit(QEMUTimerListGroup *tlg)
552 {
553     QEMUClockType type;
554     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
555         timerlist_free(tlg->tl[type]);
556     }
557 }
558
559 bool timerlistgroup_run_timers(QEMUTimerListGroup *tlg)
560 {
561     QEMUClockType type;
562     bool progress = false;
563     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
564         progress |= timerlist_run_timers(tlg->tl[type]);
565     }
566     return progress;
567 }
568
569 int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg)
570 {
571     int64_t deadline = -1;
572     QEMUClockType type;
573     bool play = replay_mode == REPLAY_MODE_PLAY;
574     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
575         if (qemu_clock_use_for_deadline(type)) {
576             if (!play || type == QEMU_CLOCK_REALTIME) {
577                 deadline = qemu_soonest_timeout(deadline,
578                                                 timerlist_deadline_ns(tlg->tl[type]));
579             } else {
580                 /* Read clock from the replay file and
581                    do not calculate the deadline, based on virtual clock. */
582                 qemu_clock_get_ns(type);
583             }
584         }
585     }
586     return deadline;
587 }
588
589 int64_t qemu_clock_get_ns(QEMUClockType type)
590 {
591     int64_t now, last;
592     QEMUClock *clock = qemu_clock_ptr(type);
593
594     switch (type) {
595     case QEMU_CLOCK_REALTIME:
596         return get_clock();
597     default:
598     case QEMU_CLOCK_VIRTUAL:
599         if (use_icount) {
600             return cpu_get_icount();
601         } else {
602             return cpu_get_clock();
603         }
604     case QEMU_CLOCK_HOST:
605         now = REPLAY_CLOCK(REPLAY_CLOCK_HOST, get_clock_realtime());
606         last = clock->last;
607         clock->last = now;
608         if (now < last || now > (last + get_max_clock_jump())) {
609             notifier_list_notify(&clock->reset_notifiers, &now);
610         }
611         return now;
612     case QEMU_CLOCK_VIRTUAL_RT:
613         return REPLAY_CLOCK(REPLAY_CLOCK_VIRTUAL_RT, cpu_get_clock());
614     }
615 }
616
617 void qemu_clock_register_reset_notifier(QEMUClockType type,
618                                         Notifier *notifier)
619 {
620     QEMUClock *clock = qemu_clock_ptr(type);
621     notifier_list_add(&clock->reset_notifiers, notifier);
622 }
623
624 void qemu_clock_unregister_reset_notifier(QEMUClockType type,
625                                           Notifier *notifier)
626 {
627     notifier_remove(notifier);
628 }
629
630 void init_clocks(void)
631 {
632     QEMUClockType type;
633     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
634         qemu_clock_init(type);
635     }
636
637 #ifdef CONFIG_PRCTL_PR_SET_TIMERSLACK
638     prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0);
639 #endif
640 }
641
642 uint64_t timer_expire_time_ns(QEMUTimer *ts)
643 {
644     return timer_pending(ts) ? ts->expire_time : -1;
645 }
646
647 bool qemu_clock_run_all_timers(void)
648 {
649     bool progress = false;
650     QEMUClockType type;
651
652     for (type = 0; type < QEMU_CLOCK_MAX; type++) {
653         progress |= qemu_clock_run_timers(type);
654     }
655
656     return progress;
657 }