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

RE: [Xen-devel] slow xp hibernation revisited



> > 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?

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