[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] xen/arm: p2m: Correctly flush TLB in create_p2m_entries
On 01/13/2014 05:10 PM, Ian Campbell wrote: > Hrm, our TLB flush discipline is horribly confused isn't it... > > On Thu, 2014-01-09 at 16:34 +0000, Julien Grall wrote: >> The p2m is shared between VCPUs for each domain. Currently Xen only flush >> TLB on the local PCPU. This could result to mismatch between the mapping in >> the >> p2m and TLBs. >> >> Flush TLB entries used by this domain on every PCPU. The flush can also be >> moved out of the loop because: >> - ALLOCATE: only called for dom0 RAM allocation, so the flush is never >> called > > OK. > > An ASSERT(!third[third_table_offset(addr)].p2m.valid) might be > worthwhile if that is the case. Will add it. > > (I'm not sure why ALLOCATE can't be replaced by allocation followed by > an INSERT, it's seems very special case) > >> - INSERT: if valid = 1 that would means with have replaced a >> page that already belongs to the domain. A VCPU can write on the wrong >> page. >> This can append for dom0 with the 1:1 mapping because the mapping is not >> removed from the p2m. > > "append"? Do you mean "happen"? I meant "happen". > > In the non-dom0 1:1 case eventually the page will be freed, I guess by a > subsequent put_page elsewhere -- do they all contain the correct > flushing? Or do we just leak? As for foreign mapping the INSERT function should be hardened. We don't have a protection against the guest is replacing a current valid mapping. > What happens if the page being replaced is foreign? Do we leak a > reference to another domain's page? (This is probably a separate issue > though, I suspect the put_page needs pulling out of the switch(op) > statement). Right we leak a reference to another domain. > >> - REMOVE: except for grant-table (replace_grant_host_mapping), > > What about this case? What makes it safe? As specified a bit later, I can't say if it's safe or not. I was unabled to find a proof in the code. >> each >> call to guest_physmap_remove_page are protected by the callers via a >> get_page -> .... -> guest_physmap_remove_page -> ... -> put_page. So >> the page can't be allocated for another domain until the last put_page. > > I have confirmed this is the case for guest_remove_page, memory_exchange > and XENMEM_remove_from_physmap. > > There is one case I saw where this isn't true which is gnttab_transfer, > AFAICT that will fail because steal_page unconditionally returns an > error on arm. There is also a flush_tlb_mask there, FWIW. hmmm... I forgot this one... why don't we have a {get,put}_page in this function? > >> - RELINQUISH : the domain is not running anymore so we don't care... > > At some point this page will be reused, as will the VMID, where/how is > it ensured that a flush will happen before that point? When the VMID is reused, Xen will flush everything TLBs associated to this VMID (see p2m_alloc_table); -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |