[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] slow xp hibernation revisited



> > The exit condition is what would happen anyway after the remap is
done
> > and the page is still invalid.
> >
> > diff --git a/hw/xen_machine_fv.c b/hw/xen_machine_fv.c
> > index d02e23f..1ff80bb 100644
> > --- a/hw/xen_machine_fv.c
> > +++ b/hw/xen_machine_fv.c
> > @@ -151,6 +151,24 @@ 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))
> > +        {
> > +            /* 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;
> > +            }
> > +        }
> >          if (!entry->vaddr_base || entry->paddr_index !=
address_index
> > || !test_bit(address_offset>>XC_PAGE_SHIFT, entry->valid_mapping))
> >              qemu_remap_bucket(entry, address_index);
> >      }
> 
> 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?

James


_______________________________________________
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®.