|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |