[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] xbzrle: don't check the value in the vm ram rep
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH] xbzrle: don't check the value in the vm ram repeatedly |
Date: |
Sat, 29 Mar 2014 09:33:28 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 |
On 03/29/2014 09:00 AM, 陈梁 wrote:
>>> You really need to do the "go over the rest" loop on an 8-byte temporary
>>> variable. Ever since your patch made new_buf be a volatile buffer,
>>> rather than a static copy, you MUST visit each byte of new_buf exactly once.
>>>
>> hmm, thanks. get it. Maybe we can do it like this
> sorry, it should like this
>
> /* word at a time for speed */
> if (!res) {
> while (i < slen &&
> (*(long *)(old_buf + i)) == (*(long *)(new_buf + i))) {
> i += sizeof(long);
> zrun_len += sizeof(long);
> }
>
> /* go over the rest */
> //while (i < slen && old_buf[i] == new_buf[i]) {
> // zrun_len++;
> // i++;
> //}
> }
No, that's not right either. Once you have made a decision based on
something you have read, you must proceed with that decision. In the
case, you broke out of the while loop because you found a difference.
Now you must report the location of that difference, as of the time
where you read it and without re-reading from new_buf. The ONLY viable
solution is to read the contents of new_buf into a temporary, then do
all subsequent actions on that temporary.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature