All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/4] migration queue
@ 2014-03-08 21:32 Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 1/4] XBZRLE: Fix qemu crash when resize the xbzrle cache Juan Quintela
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Juan Quintela @ 2014-03-08 21:32 UTC (permalink / raw)
  To: qemu-devel

The following changes since commit f53f3d0a00b6df39ce8dfca942608e5b6a9a4f71:

  Merge remote-tracking branch 'remotes/kvaneesh/for-upstream' into staging (2014-03-08 12:38:43 +0000)

are available in the git repository at:


  git://github.com/juanquintela/qemu.git tags/migration/20140308-1

for you to fetch changes up to 464400f6a5583eafb466595add435a3a33ea980f:

  migration: extend section_start/end traces (2014-03-08 22:22:34 +0100)

----------------------------------------------------------------
migration/next for 20140308

----------------------------------------------------------------
Alexey Kardashevskiy (2):
      vl: add system_wakeup_request tracepoint
      migration: extend section_start/end traces

Gonglei (1):
      XBZRLE: Fix qemu crash when resize the xbzrle cache

Markus Armbruster (1):
      qemu_file: Fix mismerge of "use fwrite() correctly"

 arch_init.c  | 52 +++++++++++++++++++++++++++++++++++++++++++++++++---
 qemu-file.c  |  2 +-
 savevm.c     | 12 ++++++------
 trace-events |  5 +++--
 vl.c         |  2 ++
 5 files changed, 61 insertions(+), 12 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/4] XBZRLE: Fix qemu crash when resize the xbzrle cache
  2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
@ 2014-03-08 21:32 ` Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 2/4] qemu_file: Fix mismerge of "use fwrite() correctly" Juan Quintela
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2014-03-08 21:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: ChenLiang, Gonglei

From: Gonglei <arei.gonglei@huawei.com>

Resizing the xbzrle cache during migration causes qemu-crash,
because the main-thread and migration-thread modify the xbzrle
cache size concurrently without lock-protection.

Signed-off-by: ChenLiang <chenliang88@huawei.com>
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 arch_init.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 49 insertions(+), 3 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index fe17279..60c975d 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -164,8 +164,9 @@ static struct {
     uint8_t *encoded_buf;
     /* buffer for storing page content */
     uint8_t *current_buf;
-    /* Cache for XBZRLE */
+    /* Cache for XBZRLE, Protected by lock. */
     PageCache *cache;
+    QemuMutex lock;
 } XBZRLE = {
     .encoded_buf = NULL,
     .current_buf = NULL,
@@ -174,16 +175,52 @@ static struct {
 /* buffer used for XBZRLE decoding */
 static uint8_t *xbzrle_decoded_buf;

+static void XBZRLE_cache_lock(void)
+{
+    if (migrate_use_xbzrle())
+        qemu_mutex_lock(&XBZRLE.lock);
+}
+
+static void XBZRLE_cache_unlock(void)
+{
+    if (migrate_use_xbzrle())
+        qemu_mutex_unlock(&XBZRLE.lock);
+}
+
 int64_t xbzrle_cache_resize(int64_t new_size)
 {
+    PageCache *new_cache, *cache_to_free;
+
     if (new_size < TARGET_PAGE_SIZE) {
         return -1;
     }

+    /* no need to lock, the current thread holds qemu big lock */
     if (XBZRLE.cache != NULL) {
-        return cache_resize(XBZRLE.cache, new_size / TARGET_PAGE_SIZE) *
-            TARGET_PAGE_SIZE;
+        /* check XBZRLE.cache again later */
+        if (pow2floor(new_size) == migrate_xbzrle_cache_size()) {
+            return pow2floor(new_size);
+        }
+        new_cache = cache_init(new_size / TARGET_PAGE_SIZE,
+                                        TARGET_PAGE_SIZE);
+        if (!new_cache) {
+            DPRINTF("Error creating cache\n");
+            return -1;
+        }
+
+        XBZRLE_cache_lock();
+        /* the XBZRLE.cache may have be destroyed, check it again */
+        if (XBZRLE.cache != NULL) {
+            cache_to_free = XBZRLE.cache;
+            XBZRLE.cache = new_cache;
+        } else {
+            cache_to_free = new_cache;
+        }
+        XBZRLE_cache_unlock();
+
+        cache_fini(cache_to_free);
     }
+
     return pow2floor(new_size);
 }

@@ -539,6 +576,8 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
             ret = ram_control_save_page(f, block->offset,
                                offset, TARGET_PAGE_SIZE, &bytes_sent);

+            XBZRLE_cache_lock();
+
             current_addr = block->offset + offset;
             if (ret != RAM_SAVE_CONTROL_NOT_SUPP) {
                 if (ret != RAM_SAVE_CONTROL_DELAYED) {
@@ -587,6 +626,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
                 acct_info.norm_pages++;
             }

+            XBZRLE_cache_unlock();
             /* if page is unmodified, continue to the next */
             if (bytes_sent > 0) {
                 last_sent_block = block;
@@ -654,6 +694,7 @@ static void migration_end(void)
         migration_bitmap = NULL;
     }

+    XBZRLE_cache_lock();
     if (XBZRLE.cache) {
         cache_fini(XBZRLE.cache);
         g_free(XBZRLE.cache);
@@ -663,6 +704,7 @@ static void migration_end(void)
         XBZRLE.encoded_buf = NULL;
         XBZRLE.current_buf = NULL;
     }
+    XBZRLE_cache_unlock();
 }

 static void ram_migration_cancel(void *opaque)
@@ -693,13 +735,17 @@ static int ram_save_setup(QEMUFile *f, void *opaque)
     dirty_rate_high_cnt = 0;

     if (migrate_use_xbzrle()) {
+        qemu_mutex_lock_iothread();
         XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() /
                                   TARGET_PAGE_SIZE,
                                   TARGET_PAGE_SIZE);
         if (!XBZRLE.cache) {
+            qemu_mutex_unlock_iothread();
             DPRINTF("Error creating cache\n");
             return -1;
         }
+        qemu_mutex_init(&XBZRLE.lock);
+        qemu_mutex_unlock_iothread();

         /* We prefer not to abort if there is no memory */
         XBZRLE.encoded_buf = g_try_malloc0(TARGET_PAGE_SIZE);
-- 
1.8.5.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/4] qemu_file: Fix mismerge of "use fwrite() correctly"
  2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 1/4] XBZRLE: Fix qemu crash when resize the xbzrle cache Juan Quintela
@ 2014-03-08 21:32 ` Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 3/4] vl: add system_wakeup_request tracepoint Juan Quintela
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2014-03-08 21:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: Amit Shah, Markus Armbruster

