|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] ARM: cache coherence problem in guestcopy.c
On Tue, 2013-06-18 at 11:22 +0000, Jaeyong Yoo wrote:
> >
> > So I think we probably actually need the dcache flush in domain_map_page
> > at the "/* Commandeer this 2MB slot */" point. In that context I don't
> > think we can avoid flushing anything other than the complete 2MB
> > mapping. Does this work for you too?
>
> I am not sure that this would work. If we map_domain_page and
> unmap_domain_page
> with the same mfn over and over again while the ref count is not zero (say
> 5),
> then flush is not called. And, I think we should call flush according to the
> reason below:
>
> >
> > The laziness of the remappings makes me wonder though. Do you know if
> > the slot is reused between step #2 and #3? Otherwise I'd expect us to
> > reuse the existing mapping with the cache intact. The caches are PIPT so
> > I wouldn't expect the address aliasing to be an issue. Unless the
> > mapping is reused for something else I'm not too sure where the cache
> > pollution is coming from.
>
> Let me try explain in more detail.
> We can consider the DomU as a producer (writing values to mfn) and
> hypervisor as a consumer (reading values from mfn). While DomU is
> invoking multiple hypercalls, it reuses the same mfn and the same
> mapping at xen page table.
>
> (consumer) (producer)
> xen DomU
> \ / (writing path)
> (cache) /
> \ /
> (reading path) \ /
> _______________________________________
> | mfn | (physical memory)
> ---------------------------------------
>
> If we see the above figure, xen "may" keep reading the cached value while
> DomU is writing different values to mfn.
But all of the caches on this platform are PIPT (right?) so isn't it
actually:
(consumer) (producer)
xen DomU
\ / (writing path)
\ /
\ /
(reading path) \ /
\ /
(cache)
||
||
\/
_______________________________________
| mfn | (physical memory)
---------------------------------------
Or are you saying that the writing path is uncached?
I was chatting with Tim and he suggested that the issue might be the
ReOrder Buffer, which is virtually tagged. In that case a DMB ought to
be sufficient and not a full cache flush, we think.
We were also speculating that we probably want some DMBs in
context_switch_{from,to} as well as at return_to_guest.
> Here goes my observation where
> cache pollution happen:
>
> The pollution actually happens in second line of cache.
> DomU side hypercall param local address is 0xc785fe38 (cache line size =
> 0x40B),
> and the size of hypercall param is 24B. So the hypercall param lays out in two
> cache lines. When hypervisor is reading the hypercall param, it reads the
> first
> 8 bytes correctly (means the first cache line is flushed) and the other 16
> bytes
> are polluted (means the second cache line is not flushed).
> Honestly, I'm not sure why the first cache line is flushed and the second is
> not.
> I think we can also cache_line_align the hypercall param struct, but that is
> only
> when the sizes of all hypercall params are smaller than cache line size.
>
> I hope the alignment of the figure is not broken :)
>
> Best,
> Jaeyong
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |