From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?windows-1252?Q?Roger_Pau_Monn=E9?= Subject: Re: [PATCH v4 4/4] xen: rework paging_log_dirty_op to work with hvm guests Date: Fri, 8 May 2015 10:28:04 +0200 Message-ID: <554C7394.7010509@citrix.com> References: <1431008976-20414-1-git-send-email-roger.pau@citrix.com> <1431008976-20414-5-git-send-email-roger.pau@citrix.com> <554BA5690200007800077C00@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Yqddi-0004zU-Tx for xen-devel@lists.xenproject.org; Fri, 08 May 2015 08:28:11 +0000 In-Reply-To: <554BA5690200007800077C00@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: Andrew Cooper , Tim Deegan , xen-devel@lists.xenproject.org List-Id: xen-devel@lists.xenproject.org El 07/05/15 a les 17.48, Jan Beulich ha escrit: >>>> On 07.05.15 at 16:29, 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? Without it I get: paging.c:421:29: error: passing argument 2 of 'paging_gva_to_gfn' makes integer from pointer without a cast [-Werror] >> @@ -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. I've moved it so the fields are set before dropping the paging lock. Roger.