|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 8/9] xen/arm: Implement hypercall for dirty page tracing
If we move necessary checking into handle_page_fault routine, so the resulting patch for traps.c will look more simple: --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c@@ -1313,6 +1313,8 @@ static void do_trap_data_abort_guest(struct cpu_user_regs *regs,
const char *msg;
int rc, level = -1;
mmio_info_t info;
+ int page_fault = ( (dabt.dfsc & FSC_MASK) ==
+ (FSC_FLT_PERM | FSC_3D_LEVEL) && dabt.write );
if ( !check_conditional_instr(regs, hsr) )
{
@@ -1334,6 +1336,13 @@ static void do_trap_data_abort_guest(struct
cpu_user_regs *regs,
if ( rc == -EFAULT )
goto bad_data_abort;
+ /* domU page fault handling for guest live migration */
+ /* dabt.valid can be 0 here */
+ if ( page_fault && handle_page_fault(current->domain, info.gpa) )
+ {
+ /* Do not modify pc after page fault to repeat memory operation */
+ return;
+ }
/* XXX: Decode the instruction if ISS is not valid */
if ( !dabt.valid )
goto bad_data_abort;
Will it be acceptable, or you think "else" statement looks more better?
Where handle_page_fault returns zero if dirty page tracing is not
enabled for domain (dirty.mode==0) or address is not valid for domain
(having memory map we check it), so MMIO and faults from dom0 are not
handled by handle_page_fault.
The handle_page_fault routine (see [PATCH v4 7/9] xen/arm: Implement virtual-linear page table for guest p2m mapping in live migration) will be:
int handle_page_fault(struct domain *d, paddr_t addr)
{
lpae_t *vlp2m_pte = 0;
vaddr_t start, end;
if (!d->arch.dirty.mode) return 0;
/* Ensure that addr is inside guest's RAM */
get_gma_start_end(d, &start, &end);
if ( addr < start || addr > end ) return 0;
vlp2m_pte = get_vlpt_3lvl_pte(addr);
if ( vlp2m_pte->p2m.valid && vlp2m_pte->p2m.write == 0 )
{
lpae_t pte = *vlp2m_pte;
pte.p2m.write = 1;
write_pte(vlp2m_pte, pte);
flush_tlb_local();
/* in order to remove mappings in cleanup stage */
add_mapped_vaddr(d, addr);
}
return 1;
}
Best,
Evgeny.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |