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

Re: [Xen-devel] stale TLB contents?


  • To: George Dunlap <dunlapg@xxxxxxxxx>
  • From: Juergen Gross <juergen.gross@xxxxxxxxxxxxxx>
  • Date: Mon, 24 Jan 2011 14:23:39 +0100
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 24 Jan 2011 05:24:23 -0800
  • Domainkey-signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns; h=X-SBRSScore:X-IronPort-AV:Received:X-IronPort-AV: Received:Received:Message-ID:Date:From:Organization: User-Agent:MIME-Version:To:CC:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=G4SLaOYTEsxHeakxrevkTTpPBnPq7vYzxKn+VT5vDVV5/d/eSYpLe6Go vXe42IZkEiBqJrYBI8OIqGmF3lJDwND4aXbOsPPvNsT4azW331/Jat+uq op4o1Rr1hvvKdtolyMWGPsKy9u89oJ1y4Zm9+91aKQChZt+gLJxJIbB0W GMHHQPzg0oxdKd0oovLzTeArf4ekBOjuC7ZLYw5SrrXps6EdiVRng/dfH kDWvzym9ANHfTe8/B0FWQxBAhGV5l;
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

On 01/24/11 14:11, George Dunlap wrote:
If you're talking about just TLB  stuff (not changes to the EPT
tables), that should happen as a result of the context switch code
(nothing to do with EPT).  The code in question is here:

xen/arch/x86/domain.c:context_switch()
     if ( unlikely(!cpu_isset(cpu, dirty_mask)&&  !cpus_empty(dirty_mask)) )
     {
         /* Other cpus call __sync_local_execstate from flush ipi handler. */
         flush_tlb_mask(&dirty_mask);
     }

"Dirty  mask" means "where this vcpu has run"; since the vcpu in
question will have run on another pcpu, this should happen before the
vcpu is allowed to run on cpu 0 again.

Really?
I think you refer to this code in __context_switch():
    /*
     * Mark this CPU in next domain's dirty cpumasks before calling
     * ctxt_switch_to(). This avoids a race on things like EPT flushing,
     * which is synchronised on that function.
     */
    if ( p->domain != n->domain )
        cpu_set(cpu, n->domain->domain_dirty_cpumask);
    cpu_set(cpu, n->vcpu_dirty_cpumask);

This should set the dirty bit for the physical cpu on which the vcpu is just
about to be started.

But the dirty bit of the previous vcpu is cleared a little bit later:
    if ( p->domain != n->domain )
        cpu_clear(cpu, p->domain->domain_dirty_cpumask);
    cpu_clear(cpu, p->vcpu_dirty_cpumask);

Couldn't this leave the dirty mask to be empty again?


Juergen

--
Juergen Gross                 Principal Developer Operating Systems
TSP ES&S SWE OS6                       Telephone: +49 (0) 89 3222 2967
Fujitsu Technology Solutions              e-mail: juergen.gross@xxxxxxxxxxxxxx
Domagkstr. 28                           Internet: ts.fujitsu.com
D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.html

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.