You can find the chance of exit main loop by every calling of cpu_loop_exit() in cpu_exec().
在 2013-04-16二的 09:51 +0800,puckbee写道: > Hi there: > > Sorry to post this problem a second time, for I thought maybe the > question is not descripted clearly. > > I'm studying the execution details of multi-vcpu in TCG mode. > > The vcpus in TCG mode are executed one by one in a sequencial way, > according to some articles about Qemu. > > I read the function [tcg_exec_all] in Qemu 1.3.0 as bellow, but > the implementation is not as expected. > > [tcg_exec_all] will finally call [cpu_exec] to excute a loop to > excute the TBs in code cache > > So,how does these functions control the running time of each VCPU? > > That is,when will the execution of one VCPU return, in order to > execute the next_cpu in the loop of [tcg_exec_all]. > > Using alarm timer or other methonds? > > static void tcg_exec_all(void) > { > int r; > > /* Account partial waits to the vm_clock. */ > qemu_clock_warp(vm_clock); > > if (next_cpu == NULL) { > next_cpu = first_cpu; > } > for (; next_cpu != NULL && ! > exit_request; next_cpu = next_cpu->next_cpu) { > CPUArchState *env = next_cpu; > CPUState *cpu = ENV_GET_CPU(env); > > qemu_clock_enable(vm_clock, > (env->singlestep_enabled & > SSTEP_NOTIMER) == 0); > > if (cpu_can_run(cpu)) { > r = tcg_cpu_exec(env); > if (r == EXCP_DEBUG) { > cpu_handle_guest_debug(env); > break; > } > } else if (cpu->stop || cpu->stopped) { > break; > } > } > exit_request = 0; > } > > Yours > Puck