|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 4/4] xen: rework paging_log_dirty_op to work with hvm guests
>>> On 07.05.15 at 16:29, <roger.pau@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -408,6 +408,51 @@ int paging_mfn_is_dirty(struct domain *d, mfn_t gmfn)
> return rv;
> }
>
> +static inline void *map_dirty_bitmap(XEN_GUEST_HANDLE_64(uint8) dirty_bitmap,
> + unsigned long pages,
> + struct page_info **page)
> +{
> + uint32_t pfec = PFEC_page_present | PFEC_write_access;
> + unsigned long gfn;
> + p2m_type_t p2mt;
> +
> + gfn = paging_gva_to_gfn(current,
> + (paddr_t)(dirty_bitmap.p + (pages >> 3)),
Why paddr_t?
> @@ -455,6 +511,7 @@ static int paging_log_dirty_op(struct domain *d,
> d->arch.paging.log_dirty.fault_count,
> d->arch.paging.log_dirty.dirty_count);
>
> +again:
Labels indented by at least one space please.
> @@ -472,18 +529,18 @@ static int paging_log_dirty_op(struct domain *d,
> l4 = paging_map_log_dirty_bitmap(d);
> i4 = d->arch.paging.preempt.log_dirty.i4;
> i3 = d->arch.paging.preempt.log_dirty.i3;
> + i2 = d->arch.paging.preempt.log_dirty.i2;
I don't see why this needs to be stored in struct domain - upon being
preempted you never seem to leave this non-zero.
> @@ -492,15 +549,34 @@ static int paging_log_dirty_op(struct domain *d,
> bytes = (unsigned int)((sc->pages - pages + 7) >> 3);
> if ( likely(peek) )
> {
> - if ( (l1 ? copy_to_guest_offset(sc->dirty_bitmap,
> - pages >> 3, (uint8_t
> *)l1,
> - bytes)
> - : clear_guest_offset(sc->dirty_bitmap,
> - pages >> 3, bytes)) != 0 )
> + if ( pages >> (3 + PAGE_SHIFT) !=
> + index_mapped >> (3 + PAGE_SHIFT) )
> {
> - rv = -EFAULT;
> - goto out;
> + /* We need to map next page */
> + paging_unlock(d);
> + unmap_dirty_bitmap(dirty_bitmap, page);
> + index_mapped = pages;
> + dirty_bitmap = map_dirty_bitmap(sc->dirty_bitmap,
> pages,
> + &page);
> + paging_lock(d);
> + if ( dirty_bitmap == NULL )
> + {
> + rv = -EFAULT;
> + goto out;
> + }
> + d->arch.paging.preempt.log_dirty.i4 = i4;
> + d->arch.paging.preempt.log_dirty.i3 = i3;
> + d->arch.paging.preempt.log_dirty.i2 = i2;
> + d->arch.paging.preempt.log_dirty.done = pages;
> + goto again;
I think you need to update the state before dropping the paging lock.
And that would then actually seem to make the new i2 field necessary.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |