WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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