diff -r bd54f26a3415 xen/arch/x86/mm/p2m.c --- a/xen/arch/x86/mm/p2m.c Fri Sep 11 11:34:42 2009 +0100 +++ b/xen/arch/x86/mm/p2m.c Fri Sep 11 11:35:05 2009 +0100 @@ -1529,6 +1529,36 @@ 9 : 0; else order = 0; + +#ifndef NDEBUG + /* PoD code assumes that a page owned by the domain, not from the xenheap, and in the p2m + * is on the domain page list. Verify this assumption. */ + if ( mfn_valid(mfn) + && p2m_is_ram(p2mt) + && page_get_owner(mfn_to_page(mfn))==d + && ( (mfn_to_page(mfn)->count_info & PGC_xen_heap) == 0 ) ) + { + struct page_info *p, *q; + + p = mfn_to_page(mfn); + + spin_lock(&d->page_alloc_lock); + + /* Walk the domain page list and make sure this page is on it... */ + for ( q = page_list_first(&d->page_list) ; q; q = page_list_next(q, &d->page_list) ) + if ( q == p ) + break; + if ( !q ) + { + printk("%s: mfn %lx owned by d%d, not xen_heap, but not on domain page_list!\n", + __func__, mfn_x(mfn), d->domain_id); + BUG(); + } + + spin_unlock(&d->page_alloc_lock); + } +#endif + rc = d->arch.p2m->set_entry(d, gfn, mfn, order, p2mt); gfn += 1ul << order; if ( mfn_x(mfn) != INVALID_MFN )