|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC v2 2/3] xen/shadow: fix shadow_track_dirty_vram to work on hvm guests
At 20:06 +0100 on 02 Apr (1428005197), Andrew Cooper wrote:
> On 02/04/15 11:26, Roger Pau Monne wrote:
> > Modify shadow_track_dirty_vram to use a local buffer and then flush to the
> > guest without the paging_lock held. This is modeled after
> > hap_track_dirty_vram.
> >
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> > Cc: Tim Deegan <tim@xxxxxxx>
> > Cc: Jan Beulich <jbeulich@xxxxxxxx>
> > Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>
> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, subject to two
> corrections and a suggestion.
>
> > ---
> > xen/arch/x86/mm/shadow/common.c | 18 +++++++++++++++---
> > 1 file changed, 15 insertions(+), 3 deletions(-)
> >
> > diff --git a/xen/arch/x86/mm/shadow/common.c
> > b/xen/arch/x86/mm/shadow/common.c
> > index 2e43d6d..8fff43a 100644
> > --- a/xen/arch/x86/mm/shadow/common.c
> > +++ b/xen/arch/x86/mm/shadow/common.c
> > @@ -3516,7 +3516,7 @@ static void sh_clean_dirty_bitmap(struct domain *d)
> > int shadow_track_dirty_vram(struct domain *d,
> > unsigned long begin_pfn,
> > unsigned long nr,
> > - XEN_GUEST_HANDLE_64(uint8) dirty_bitmap)
> > + XEN_GUEST_HANDLE_64(uint8) guest_dirty_bitmap)
> > {
> > int rc;
> > unsigned long end_pfn = begin_pfn + nr;
> > @@ -3526,6 +3526,7 @@ int shadow_track_dirty_vram(struct domain *d,
> > p2m_type_t t;
> > struct sh_dirty_vram *dirty_vram;
> > struct p2m_domain *p2m = p2m_get_hostp2m(d);
> > + uint8_t *dirty_bitmap = NULL;
> >
> > if ( end_pfn < begin_pfn || end_pfn > p2m->max_mapped_pfn + 1 )
> > return -EINVAL;
> > @@ -3554,6 +3555,12 @@ int shadow_track_dirty_vram(struct domain *d,
> > goto out;
> > }
> >
> > + dirty_bitmap = xzalloc_bytes(dirty_size);
> > + if ( dirty_bitmap == NULL )
> > + {
> > + rc = -ENOMEM;
> > + goto out;
> > + }
> > /* This should happen seldomly (Video mode change),
> > * no need to be careful. */
> > if ( !dirty_vram )
> > @@ -3587,7 +3594,7 @@ int shadow_track_dirty_vram(struct domain *d,
> > {
> > /* still completely clean, just copy our empty bitmap */
> > rc = -EFAULT;
> > - if ( copy_to_guest(dirty_bitmap, dirty_vram->dirty_bitmap,
> > dirty_size) == 0 )
> > + if ( memcpy(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size) !=
> > NULL )
>
> memcpy() returns an int, not a pointer.
No, memcpy() returns a pointer, but it's always == its first argument
so there's no need to check it at all. :)
> > + if ( rc == 0 && dirty_bitmap != NULL )
> > + if ( copy_to_guest(guest_dirty_bitmap, dirty_bitmap, dirty_size)
> > != 0 )
> > + rc = -EFAULT;
>
> These two if()s can be joined, and shorted for brevity.
>
> if ( !rc && dirty_bitmap && copy_to_guest(guest_dirty_bitmap,
> dirty_bitmap, dirty_size) )
> rc = -EFAULT;
+1.
Cheers,
Tim.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |