|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] x86/mm: Suppresses vm_events caused by page-walks
On 03/01/2018 12:09 PM, Jan Beulich wrote:
>>>> On 01.03.18 at 11:00, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
>> On 02/28/2018 03:56 PM, Jan Beulich wrote:
>>>>>> On 28.02.18 at 14:41, <JBeulich@xxxxxxxx> wrote:
>>>>>>> On 28.02.18 at 14:25, <aisaila@xxxxxxxxxxxxxxx> wrote:
>>>>> --- a/xen/arch/x86/mm/mem_access.c
>>>>> +++ b/xen/arch/x86/mm/mem_access.c
>>>>> @@ -137,6 +137,23 @@ bool p2m_mem_access_emulate_check(struct vcpu *v,
>>>>> return violation;
>>>>> }
>>>>>
>>>>> +static void p2m_set_ad_bits(struct vcpu *v, paddr_t ga)
>>>>> +{
>>>>> + struct hvm_hw_cpu ctxt;
>>>>> + uint32_t pfec = 0;
>>>>> +
>>>>> + hvm_funcs.save_cpu_ctxt(v, &ctxt);
>>>>> +
>>>>> + if ( guest_cpu_user_regs()->eip == v->arch.pg_dirty.eip
>>>>> + && ga == v->arch.pg_dirty.gla )
>>>>> + pfec = PFEC_write_access;
>>>>> +
>>>>> + paging_ga_to_gfn_cr3(v, ctxt.cr3, ga, &pfec, NULL);
>>>>> +
>>>>> + v->arch.pg_dirty.eip = guest_cpu_user_regs()->eip;
>>>>> + v->arch.pg_dirty.gla = ga;
>>>>> +}
>>>>
>>>> This being the only user of v->arch.pg_dirty, why is the new
>>>> sub-structure made part of struct arch_vcpu instead of
>>>> struct arch_vm_event (or some other sub-structure referenced
>>>> by pointer, such that struct arch_vcpu wouldn't grow in size?
>>>> And even without that, this is HVM-specific, so would at best
>>>> belong into the HVM sub-structure.
>>>>
>>>> The PFEC_write_access logic is completely unclear to me, despite
>>>> the attempt to describe this in the description. I'm pretty sure you
>>>> want a code comment here.
>>
>> The thinking here is this: if we've ended up in p2m_mem_access_check()
>> with npfec.kind != npfec_kind_with_gla, then that's an EPT fault caused
>> by a page walk, that can be performed "manually" once Xen tries to set
>> both the A and the D bits.
>>
>> So when it tries to set the A bit, we mark the attempt by storing the
>> RIP/GLA pair, so that when the function is called again for the same
>> values we know that that's an attempt to set the D bit, and we act on
>> that (so that we don't have to lift the page restrictions on the fault
>> page).
>>
>> If there's a cleaner way to achieve this it would be great.
>
> "Cleaner" is a secondary goal. A correct way would be desirable
> for starters. I don't see what would prevent coming back here a
> second time because something somewhere having returned
> X86EMUL_RETRY, causing the insn to simply be restarted. This
> _may_ be possible to address by suitably flushing the two values
> under certain conditions.
Clearly corectness should be the goal, however what I had in mind was
that if there was some way we could know that the D bit is being set
without trying again, then this would be both cleaner and obviously correct.
As for X86EMUL_RETRY, one of the points of the patch is that on this
path no vm_event is being sent out at all, so no emulation attempt is
taking place (at least not on the vm_event processing path):
bool p2m_mem_access_check(paddr_t gpa, unsigned long gla,
struct npfec npfec,
vm_event_request_t **req_ptr)
@@ -208,6 +225,16 @@ bool p2m_mem_access_check(paddr_t gpa, unsigned
long gla,
}
}
+ if ( vm_event_check_ring(d->vm_event_monitor) &&
+ d->arch.monitor.inguest_pagefault_disabled &&
+ npfec.kind != npfec_kind_with_gla ) /* don't send a mem_event */
+ {
+ v->arch.vm_event->emulate_flags = 0;
+ p2m_set_ad_bits(v, gla);
+
+ return true;
+ }
+
*req_ptr = NULL; /* Vm_event path starts here. */
req = xzalloc(vm_event_request_t);
Of course, that doesn't mean that there's no other possiblity to enter
p2m_set_ad_bits() twice in a way I'm not seeing now.
Thanks,
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 |