|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 19/38] arm/p2m: Add HVMOP_altp2m_switch_p2m
Hi Julien,
On 09/14/2016 12:57 PM, Julien Grall wrote:
>
>
> On 13/09/16 14:00, Sergej Proskurin wrote:
>> Hi Julien,
>
> Hello Sergej,
>
>>
>> On 09/12/2016 10:47 AM, Julien Grall wrote:
>>> Hello Sergej,
>>>
>>> On 16/08/2016 23:16, Sergej Proskurin wrote:
>>>> Signed-off-by: Sergej Proskurin <proskurin@xxxxxxxxxxxxx>
>>>> ---
>>>> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>>>> Cc: Julien Grall <julien.grall@xxxxxxx>
>>>> ---
>>>> v3: Extended the function "altp2m_switch_domain_altp2m_by_id" so
>>>> that if
>>>> the guest domain indirectly calles this function, the current
>>>> vcpu also
>>>> changes the altp2m view without performing an explicit context
>>>> switch.
>>>>
>>>> Exchanged the check "altp2m_vttbr[idx] == INVALID_VTTBR" for
>>>> "altp2m_p2m[idx] == NULL" in "altp2m_switch_domain_altp2m_by_id".
>>>> ---
>>>> xen/arch/arm/altp2m.c | 48
>>>> ++++++++++++++++++++++++++++++++++++++++++++
>>>> xen/arch/arm/hvm.c | 2 +-
>>>> xen/include/asm-arm/altp2m.h | 4 ++++
>>>> 3 files changed, 53 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/xen/arch/arm/altp2m.c b/xen/arch/arm/altp2m.c
>>>> index c14ab0b..ba345b9 100644
>>>> --- a/xen/arch/arm/altp2m.c
>>>> +++ b/xen/arch/arm/altp2m.c
>>>> @@ -32,6 +32,54 @@ struct p2m_domain *altp2m_get_altp2m(struct vcpu
>>>> *v)
>>>> return v->domain->arch.altp2m_p2m[index];
>>>> }
>>>>
>>>> +int altp2m_switch_domain_altp2m_by_id(struct domain *d, unsigned int
>>>> idx)
>>>> +{
>>>> + struct vcpu *v;
>>>> + int rc = -EINVAL;
>>>> +
>>>> + if ( idx >= MAX_ALTP2M )
>>>> + return rc;
>>>> +
>>>> + domain_pause_except_self(d);
>>>> +
>>>> + altp2m_lock(d);
>>>> +
>>>> + if ( d->arch.altp2m_p2m[idx] != NULL )
>>>> + {
>>>> + for_each_vcpu( d, v )
>>>> + if ( idx != altp2m_vcpu(v).p2midx )
>>>
>>> Could you invert the condition to avoid another layer of nested if?
>>>
>>
>> Did you mean checking for (idx == altp2m_vcpu(v).p2midx) and continue
>> the loop if the condition should be satisfied? If so, then sure thing :)
>
> Correct.
>
Ok, done.
>>
>>>> + {
>>>> + atomic_dec(&altp2m_get_altp2m(v)->active_vcpus);
>>>> + altp2m_vcpu(v).p2midx = idx;
>>>> + atomic_inc(&altp2m_get_altp2m(v)->active_vcpus);
>>>> +
>>>> + /*
>>>> + * In case it is the guest domain, which indirectly
>>>> called this
>>>> + * function, the current vcpu will not switch its
>>>> context
>>>> + * within the function "p2m_restore_state". That is,
>>>> changing
>>>> + * the altp2m_vcpu(v).p2midx will not lead to the
>>>> requested
>>>> + * altp2m switch on that specific vcpu. To achieve
>>>> the desired
>>>> + * behavior, we write to VTTBR_EL2 directly.
>>>> + */
>>>> + if ( v->domain == d && v == current )
>>>
>>> v == current is enough.
>>>
>>
>> Ok.
>>
>>>> + {
>>>> + struct p2m_domain *ap2m =
>>>> d->arch.altp2m_p2m[idx];
>>>> +
>>>> + WRITE_SYSREG64(ap2m->vttbr, VTTBR_EL2);
>>>> + isb();
>>>
>>> I don't like the open-coding of VTTBR_EL2. I would much prefer a
>>> separate helper to update it.
>>>
>>
>> Sure, I can introduce an UPDATE_VTTBR macro (including the isb call) in
>> p2m.h and adjust the remaining writes to VTTBR_EL2 in p2m.c as well. I
>> hope, I understood you correctly.
>
> Actually, I was concerned about having the following sequence spread:
> VTTBR_EL2
> isb
>
> However, the isb is not necessary here because VTTBR_EL2 will not be
> used until we return to the guest.
>
> So I would be fine to keep WRITE_SYSREG64(ap2m->vttbr, VTTBR_EL2);
I will change that, thank you.
Cheers,
~Sergej
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |