|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 04/18] arm/altp2m: Add altp2m init/teardown routines.
On 07/04/2016 08:30 PM, Julien Grall wrote:
>
>
> On 04/07/16 17:40, Sergej Proskurin wrote:
>> On 07/04/2016 05:17 PM, Julien Grall wrote:
>>> On 04/07/16 12:45, Sergej Proskurin wrote:
>
> [...]
>
>>>> +static struct p2m_domain *p2m_init_one(struct domain *d)
>>>> +{
>>>> + struct p2m_domain *p2m = xzalloc(struct p2m_domain);
>>>> +
>>>> + if ( !p2m )
>>>> + return NULL;
>>>> +
>>>> + if ( p2m_initialise(d, p2m) )
>>>> + goto free_p2m;
>>>> +
>>>> + return p2m;
>>>> +
>>>> +free_p2m:
>>>> + xfree(p2m);
>>>> + return NULL;
>>>> +}
>>>> +
>>>> +static void p2m_teardown_hostp2m(struct domain *d)
>>>
>>> Why does p2m_teardown_hostp2m not use p2m_teardown_one to teardown the
>>> p2m? Assuming xfree(p2m) is move out of the function.
>>>
>>
>> I believe you mean p2m_free_one: The p2m_teardown_hostp2m might use the
>> same function but would require the call p2m_free_vmid(d) to be called
>> outside of p2m_free_one as well. This would require another acquisition
>> of the p2m->lock. Just to be sure, I did not want to split the teardown
>> process into two atomic executions. If you believe that it is safe to
>> do, I will gladly change the code and re-use the code from p2m_free_one
>> in p2m_teardown_hostp2m.
>
> Looking at the caller of p2m_teardown, I don't think the lock is
> necessary because nobody can use the P2M anymore when this function is
> called.
>
> [...]
>
Ok. I will adapt the code as discussed. Thank you.
>>>> + {
>>>> + mfn = _mfn(page_to_mfn(pg));
>>>> + clear_domain_page(mfn);
>>>> + free_domheap_page(pg);
>>>> + }
>>>>
>>>> + for ( i = 0; i < P2M_ROOT_PAGES; i++ )
>>>> + {
>>>> + mfn = _mfn(page_to_mfn(p2m->root) + i);
>>>> + clear_domain_page(mfn);
>>>> + }
>>>> + free_domheap_pages(p2m->root, P2M_ROOT_ORDER);
>>>> p2m->root = NULL;
>>>>
>>>> p2m_free_vmid(d);
>>>> @@ -1422,7 +1506,7 @@ void p2m_teardown(struct domain *d)
>>>> spin_unlock(&p2m->lock);
>>>> }
>>>>
>>>> -int p2m_init(struct domain *d)
>>>> +static int p2m_init_hostp2m(struct domain *d)
>>>
>>> Why does p2m_init_hostp2m not use p2m_init_one to initialize the p2m?
>>>
>>
>> We dynamically allocate altp2ms. Also, the initialization of both the
>> altp2ms and hostp2m slightly differs (see VMID allocation). I could
>> rewrite the initialization function to be used for both, the hostp2m and
>> altp2m structs. Especially, if you say that we do not associate domains
>> with VMIDs (see your upper question).
>
> I always prefer to see the code rewritten rather than duplicating code.
> The latter makes harder to fix bug when it is spread in multiple place.
>
> [...]
>
Makes sense. Especially that we have now discussed the fact that we
really need to allocate a new VMID per altp2m view. I will rewrite the
functionality and remove the duplicated code. Thank you.
>>>> + uint64_t altp2m_vttbr[MAX_ALTP2M];
>>>> } __cacheline_aligned;
>>>>
>>>> struct arch_vcpu
>>>> diff --git a/xen/include/asm-arm/hvm/hvm.h
>>>> b/xen/include/asm-arm/hvm/hvm.h
>>>> index 96c455c..28d5298 100644
>>>> --- a/xen/include/asm-arm/hvm/hvm.h
>>>> +++ b/xen/include/asm-arm/hvm/hvm.h
>>>> @@ -19,6 +19,18 @@
>>>> #ifndef __ASM_ARM_HVM_HVM_H__
>>>> #define __ASM_ARM_HVM_HVM_H__
>>>>
>>>> +struct vttbr_data {
>>>
>>> This structure should not be part of hvm.h but processor.h. Also, I
>>> would rename it to simply vttbr.
>>>
>>
>> Ok, I will move it. The struct was named this way to be the counterpart
>> to struct ept_data. Do you still think, we should introduce naming
>> differences for basically the same register at this point?
>
> Yes, we are talking about two distinct architectures. If you look at
> ept_data, it stores more than the page table register. Hence the name.
>
> [...]
>
Ok.
>>>> +
>>>> #define paddr_bits PADDR_BITS
>>>>
>>>> /* Holds the bit size of IPAs in p2m tables. */
>>>> @@ -17,6 +20,11 @@ struct domain;
>>>>
>>>> extern void memory_type_changed(struct domain *);
>>>>
>>>> +typedef enum {
>>>> + p2m_host,
>>>> + p2m_alternate,
>>>> +} p2m_class_t;
>>>> +
>>>> /* Per-p2m-table state */
>>>> struct p2m_domain {
>>>> /* Lock that protects updates to the p2m */
>>>> @@ -66,6 +74,18 @@ struct p2m_domain {
>>>> /* Radix tree to store the p2m_access_t settings as the pte's
>>>> don't have
>>>> * enough available bits to store this information. */
>>>> struct radix_tree_root mem_access_settings;
>>>> +
>>>> + /* Alternate p2m: count of vcpu's currently using this p2m. */
>>>> + atomic_t active_vcpus;
>>>> +
>>>> + /* Choose between: host/alternate */
>>>> + p2m_class_t p2m_class;
>>>
>>> Is there any reason to have this field? It is set but never used.
>>>
>>
>> Actually it is used by p2m_is_altp2m and p2m_is_hostp2m (e.g. see assert
>> in p2m_flush_table).
>
> Right. Sorry, I didn't spot this call.
>
It's all good: Thank you for the great review :)
> Regards,
>
Best regards,
Sergej
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |