[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



On 09/04/15 13:41, Tim Deegan wrote:
> 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. :)

D'oh - I had mixed up memcmp() and memcpy().

You are completely correct.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.