On 2011-08-22 16:00, Paolo Bonzini wrote:
> On 08/22/2011 03:50 PM, Peter Maydell wrote:
>>>  Enabling the I/O thread by default seems like an important part of 
>>> declaring
>>>  1.0.  Besides allowing true SMP support with KVM, the I/O thread means 
>>> that the
>>>  TCG VCPU doesn't have to multiplex itself with the I/O dispatch routines 
>>> which
>>>  currently requires a (racey) signal based alarm system.
>>
>> Even with iothread it's still signal based (and still racy) -- the only way
>> to get a thread currently executing TCG code to stop doing so is to send it
>> a signal.
> 
> It's signal-based, but I'm not sure it's racy when single-threaded.  This:
> 
>                  /* ... tb_add_jump ... */
>                  barrier();
>                  if (likely(!env->exit_request)) {
> 
> in cpu_exec, vs. this in the signal handler:
> 
>       void cpu_exit(CPUState *env)
>       {
>           env->exit_request = 1;
>           cpu_unlink_tb(env);
>       }
> 
> together will make sure that only a single basic block is executed after 
> an exit request.
> 
> The problems with user-level emulation arise from multiple threads 
> concurrently execute the tb_add_jump or cpu_unlink_tb operations.  My 
> knowledge of user-level emulation is approximately zero, but I think it 
> should be possible to make the race outcome predictable.  That's because 
> (1) cpu_unlink_tb is idempotent; (2) you don't really need to do 
> anything in cpu_unlink_tb if the other thread is running tb_add_jump, 
> because setting env->exit_request will avoid entering the CPU.

Current multi-threaded user mode emulation is just (too) optimistically
designed. But once VCPUs start to use their own TBs and/or TB chains
(maybe it can be beneficial to decouple the translation buffer from the
linking), this problem should go away.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

Reply via email to