[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.