qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] The details of round robin of multi-vcpu in TCG mode


From: li guang
Subject: Re: [Qemu-devel] The details of round robin of multi-vcpu in TCG mode
Date: Tue, 16 Apr 2013 10:53:58 +0800

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 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]