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
|