75bbe5e5ec
vCPU execution should be suspended when new BH is scheduled. This is needed to avoid guest timeouts caused by the long cycles of the execution. In replay mode execution may hang when vCPU sleeps and block event comes to the queue. This patch adds notification which wakes up vCPU or interrupts execution of guest code. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> -- v2: changed first_cpu to current_cpu (suggested by Richard Henderson) v4: moved vCPU notification to aio_bh_enqueue (suggested by Paolo Bonzini) Message-Id: <165364837317.688121.17680519919871405281.stgit@pasha-ThinkPad-X280> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
/*
|
|
* CPU timers state API
|
|
*
|
|
* Copyright 2020 SUSE LLC
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
#ifndef SYSEMU_CPU_TIMERS_H
|
|
#define SYSEMU_CPU_TIMERS_H
|
|
|
|
#include "qemu/timer.h"
|
|
|
|
/* init the whole cpu timers API, including icount, ticks, and cpu_throttle */
|
|
void cpu_timers_init(void);
|
|
|
|
/* icount - Instruction Counter API */
|
|
|
|
/*
|
|
* icount enablement state:
|
|
*
|
|
* 0 = Disabled - Do not count executed instructions.
|
|
* 1 = Enabled - Fixed conversion of insn to ns via "shift" option
|
|
* 2 = Enabled - Runtime adaptive algorithm to compute shift
|
|
*/
|
|
#ifdef CONFIG_TCG
|
|
extern int use_icount;
|
|
#define icount_enabled() (use_icount)
|
|
#else
|
|
#define icount_enabled() 0
|
|
#endif
|
|
|
|
/*
|
|
* Update the icount with the executed instructions. Called by
|
|
* cpus-tcg vCPU thread so the main-loop can see time has moved forward.
|
|
*/
|
|
void icount_update(CPUState *cpu);
|
|
|
|
/* get raw icount value */
|
|
int64_t icount_get_raw(void);
|
|
|
|
/* return the virtual CPU time in ns, based on the instruction counter. */
|
|
int64_t icount_get(void);
|
|
/*
|
|
* convert an instruction counter value to ns, based on the icount shift.
|
|
* This shift is set as a fixed value with the icount "shift" option
|
|
* (precise mode), or it is constantly approximated and corrected at
|
|
* runtime in adaptive mode.
|
|
*/
|
|
int64_t icount_to_ns(int64_t icount);
|
|
|
|
/* configure the icount options, including "shift" */
|
|
void icount_configure(QemuOpts *opts, Error **errp);
|
|
|
|
/* used by tcg vcpu thread to calc icount budget */
|
|
int64_t icount_round(int64_t count);
|
|
|
|
/* if the CPUs are idle, start accounting real time to virtual clock. */
|
|
void icount_start_warp_timer(void);
|
|
void icount_account_warp_timer(void);
|
|
void icount_notify_exit(void);
|
|
|
|
/*
|
|
* CPU Ticks and Clock
|
|
*/
|
|
|
|
/* Caller must hold BQL */
|
|
void cpu_enable_ticks(void);
|
|
/* Caller must hold BQL */
|
|
void cpu_disable_ticks(void);
|
|
|
|
/*
|
|
* return the time elapsed in VM between vm_start and vm_stop.
|
|
* cpu_get_ticks() uses units of the host CPU cycle counter.
|
|
*/
|
|
int64_t cpu_get_ticks(void);
|
|
|
|
/*
|
|
* Returns the monotonic time elapsed in VM, i.e.,
|
|
* the time between vm_start and vm_stop
|
|
*/
|
|
int64_t cpu_get_clock(void);
|
|
|
|
void qemu_timer_notify_cb(void *opaque, QEMUClockType type);
|
|
|
|
/* get the VIRTUAL clock and VM elapsed ticks via the cpus accel interface */
|
|
int64_t cpus_get_virtual_clock(void);
|
|
int64_t cpus_get_elapsed_ticks(void);
|
|
|
|
#endif /* SYSEMU_CPU_TIMERS_H */
|