|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V6 3/4] x86/mm: allocate logdirty_ranges for altp2ms
On 11/15/18 5:52 PM, George Dunlap wrote:
>
>
>> On Nov 14, 2018, at 8:40 PM, Razvan Cojocaru <rcojocaru@xxxxxxxxxxxxxxx>
>> wrote:
>>
>> This patch is a pre-requisite for the one fixing VGA logdirty
>> freezes when using altp2m. It only concerns itself with the
>> ranges allocation / deallocation / initialization part. While
>> touching the code, I've switched global_logdirty from bool_t
>> to bool.
>>
>> P2m_reset_altp2m() has been refactored to reduce code
>> repetition, and it now takes the p2m lock. Similar
>> refactoring has been done with p2m_activate_altp2m().
>
> Thanks! I think this is almost there. I have a couple of comments about the
> code below; so since we have to do another round, let me comment on the
> changelog.
>
> It doesn’t make much sense to say you’re “refactoring” a function that you
> are just now introducing in this patch.
Right, the term doesn't apply to p2m_activate_altp2m() - I got carried
away with p2m_reset_altp2m(). :)
> I think I’d say something more like this:
>
> ---
> For now, only do allocation/deallocation; keeping them in sync will be done
> in subsequent patches.
>
> Logdirty synchronization will only be done for active altp2ms; so allocate
> logdirty rangesets (copying the host logdirty rangeset) when an altp2m is
> activated, and free it when deactivated.
>
> Write a helper function to do altp2m activiation (appropriately handling
> failures). Also, refactor p2m_reset_altp2m() so that it can be used to
> remove redundant codepaths, fixing the locking while we’re at it.
>
> While we’re here, switch global_logdirty from bool_t to bool.
> ---
Thanks, I'll use the new description.
>> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
>> index 418ff85..abdf443 100644
>> --- a/xen/arch/x86/mm/p2m.c
>> +++ b/xen/arch/x86/mm/p2m.c
>> @@ -2282,6 +2282,34 @@ bool_t p2m_altp2m_lazy_copy(struct vcpu *v, paddr_t
>> gpa,
>> return 1;
>> }
>>
>> +static void p2m_reset_altp2m(struct domain *d, unsigned int idx,
>> + bool reset_remapped, bool free_logdirty_ranges)
>
> As Jan says, passing in (…true, false) makes it more difficult to follow the
> code and see what’s going on. You could use a ‘flags’ structure, as he
> mentions; or alternately, you could pass in an argument that was either
> DEACTIVATE or RESET, and then use that to decide which things to do.
Will do.
>> +{
>> + struct p2m_domain *p2m;
>> +
>> + ASSERT(idx < MAX_ALTP2M);
>> + p2m = d->arch.altp2m_p2m[idx];
>> +
>> + p2m_lock(p2m);
>> +
>> + p2m_flush_table_locked(p2m);
>> + /* Uninit and reinit ept to force TLB shootdown */
>> +
>> + if ( free_logdirty_ranges )
>> + p2m_free_logdirty(p2m);
>> +
>> + ept_p2m_uninit(p2m);
>> + ept_p2m_init(p2m);
>
> Nit: The comment about uninit/reinit should be just before the uninit/reinit.
> :-)
Will move it.
>> +
>> + if ( reset_remapped )
>> + {
>> + p2m->min_remapped_gfn = gfn_x(INVALID_GFN);
>> + p2m->max_remapped_gfn = 0;
>> + }
>
> I don’t think there’s a need to do this conditionally. In fact, the only
> reason it’s correct *not* to do this for the other two cases is because in
> those cases the p2m will go through p2m_init_altp2m_ept() before being used
> again. Resetting these is redundant, but harmless, and not worth an extra
> function argument and conditional to avoid.
I'll remove the if.
>> +static int p2m_init_altp2m_logdirty(struct p2m_domain *p2m)
>> +{
>> + struct p2m_domain *hostp2m = p2m_get_hostp2m(p2m->domain);
>> + int rc = p2m_init_logdirty(p2m);
>> +
>> + if ( rc )
>> + return rc;
>> +
>> + /* The following is really just a rangeset copy. */
>> + return rangeset_merge(p2m->logdirty_ranges, hostp2m->logdirty_ranges);
>> +}
>> +
>> +static int p2m_activate_altp2m(struct domain *d, unsigned int idx)
>> +{
>> + int rc;
>> +
>> + ASSERT(idx < MAX_ALTP2M);
>> + rc = p2m_init_altp2m_logdirty(d->arch.altp2m_p2m[idx]);
>> +
>> + if ( rc )
>> + return rc;
>> +
>> + p2m_init_altp2m_ept(d, idx);
>
> Is there any reason to make these separate functions? I had in mind a single
> p2m_activate_altp2m() function which would do all three things
> (p2m_init_logdirty, rangeset_merge, and init_altp2m_ept).
Nope, no reason, in fact I did think about just that but wasn't sure it
wasn't deviating from what I thought was requested. I'll make that code
a single function.
> Also, I realize it’s _probably_ not necessary to grab the lock here for the
> p2m in question (since it shouldn’t be in use, because altp2m_eptp[] is
> INVALID_MFN); but since it’s not on the hot path, it seems like we might as
> well grab it just to be safe.
>
> Everything else looks good, thanks.
Thanks for the review!
Razvan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |