*/
pte_clear(&init_mm, vaddr, kmap_pte-idx);
__flush_tlb_one(vaddr);
+#elif defined(CONFIG_XEN)
+ /*
+ * We must ensure there are no dangling pagetable references when
+ * returning memory to Xen (decrease_reservation).
+ * XXX TODO: We could make this faster by only zapping when
+ * kmap_flush_unused is called but that is trickier and more invasive.
+ */
+ unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+ enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
+ pte_clear(&init_mm, vaddr, kmap_pte-idx);
#endif
dec_preempt_count();
if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
put_page(page);
+ if ( unlikely((page->count_info & PGC_count_mask) != 1) )
+ {
+ /* We'll make this a guest-visible error in future, so take heed! */
+ DPRINTK("Dom%d freeing in-use page %lx (pseudophys %lx):"
+ " count=%x type=%lx\n",
+ d->domain_id, mfn, get_gpfn_from_mfn(mfn),
+ page->count_info, page->u.inuse.type_info);
+ }
+
guest_physmap_remove_page(d, gmfn, mfn);
put_page(page);