From: Markus Armbruster <armbru@redhat.com>

Reviewers accepted v2 of the patch, but what got committed was v1,
with the R-bys for v2.  This is the v1->v2 followup fix.

[Amit:
 This fixes commit aded6539d983280212e08d09f14157b1cb4d58cc
]

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 qemu-file.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/qemu-file.c b/qemu-file.c
index f074af1..e5ec798 100644
--- a/qemu-file.c
+++ b/qemu-file.c
@@ -105,7 +105,7 @@ static int stdio_put_buffer(void *opaque, const uint8_t *buf, int64_t pos,
     res = fwrite(buf, 1, size, s->stdio_file);

     if (res != size) {
-        return -EIO;	/* fake errno value */
+        return -errno;
     }
     return res;
 }
-- 
1.8.5.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 3/4] vl: add system_wakeup_request tracepoint
  2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 1/4] XBZRLE: Fix qemu crash when resize the xbzrle cache Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 2/4] qemu_file: Fix mismerge of "use fwrite() correctly" Juan Quintela
@ 2014-03-08 21:32 ` Juan Quintela
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 4/4] migration: extend section_start/end traces Juan Quintela
  2014-03-10 12:36 ` [Qemu-devel] [PULL 0/4] migration queue Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2014-03-08 21:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alexey Kardashevskiy, Amit Shah

From: Alexey Kardashevskiy <aik@ozlabs.ru>

It might be useful for tracing migration.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 trace-events | 1 +
 vl.c         | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/trace-events b/trace-events
index aec4202..466c27e 100644
--- a/trace-events
+++ b/trace-events
@@ -486,6 +486,7 @@ runstate_set(int new_state) "new state %d"
 g_malloc(size_t size, void *ptr) "size %zu ptr %p"
 g_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
 g_free(void *ptr) "ptr %p"
+system_wakeup_request(int reason) "reason=%d"

 # block/qcow2.c
 qcow2_writev_start_req(void *co, int64_t sector, int nb_sectors) "co %p sector %" PRIx64 " nb_sectors %d"
diff --git a/vl.c b/vl.c
index 41581c1..50693e6 100644
--- a/vl.c
+++ b/vl.c
@@ -1837,6 +1837,8 @@ void qemu_register_suspend_notifier(Notifier *notifier)

 void qemu_system_wakeup_request(WakeupReason reason)
 {
+    trace_system_wakeup_request(reason);
+
     if (!runstate_check(RUN_STATE_SUSPENDED)) {
         return;
     }
-- 
1.8.5.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 4/4] migration: extend section_start/end traces
  2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
                   ` (2 preceding siblings ...)
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 3/4] vl: add system_wakeup_request tracepoint Juan Quintela
@ 2014-03-08 21:32 ` Juan Quintela
  2014-03-10 12:36 ` [Qemu-devel] [PULL 0/4] migration queue Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Juan Quintela @ 2014-03-08 21:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alexey Kardashevskiy, Amit Shah

From: Alexey Kardashevskiy <aik@ozlabs.ru>

This adds @idstr to savevm_section_start and savevm_section_end
tracepoints.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
 savevm.c     | 12 ++++++------
 trace-events |  4 ++--
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/savevm.c b/savevm.c
index 7329fc5..d094fbb 100644
--- a/savevm.c
+++ b/savevm.c
@@ -527,13 +527,13 @@ int qemu_savevm_state_iterate(QEMUFile *f)
         if (qemu_file_rate_limit(f)) {
             return 0;
         }
-        trace_savevm_section_start();
+        trace_savevm_section_start(se->idstr, se->section_id);
         /* Section type */
         qemu_put_byte(f, QEMU_VM_SECTION_PART);
         qemu_put_be32(f, se->section_id);

         ret = se->ops->save_live_iterate(f, se->opaque);
-        trace_savevm_section_end(se->section_id);
+        trace_savevm_section_end(se->idstr, se->section_id);

         if (ret < 0) {
             qemu_file_set_error(f, ret);
@@ -565,13 +565,13 @@ void qemu_savevm_state_complete(QEMUFile *f)
                 continue;
             }
         }
-        trace_savevm_section_start();
+        trace_savevm_section_start(se->idstr, se->section_id);
         /* Section type */
         qemu_put_byte(f, QEMU_VM_SECTION_END);
         qemu_put_be32(f, se->section_id);

         ret = se->ops->save_live_complete(f, se->opaque);
-        trace_savevm_section_end(se->section_id);
+        trace_savevm_section_end(se->idstr, se->section_id);
         if (ret < 0) {
             qemu_file_set_error(f, ret);
             return;
@@ -584,7 +584,7 @@ void qemu_savevm_state_complete(QEMUFile *f)
         if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
             continue;
         }
-        trace_savevm_section_start();
+        trace_savevm_section_start(se->idstr, se->section_id);
         /* Section type */
         qemu_put_byte(f, QEMU_VM_SECTION_FULL);
         qemu_put_be32(f, se->section_id);
@@ -598,7 +598,7 @@ void qemu_savevm_state_complete(QEMUFile *f)
         qemu_put_be32(f, se->version_id);

         vmstate_save(f, se);
-        trace_savevm_section_end(se->section_id);
+        trace_savevm_section_end(se->idstr, se->section_id);
     }

     qemu_put_byte(f, QEMU_VM_EOF);
diff --git a/trace-events b/trace-events
index 466c27e..002c260 100644
--- a/trace-events
+++ b/trace-events
@@ -1040,8 +1040,8 @@ vmware_scratch_write(uint32_t index, uint32_t value) "index %d, value 0x%x"
 vmware_setmode(uint32_t w, uint32_t h, uint32_t bpp) "%dx%d @ %d bpp"

 # savevm.c
-savevm_section_start(void) ""
-savevm_section_end(unsigned int section_id) "section_id %u"
+savevm_section_start(const char *id, unsigned int section_id) "%s, section_id %u"
+savevm_section_end(const char *id, unsigned int section_id) "%s, section_id %u"

 # arch_init.c
 migration_bitmap_sync_start(void) ""
-- 
1.8.5.3

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PULL 0/4] migration queue
  2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
                   ` (3 preceding siblings ...)
  2014-03-08 21:32 ` [Qemu-devel] [PATCH 4/4] migration: extend section_start/end traces Juan Quintela
@ 2014-03-10 12:36 ` Peter Maydell
  4 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2014-03-10 12:36 UTC (permalink / raw)
  To: Juan Quintela; +Cc: QEMU Developers

On 8 March 2014 21:32, Juan Quintela <quintela@redhat.com> wrote:
> The following changes since commit f53f3d0a00b6df39ce8dfca942608e5b6a9a4f71:
>
>   Merge remote-tracking branch 'remotes/kvaneesh/for-upstream' into staging (2014-03-08 12:38:43 +0000)
>
> are available in the git repository at:
>
>
>   git://github.com/juanquintela/qemu.git tags/migration/20140308-1
>
> for you to fetch changes up to 464400f6a5583eafb466595add435a3a33ea980f:
>
>   migration: extend section_start/end traces (2014-03-08 22:22:34 +0100)
>
> ----------------------------------------------------------------
> migration/next for 20140308

Applied, thanks.

-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-03-10 12:37 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-08 21:32 [Qemu-devel] [PULL 0/4] migration queue Juan Quintela
2014-03-08 21:32 ` [Qemu-devel] [PATCH 1/4] XBZRLE: Fix qemu crash when resize the xbzrle cache Juan Quintela
2014-03-08 21:32 ` [Qemu-devel] [PATCH 2/4] qemu_file: Fix mismerge of "use fwrite() correctly" Juan Quintela
2014-03-08 21:32 ` [Qemu-devel] [PATCH 3/4] vl: add system_wakeup_request tracepoint Juan Quintela
2014-03-08 21:32 ` [Qemu-devel] [PATCH 4/4] migration: extend section_start/end traces Juan Quintela
2014-03-10 12:36 ` [Qemu-devel] [PULL 0/4] migration queue Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.