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