diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c --- a/tools/libxc/xc_domain_restore.c +++ b/tools/libxc/xc_domain_restore.c @@ -24,6 +24,7 @@ #include #include +#include #include "xg_private.h" #include "xg_save_restore.h" @@ -500,6 +501,9 @@ unsigned long pfn; uint64_t pte; struct domain_info_context *dinfo = &ctx->dinfo; + unsigned int allocated = 0; + struct timeval tvs, tve; + int elapsed, minelapsed = -1, maxelapsed = -1; pte_last = PAGE_SIZE / ((ctx->pt_levels == 2)? 4 : 8); @@ -520,9 +524,17 @@ if ( ctx->p2m[pfn] == INVALID_P2M_ENTRY ) { unsigned long force_pfn = superpages ? FORCE_SP_MASK : pfn; + allocated++; + gettimeofday(&tvs, NULL); if (allocate_mfn_list(xc_handle, dom, ctx, 1, &pfn, &force_pfn, superpages) != 0) return 0; + gettimeofday(&tve, NULL); + elapsed = (tve.tv_sec - tvs.tv_sec) * 1000000 + (tve.tv_usec - tvs.tv_usec); + if (minelapsed < 0 || elapsed < minelapsed) + minelapsed = elapsed; + if (maxelapsed < 0 || elapsed > maxelapsed) + maxelapsed = elapsed; } pte &= ~MADDR_MASK_X86; pte |= (uint64_t)ctx->p2m[pfn] << PAGE_SHIFT; @@ -532,6 +544,8 @@ else ((uint64_t *)page)[i] = (uint64_t)pte; } + if (allocated) + DPRINTF("xdr: allocated %u pages (min alloc time %d us, max %d)\n", allocated, minelapsed, maxelapsed); return 1; }