|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/2] VMX: fix VMCS race on context-switch paths
On Tue, 2017-11-07 at 14:24 +0000, Igor Druzhinin wrote:
> Perhaps I should improve my diagram:
>
> pCPU1: vCPUx of domain X -> migrate to pCPU2 -> switch to idle
> context
> -> RCU callbacks -> vcpu_destroy(vCPUy of domain Y) ->
> vmx_vcpu_disable_pml() -> vmx_vmcs_clear() (VMCS is trashed at this
> point on pCPU1)
>
> pCPU2: context switch into vCPUx -> vCPUx.is_running = 1 -> TLB flush
> from context switch to clean TLB on pCPU1
>
Sorry, there must be something I'm missing (or misunderstanding).
What is this code that checks is_running and triggers the TLB flush?
But, more important, how come you are context switching to something
that has is_running == 1 ? That should not be possible.
In fact, from a scheduling code perspective, since you're mentioning
vCPU migration between pCPUs:
pCPU1
.
.
//vCPUx->is_running is 1
vCPUx->pause_flags |= _VPF_migrating
schedule()
idle->is_running = 1
//vCPUx->pause_flags != 0 ==> it's blocked and can't be scheduled!
context_switch( prev=vCPUx, next=idle )
set_current( idle )
//let's be lazy! don't call __context_switch()
context_saved( vCPUx )
vCPUx->is_running = 0
SCHED_OP( context_saved ) //NULL for Credit1
vcpu_migrate( vCPUx )
if ( vCPUx->is_running || !test_and_clear(_VPF_migrating) )
return;
vcpu_wake( vCPUx )
.
.
.
So, basically, the scheduler on pCPU2 can decide to pick vCPUx from the
runqueue and switch to it _only_ if it has gone through vcpu_wake(),
which must actually have woken up it, which happens if _VPF_migrating
has been cleared, which means is_running was 0 already.
Dario
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioliAttachment:
signature.asc _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |