# HG changeset patch # User Juergen Gross # Date 1342171663 -7200 # Node ID 8b1e10c2494fd31f2ca53926cca2993dff045125 # Parent b2d7c4238c2f488d6d19b4b1be5e836872e276bd xen 4.0: tools: Save superpages in the same batch, to make detection easier On the first time through (when pfns are mostly allocated on the receiving side), try to keep superpages together in the same batch by ending a batch early if we see the first page of a potential superpage and there isn't enough room in the batch for a full superpage. Signed-off-by: George Dunlap diff -r b2d7c4238c2f -r 8b1e10c2494f tools/libxc/xc_domain_save.c --- a/tools/libxc/xc_domain_save.c Fri Jul 13 11:27:41 2012 +0200 +++ b/tools/libxc/xc_domain_save.c Fri Jul 13 11:27:43 2012 +0200 @@ -67,6 +67,11 @@ struct outbuf { (((_mfn) < (ctx->max_mfn)) && \ ((mfn_to_pfn(_mfn) < (dinfo->p2m_size)) && \ (pfn_to_mfn(mfn_to_pfn(_mfn)) == (_mfn)))) + +#define SUPERPAGE_PFN_SHIFT 9 +#define SUPERPAGE_NR_PFNS (1UL << SUPERPAGE_PFN_SHIFT) + +#define SUPER_PAGE_START(pfn) (((pfn) & (SUPERPAGE_NR_PFNS-1)) == 0 ) /* ** During (live) save/migrate, we maintain a number of bitmaps to track @@ -866,6 +871,7 @@ int xc_domain_save(int xc_handle, int io int rc = 1, frc, i, j, last_iter = 0, iter = 0; int live = (flags & XCFLAGS_LIVE); int debug = (flags & XCFLAGS_DEBUG); + int superpages = !!hvm; int race = 0, sent_last_iter, skip_this_iter; int tmem_saved = 0; @@ -1228,6 +1234,12 @@ int xc_domain_save(int xc_handle, int io (test_bit(n, to_fix) && last_iter)) ) continue; + /* First time through, try to keep superpages in the same batch */ + if ( superpages && iter == 1 + && SUPER_PAGE_START(n) + && batch + SUPERPAGE_NR_PFNS > MAX_BATCH_SIZE ) + break; + /* ** we get here if: ** 1. page is marked to_send & hasn't already been re-dirtied