[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 33/36] XBZRLE: Fix one XBZRLE corruption issues
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PATCH 33/36] XBZRLE: Fix one XBZRLE corruption issues |
Date: |
Mon, 5 May 2014 22:30:31 +0200 |
From: ChenLiang <address@hidden>
The page may not be inserted into cache after executing save_xbzrle_page.
In case of failure to insert, the original page should be sent rather
than the page in the cache.
Signed-off-by: ChenLiang <address@hidden>
Signed-off-by: Gonglei <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Signed-off-by: Juan Quintela <address@hidden>
---
arch_init.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index 15a706e..0ffecee 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -341,7 +341,7 @@ static void xbzrle_cache_zero_page(ram_addr_t current_addr)
#define ENCODING_FLAG_XBZRLE 0x1
-static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data,
+static int save_xbzrle_page(QEMUFile *f, uint8_t **current_data,
ram_addr_t current_addr, RAMBlock *block,
ram_addr_t offset, int cont, bool last_stage)
{
@@ -349,19 +349,23 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t
*current_data,
uint8_t *prev_cached_page;
if (!cache_is_cached(XBZRLE.cache, current_addr)) {
+ acct_info.xbzrle_cache_miss++;
if (!last_stage) {
- if (cache_insert(XBZRLE.cache, current_addr, current_data) == -1) {
+ if (cache_insert(XBZRLE.cache, current_addr, *current_data) == -1)
{
return -1;
+ } else {
+ /* update *current_data when the page has been
+ inserted into cache */
+ *current_data = get_cached_data(XBZRLE.cache, current_addr);
}
}
- acct_info.xbzrle_cache_miss++;
return -1;
}
prev_cached_page = get_cached_data(XBZRLE.cache, current_addr);
/* save current buffer into memory */
- memcpy(XBZRLE.current_buf, current_data, TARGET_PAGE_SIZE);
+ memcpy(XBZRLE.current_buf, *current_data, TARGET_PAGE_SIZE);
/* XBZRLE encoding (if there is no overflow) */
encoded_len = xbzrle_encode_buffer(prev_cached_page, XBZRLE.current_buf,
@@ -374,7 +378,10 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t
*current_data,
DPRINTF("Overflow\n");
acct_info.xbzrle_overflows++;
/* update data in the cache */
- memcpy(prev_cached_page, current_data, TARGET_PAGE_SIZE);
+ if (!last_stage) {
+ memcpy(prev_cached_page, *current_data, TARGET_PAGE_SIZE);
+ *current_data = prev_cached_page;
+ }
return -1;
}
@@ -599,15 +606,9 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
*/
xbzrle_cache_zero_page(current_addr);
} else if (!ram_bulk_stage && migrate_use_xbzrle()) {
- bytes_sent = save_xbzrle_page(f, p, current_addr, block,
+ 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
*/
--
1.9.0
- [Qemu-devel] [PATCH 20/36] usb: sanity check setup_index+setup_len in post_load, (continued)
- [Qemu-devel] [PATCH 20/36] usb: sanity check setup_index+setup_len in post_load, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 24/36] virtio-net: out-of-bounds buffer write on load, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 27/36] Make qemu_peek_buffer loop until it gets it's data, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 26/36] Disallow outward migration while awaiting incoming migration, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 25/36] virtio: validate config_len on load, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 30/36] Init the XBZRLE.lock in ram_mig_init, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 28/36] Count used RAMBlock pages for migration_dirty_pages, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 29/36] Provide init function for ram migration, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 31/36] Coverity: Fix failure path for qemu_accept in migration, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 32/36] migration: remove duplicate code, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 33/36] XBZRLE: Fix one XBZRLE corruption issues,
Juan Quintela <=
- [Qemu-devel] [PATCH 34/36] migration: Add counts of updating the dirty bitmap, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 35/36] migration: expose the bitmap_sync_count to the end, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 36/36] migration: expose xbzrle cache miss rate, Juan Quintela, 2014/05/05
- [Qemu-devel] [PATCH 02/36] vmstate: add VMS_MUST_EXIST, Juan Quintela, 2014/05/05
- Re: [Qemu-devel] [PULL 00/36] migration queue, Peter Maydell, 2014/05/07