|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/4] x86/mm: Shadow and p2m changes for PV mem_access
>>> On 01.05.14 at 00:20, <aravindp@xxxxxxxxx> wrote:
>>I think implying _n to mean "default" is at least a latent bug anyway (since
>>that
>>precludes setting that type). And _if_ "get" really does any modification,
>>that
>>minimally would require a big comment.
>
> For PV domains access_n is precluded.
>
>>Furthermore, with it being possible for the default type to change, the net
>>effect might easily be different between setting the default type at
>>initialization time or when the first lookup happens.
>
> I am not sure that I follow your concern here. Setting default access does
> not mean that the access table gets cleared. So if a particular MFN entry's
> access value changed and the default value was changed, then the MFN should
> retain the access value it was changed to and not the default value. The new
> default value will only be returned for MFNs for which set_entry was not
> called on and I think that is correct.
It might still be a difference when the designated access gets effected:
I would assume that a request for the default type should obtain the
default set at the time of the request, not the one in effects at the time
the entry gets first used.
>>>>> +int p2m_mem_access_init(struct p2m_domain *p2m) {
>>>>> + struct domain *d = p2m->domain;
>>>>> + mfn_t *access_lookup_table;
>>>>> + uint32_t nr_access_table_pages;
>>>>> + uint32_t ctr;
>>>>> +
>>>>> + nr_access_table_pages = get_domain_nr_access_table_pages(d);
>>>>> + access_lookup_table = xzalloc_array(mfn_t,
>>>>> + nr_access_table_pages);
>>>>
>>>>This surely is going to be an order > 0 allocation, and you even risk
>>>>it being an order > MAX_ORDER one. The former is disallowed at runtime
>>>>by convention/agreement, the latter is an outright bug.
>>>
>>> Sorry, I was not aware of the convention. What should I be doing here
>>> instead?
>>
>>Especially with the above note about GFN space being effectively unbounded
>>for PV guests, you need to find a different data structure to represent the
>>information you need. Perhaps something similar to what log-dirty mode
>>uses, except that you would need more levels in the extreme case, and hence
>>it might be worthwhile making the actually used number of levels dynamic?
>
> I am a little confused here. In my initial discussions about this I was told
> that PV guests have bounded and contiguous memory. This is why I took the
> approach of an indexable array.
>
> " OTOH, all you need is a byte per pfn, and the great thing is that in PV
> domains, the physmap is bounded and continuous. Unlike HVM and its PCI holes,
> etc, which demand the sparse tree structure. So you can allocate an easily
> indexable array, notwithstanding super page concerns (I think/hope)."
>
> http://lists.xenproject.org/archives/html/xen-devel/2013-11/msg03860.html
>
> Did I misunderstand something here?
What he stated is the situation at domain start. Due to ballooning and
other kinds of manipulations (as said, pv-ops re-arranges things to
avoid having memory [PFNs] overlap MMIO [MFNs]) this may change
immediately after the domain started.
And even if it was a plain contiguous linear address space, you still
wouldn't be permitted to allocate a flat one-byte-per-page array, as
for large domains this might still overflow the MAX_ORDER allocation
constraint.
>>>>> @@ -2443,7 +2443,8 @@ int sh_remove_all_mappings(struct vcpu *v,
>>>>mfn_t gmfn)
>>>>> if ( !(shadow_mode_external(v->domain)
>>>>> && (page->count_info & PGC_count_mask) <= 3
>>>>> && ((page->u.inuse.type_info & PGT_count_mask)
>>>>> - == !!is_xen_heap_page(page))) )
>>>>> + == !!is_xen_heap_page(page)))
>>>>> + && !(shadow_mode_mem_access(v->domain)) )
>>>>
>>>>You're breaking indentation, there are pointless parentheses again,
>>>>but most importantly - why?
>>>
>>> Sorry, I meant to ask a question about this in my patch message and
>>> mark this as a workaround. I am seeing the message on all
>>> sh_remove_all_mappings() and I was not able to figure out why this was
>>> happening. I just added this as a work around. I was hoping you or Tim
>>would shed more light on this.
>>
>>I'm afraid that without detail on which pages the triggers on, and you at
> least
>>having spent some time finding out where the stray/extra references may be
>>coming from it's going to be hard to help.
>
> Here are some of the prints I saw. I typically saw it for every set_entry()
> call.
There are some rather large usage counts among the examples you
gave - these surely need understanding rather than blindly ignoring.
>>>>> +/* Number of access table pages for a PV domain */ #define
>>>>> +get_domain_nr_access_table_pages(d) \
>>>>> + DIV_ROUND_UP(P2M_ACCESS_SIZE * (d->tot_pages - 1),
>>>>> +PAGE_SIZE)
>>>>
>>>>And once again. I wonder whether this code was tested on a suitably
>>>>big pv-ops PV guest.
>>>
>>> The largest PV domain I tried this with was 28GB.
>>
>>Which ought to have had GFNs larger than ->tot_pages, so I wonder how this
>>worked.
>
> It would have had MFNs larger than tot_pages. I don't understand how it
> would have had GFNs larger than tot_pages.
Once again, because it re-arranges its PFN space to avoid MMIO holes
(plus - applicable to non-pv-ops too - it may be started ballooned or
balloon out memory subsequently).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |