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 = (type == QEMU_CLOCK_VIRTUAL ? false : 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 !!atomic_read(&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 if (!atomic_read(&timer_list->active_timers)) { 191 return false; 192 } 193 194 qemu_mutex_lock(&timer_list->active_timers_lock); 195 if (!timer_list->active_timers) { 196 qemu_mutex_unlock(&timer_list->active_timers_lock); 197 return false; 198 } 199 expire_time = timer_list->active_timers->expire_time; 200 qemu_mutex_unlock(&timer_list->active_timers_lock); 201 202 return expire_time < qemu_clock_get_ns(timer_list->clock->type); 203 } 204 205 bool qemu_clock_expired(QEMUClockType type) 206 { 207 return timerlist_expired( 208 main_loop_tlg.tl[type]); 209 } 210 211 /* 212 * As above, but return -1 for no deadline, and do not cap to 2^32 213 * as we know the result is always positive. 214 */ 215 216 int64_t timerlist_deadline_ns(QEMUTimerList *timer_list) 217 { 218 int64_t delta; 219 int64_t expire_time; 220 221 if (!atomic_read(&timer_list->active_timers)) { 222 return -1; 223 } 224 225 if (!timer_list->clock->enabled) { 226 return -1; 227 } 228 229 /* The active timers list may be modified before the caller uses our return 230 * value but ->notify_cb() is called when the deadline changes. Therefore 231 * the caller should notice the change and there is no race condition. 232 */ 233 qemu_mutex_lock(&timer_list->active_timers_lock); 234 if (!timer_list->active_timers) { 235 qemu_mutex_unlock(&timer_list->active_timers_lock); 236 return -1; 237 } 238 expire_time = timer_list->active_timers->expire_time; 239 qemu_mutex_unlock(&timer_list->active_timers_lock); 240 241 delta = expire_time - qemu_clock_get_ns(timer_list->clock->type); 242 243 if (delta <= 0) { 244 return 0; 245 } 246 247 return delta; 248 } 249 250 /* Calculate the soonest deadline across all timerlists attached 251 * to the clock. This is used for the icount timeout so we 252 * ignore whether or not the clock should be used in deadline 253 * calculations. 254 */ 255 int64_t qemu_clock_deadline_ns_all(QEMUClockType type) 256 { 257 int64_t deadline = -1; 258 QEMUTimerList *timer_list; 259 QEMUClock *clock = qemu_clock_ptr(type); 260 QLIST_FOREACH(timer_list, &clock->timerlists, list) { 261 deadline = qemu_soonest_timeout(deadline, 262 timerlist_deadline_ns(timer_list)); 263 } 264 return deadline; 265 } 266 267 QEMUClockType timerlist_get_clock(QEMUTimerList *timer_list) 268 { 269 return timer_list->clock->type; 270 } 271 272 QEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type) 273 { 274 return main_loop_tlg.tl[type]; 275 } 276 277 void timerlist_notify(QEMUTimerList *timer_list) 278 { 279 if (timer_list->notify_cb) { 280 timer_list->notify_cb(timer_list->notify_opaque); 281 } else { 282 qemu_notify_event(); 283 } 284 } 285 286 /* Transition function to convert a nanosecond timeout to ms 287 * This is used where a system does not support ppoll 288 */ 289 int qemu_timeout_ns_to_ms(int64_t ns) 290 { 291 int64_t ms; 292 if (ns < 0) { 293 return -1; 294 } 295 296 if (!ns) { 297 return 0; 298 } 299 300 /* Always round up, because it's better to wait too long than to wait too 301 * little and effectively busy-wait 302 */ 303 ms = DIV_ROUND_UP(ns, SCALE_MS); 304 305 /* To avoid overflow problems, limit this to 2^31, i.e. approx 25 days */ 306 if (ms > (int64_t) INT32_MAX) { 307 ms = INT32_MAX; 308 } 309 310 return (int) ms; 311 } 312 313 314 /* qemu implementation of g_poll which uses a nanosecond timeout but is 315 * otherwise identical to g_poll 316 */ 317 int qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout) 318 { 319 #ifdef CONFIG_PPOLL 320 if (timeout < 0) { 321 return ppoll((struct pollfd *)fds, nfds, NULL, NULL); 322 } else { 323 struct timespec ts; 324 int64_t tvsec = timeout / 1000000000LL; 325 /* Avoid possibly overflowing and specifying a negative number of 326 * seconds, which would turn a very long timeout into a busy-wait. 327 */ 328 if (tvsec > (int64_t)INT32_MAX) { 329 tvsec = INT32_MAX; 330 } 331 ts.tv_sec = tvsec; 332 ts.tv_nsec = timeout % 1000000000LL; 333 return ppoll((struct pollfd *)fds, nfds, &ts, NULL); 334 } 335 #else 336 return g_poll(fds, nfds, qemu_timeout_ns_to_ms(timeout)); 337 #endif 338 } 339 340 341 void timer_init_tl(QEMUTimer *ts, 342 QEMUTimerList *timer_list, int scale, 343 QEMUTimerCB *cb, void *opaque) 344 { 345 ts->timer_list = timer_list; 346 ts->cb = cb; 347 ts->opaque = opaque; 348 ts->scale = scale; 349 ts->expire_time = -1; 350 } 351 352 void timer_deinit(QEMUTimer *ts) 353 { 354 assert(ts->expire_time == -1); 355 ts->timer_list = NULL; 356 } 357 358 static void timer_del_locked(QEMUTimerList *timer_list, QEMUTimer *ts) 359 { 360 QEMUTimer **pt, *t; 361 362 ts->expire_time = -1; 363 pt = &timer_list->active_timers; 364 for(;;) { 365 t = *pt; 366 if (!t) 367 break; 368 if (t == ts) { 369 atomic_set(pt, t->next); 370 break; 371 } 372 pt = &t->next; 373 } 374 } 375 376 static bool timer_mod_ns_locked(QEMUTimerList *timer_list, 377 QEMUTimer *ts, int64_t expire_time) 378 { 379 QEMUTimer **pt, *t; 380 381 /* add the timer in the sorted list */ 382 pt = &timer_list->active_timers; 383 for (;;) { 384 t = *pt; 385 if (!timer_expired_ns(t, expire_time)) { 386 break; 387 } 388 pt = &t->next; 389 } 390 ts->expire_time = MAX(expire_time, 0); 391 ts->next = *pt; 392 atomic_set(pt, ts); 393 394 return pt == &timer_list->active_timers; 395 } 396 397 static void timerlist_rearm(QEMUTimerList *timer_list) 398 { 399 /* Interrupt execution to force deadline recalculation. */ 400 if (timer_list->clock->type == QEMU_CLOCK_VIRTUAL) { 401 qemu_start_warp_timer(); 402 } 403 timerlist_notify(timer_list); 404 } 405 406 /* stop a timer, but do not dealloc it */ 407 void timer_del(QEMUTimer *ts) 408 { 409 QEMUTimerList *timer_list = ts->timer_list; 410 411 if (timer_list) { 412 qemu_mutex_lock(&timer_list->active_timers_lock); 413 timer_del_locked(timer_list, ts); 414 qemu_mutex_unlock(&timer_list->active_timers_lock); 415 } 416 } 417 418 /* modify the current timer so that it will be fired when current_time 419 >= expire_time. The corresponding callback will be called. */ 420 void timer_mod_ns(QEMUTimer *ts, int64_t expire_time) 421 { 422 QEMUTimerList *timer_list = ts->timer_list; 423 bool rearm; 424 425 qemu_mutex_lock(&timer_list->active_timers_lock); 426 timer_del_locked(timer_list, ts); 427 rearm = timer_mod_ns_locked(timer_list, ts, expire_time); 428 qemu_mutex_unlock(&timer_list->active_timers_lock); 429 430 if (rearm) { 431 timerlist_rearm(timer_list); 432 } 433 } 434 435 /* modify the current timer so that it will be fired when current_time 436 >= expire_time or the current deadline, whichever comes earlier. 437 The corresponding callback will be called. */ 438 void timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time) 439 { 440 QEMUTimerList *timer_list = ts->timer_list; 441 bool rearm; 442 443 qemu_mutex_lock(&timer_list->active_timers_lock); 444 if (ts->expire_time == -1 || ts->expire_time > expire_time) { 445 if (ts->expire_time != -1) { 446 timer_del_locked(timer_list, ts); 447 } 448 rearm = timer_mod_ns_locked(timer_list, ts, expire_time); 449 } else { 450 rearm = false; 451 } 452 qemu_mutex_unlock(&timer_list->active_timers_lock); 453 454 if (rearm) { 455 timerlist_rearm(timer_list); 456 } 457 } 458 459 void timer_mod(QEMUTimer *ts, int64_t expire_time) 460 { 461 timer_mod_ns(ts, expire_time * ts->scale); 462 } 463 464 void timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time) 465 { 466 timer_mod_anticipate_ns(ts, expire_time * ts->scale); 467 } 468 469 bool timer_pending(QEMUTimer *ts) 470 { 471 return ts->expire_time >= 0; 472 } 473 474 bool timer_expired(QEMUTimer *timer_head, int64_t current_time) 475 { 476 return timer_expired_ns(timer_head, current_time * timer_head->scale); 477 } 478 479 bool timerlist_run_timers(QEMUTimerList *timer_list) 480 { 481 QEMUTimer *ts; 482 int64_t current_time; 483 bool progress = false; 484 QEMUTimerCB *cb; 485 void *opaque; 486 487 if (!atomic_read(&timer_list->active_timers)) { 488 return false; 489 } 490 491 qemu_event_reset(&timer_list->timers_done_ev); 492 if (!timer_list->clock->enabled) { 493 goto out; 494 } 495 496 switch (timer_list->clock->type) { 497 case QEMU_CLOCK_REALTIME: 498 break; 499 default: 500 case QEMU_CLOCK_VIRTUAL: 501 if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL)) { 502 goto out; 503 } 504 break; 505 case QEMU_CLOCK_HOST: 506 if (!replay_checkpoint(CHECKPOINT_CLOCK_HOST)) { 507 goto out; 508 } 509 break; 510 case QEMU_CLOCK_VIRTUAL_RT: 511 if (!replay_checkpoint(CHECKPOINT_CLOCK_VIRTUAL_RT)) { 512 goto out; 513 } 514 break; 515 } 516 517 current_time = qemu_clock_get_ns(timer_list->clock->type); 518 for(;;) { 519 qemu_mutex_lock(&timer_list->active_timers_lock); 520 ts = timer_list->active_timers; 521 if (!timer_expired_ns(ts, current_time)) { 522 qemu_mutex_unlock(&timer_list->active_timers_lock); 523 break; 524 } 525 526 /* remove timer from the list before calling the callback */ 527 timer_list->active_timers = ts->next; 528 ts->next = NULL; 529 ts->expire_time = -1; 530 cb = ts->cb; 531 opaque = ts->opaque; 532 qemu_mutex_unlock(&timer_list->active_timers_lock); 533 534 /* run the callback (the timer list can be modified) */ 535 cb(opaque); 536 progress = true; 537 } 538 539 out: 540 qemu_event_set(&timer_list->timers_done_ev); 541 return progress; 542 } 543 544 bool qemu_clock_run_timers(QEMUClockType type) 545 { 546 return timerlist_run_timers(main_loop_tlg.tl[type]); 547 } 548 549 void timerlistgroup_init(QEMUTimerListGroup *tlg, 550 QEMUTimerListNotifyCB *cb, void *opaque) 551 { 552 QEMUClockType type; 553 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 554 tlg->tl[type] = timerlist_new(type, cb, opaque); 555 } 556 } 557 558 void timerlistgroup_deinit(QEMUTimerListGroup *tlg) 559 { 560 QEMUClockType type; 561 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 562 timerlist_free(tlg->tl[type]); 563 } 564 } 565 566 bool timerlistgroup_run_timers(QEMUTimerListGroup *tlg) 567 { 568 QEMUClockType type; 569 bool progress = false; 570 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 571 progress |= timerlist_run_timers(tlg->tl[type]); 572 } 573 return progress; 574 } 575 576 int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg) 577 { 578 int64_t deadline = -1; 579 QEMUClockType type; 580 bool play = replay_mode == REPLAY_MODE_PLAY; 581 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 582 if (qemu_clock_use_for_deadline(type)) { 583 if (!play || type == QEMU_CLOCK_REALTIME) { 584 deadline = qemu_soonest_timeout(deadline, 585 timerlist_deadline_ns(tlg->tl[type])); 586 } else { 587 /* Read clock from the replay file and 588 do not calculate the deadline, based on virtual clock. */ 589 qemu_clock_get_ns(type); 590 } 591 } 592 } 593 return deadline; 594 } 595 596 int64_t qemu_clock_get_ns(QEMUClockType type) 597 { 598 int64_t now, last; 599 QEMUClock *clock = qemu_clock_ptr(type); 600 601 switch (type) { 602 case QEMU_CLOCK_REALTIME: 603 return get_clock(); 604 default: 605 case QEMU_CLOCK_VIRTUAL: 606 if (use_icount) { 607 return cpu_get_icount(); 608 } else { 609 return cpu_get_clock(); 610 } 611 case QEMU_CLOCK_HOST: 612 now = REPLAY_CLOCK(REPLAY_CLOCK_HOST, get_clock_realtime()); 613 last = clock->last; 614 clock->last = now; 615 if (now < last || now > (last + get_max_clock_jump())) { 616 notifier_list_notify(&clock->reset_notifiers, &now); 617 } 618 return now; 619 case QEMU_CLOCK_VIRTUAL_RT: 620 return REPLAY_CLOCK(REPLAY_CLOCK_VIRTUAL_RT, cpu_get_clock()); 621 } 622 } 623 624 void qemu_clock_register_reset_notifier(QEMUClockType type, 625 Notifier *notifier) 626 { 627 QEMUClock *clock = qemu_clock_ptr(type); 628 notifier_list_add(&clock->reset_notifiers, notifier); 629 } 630 631 void qemu_clock_unregister_reset_notifier(QEMUClockType type, 632 Notifier *notifier) 633 { 634 notifier_remove(notifier); 635 } 636 637 void init_clocks(void) 638 { 639 QEMUClockType type; 640 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 641 qemu_clock_init(type); 642 } 643 644 #ifdef CONFIG_PRCTL_PR_SET_TIMERSLACK 645 prctl(PR_SET_TIMERSLACK, 1, 0, 0, 0); 646 #endif 647 } 648 649 uint64_t timer_expire_time_ns(QEMUTimer *ts) 650 { 651 return timer_pending(ts) ? ts->expire_time : -1; 652 } 653 654 bool qemu_clock_run_all_timers(void) 655 { 656 bool progress = false; 657 QEMUClockType type; 658 659 for (type = 0; type < QEMU_CLOCK_MAX; type++) { 660 progress |= qemu_clock_run_timers(type); 661 } 662 663 return progress; 664 } 665