[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [Xen-devel] slow xp hibernation revisited
On Mon, 6 Jun 2011, James Harper wrote: > > > This is just a matter of aesthetic, but probably something like the > > > following would be clearer? > > > > > > if (entry->vaddr_base && entry->paddr_index == address_index) { > > > if (!test_bit(address_offset>>XC_PAGE_SHIFT, > > entry->valid_mapping)) { > > > /* your code + remap bucket */ > > > } > > > } else { > > > qemu_remap_bucket(entry, address_index); > > > } > > > > > > > Yes that should work, although I think I'm too tired now for Boolean > > algebra :) > > > > Is my calculation of the pfn correct? I think I don't need to fuss > > around with decoding from the bucket index and bucket offset if I'm > just > > doing a trial map of one page, so using phys_addr directory is correct > > right? > > > > Is this what you had in mind? > Yes, it is fine for me. Could you please send another version for upstream? Use this git tree, just to be sure you have the latest mapcache fixes: git://xenbits.xen.org/people/sstabellini/qemu-dm.git stable > diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c > index d02e23f..3c9fc0f 100644 > --- a/hw/xen_machine_fv.c > +++ b/hw/xen_machine_fv.c > @@ -151,8 +151,30 @@ uint8_t *qemu_map_cache(target_phys_addr_t > phys_addr, uint8_t lock) > pentry->next = entry; > qemu_remap_bucket(entry, address_index); > } else if (!entry->lock) { > - if (!entry->vaddr_base || entry->paddr_index != address_index > || !test_bit(address_offset>>XC_PAGE_SHIFT, entry->valid_mapping)) > + if (entry->vaddr_base && entry->paddr_index == address_index) > + { > + if (!test_bit(address_offset>>XC_PAGE_SHIFT, > entry->valid_mapping)) > + { > + /* The page was invalid previously. Test if it is valid > now and only remap if so */ > + xen_pfn_t pfn; > + int err; > + void *tmp_vaddr; > + > + pfn = phys_addr >> XC_PAGE_SHIFT; > + tmp_vaddr = xc_map_foreign_bulk(xc_handle, domid, > PROT_READ|PROT_WRITE, &pfn, &err, 1); > + if (tmp_vaddr) > + munmap(tmp_vaddr, PAGE_SIZE); > + > + if (!tmp_vaddr || err) > + { > + last_address_index = ~0UL; > + return NULL; > + } > + qemu_remap_bucket(entry, address_index); > + } > + } else { > qemu_remap_bucket(entry, address_index); > + } > } > > if (!test_bit(address_offset>>XC_PAGE_SHIFT, entry->valid_mapping)) > { > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |