[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Fix two XBZRLE corruption issues
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH] Fix two XBZRLE corruption issues |
Date: |
Fri, 14 Feb 2014 09:35:14 +0000 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
* Gonglei (Arei) (address@hidden) wrote:
>
> Best regards,
> -Gonglei
>
>
<snip>
> > } else if (!ram_bulk_stage && migrate_use_xbzrle()) {
> > - current_addr = block->offset + offset;
> > bytes_sent = save_xbzrle_page(f, p, current_addr, block,
> > offset, cont,
> > last_stage);
> > if (!last_stage) {
> > + /* We must send exactly what's in the xbzrle cache
> > + * even if the page wasn't xbzrle compressed, so
> > that
> > + * it's right next time.
> > + */
> > p = get_cached_data(XBZRLE.cache, current_addr);
> > +
> > + /* Can't send this cached data async, since the cache
> > page
> > + * might get updated before it gets to the wire
> > + */
> > + send_async = false;
> > }
> > }
> >
> > /* XBZRLE overflow or normal page */
> > if (bytes_sent == -1) {
> > bytes_sent = save_block_hdr(f, block, offset, cont,
> > RAM_SAVE_FLAG_PAGE);
> > - qemu_put_buffer_async(f, p, TARGET_PAGE_SIZE);
> > + if (send_async) {
> > + qemu_put_buffer_async(f, p, TARGET_PAGE_SIZE);
> > + } else {
> > + qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
> > + }
> > bytes_sent += TARGET_PAGE_SIZE;
> > acct_info.norm_pages++;
> > }
>
> if a page that was cached by XBZRLE but XBZRLE overflow,qemu should send the
> page in the cache rather then original page.Because the original page might
> change .
Which it already does - see the line above which is:
p = get_cached_data(XBZRLE.cache, current_addr);
That changes the 'p' to point to the page in the cache and thus forces that
qemu_put_buffer to send the page in the cache; my patch doesn't change that,
it just stops it using the qemu_put_buffer_async so that the cache is read
immediately not at some point in the future when the cache may have changed.
Dave
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK