From patchwork Fri Feb 22 16:36:28 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 222601 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id D754B2C0297 for ; Sat, 23 Feb 2013 05:27:39 +1100 (EST) Received: from localhost ([::1]:57891 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8veJ-0006nU-HC for incoming@patchwork.ozlabs.org; Fri, 22 Feb 2013 11:39:03 -0500 Received: from eggs.gnu.org ([208.118.235.92]:58954) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8vdC-0005Ce-Df for qemu-devel@nongnu.org; Fri, 22 Feb 2013 11:37:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U8vd6-0006pV-Uw for qemu-devel@nongnu.org; Fri, 22 Feb 2013 11:37:54 -0500 Received: from mail-vb0-f51.google.com ([209.85.212.51]:48816) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8vd6-0006pI-Q0 for qemu-devel@nongnu.org; Fri, 22 Feb 2013 11:37:48 -0500 Received: by mail-vb0-f51.google.com with SMTP id fq11so522189vbb.10 for ; Fri, 22 Feb 2013 08:37:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=MiBdEFuDzoTP3FPErgzmt8pjhlr7BOJCW6w8qZkrNIk=; b=UFAxaNHqEXo95y3onjMYPDSlHPa22B4aBPyDPhCXFpWfKI/EoUOQXpoef4NKVVM3GU 6oTF2TakvOKsQ5+hVeMgr/sG2o/4sZZVhRKghZKoajuZ857/cA7BF8pBbyN6A4MjLe6u ItD2Dba8Sh+0yTjMLF7ATxnUvizAmgNfGC32MkmgOOjbFi2kbUJ3ELTjIDrlQbO8gKsL S5frm7kHWRT6fGVyF4I1065nau5TK0qbCiJzw6CmuiQr2Fk46WrMPHAcQ3vkk6k7iw2M +07u2BRjrCPKKPk9tdKWCOprm8eoGtjgiMDkHP4IyR2V4HDePdQJ0MvkSxxY7jWvMp32 9iBw== X-Received: by 10.52.31.36 with SMTP id x4mr3096565vdh.44.1361551068286; Fri, 22 Feb 2013 08:37:48 -0800 (PST) Received: from yakj.usersys.redhat.com (93-34-179-137.ip50.fastwebnet.it. [93.34.179.137]) by mx.google.com with ESMTPS id tp10sm4291733vec.1.2013.02.22.08.37.46 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 22 Feb 2013 08:37:47 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 22 Feb 2013 17:36:28 +0100 Message-Id: <1361551008-12430-23-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1361551008-12430-1-git-send-email-pbonzini@redhat.com> References: <1361551008-12430-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.212.51 Cc: owasserm@redhat.com, quintela@redhat.com Subject: [Qemu-devel] [PATCH 22/42] migration: run setup callbacks out of big lock X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Only the migration_bitmap_sync() call needs the iothread lock. Reviewed-by: Orit Wasserman Reviewed-by: Juan Quintela Signed-off-by: Paolo Bonzini --- arch_init.c | 10 ++++++---- block-migration.c | 2 ++ include/migration/vmstate.h | 2 +- migration.c | 2 -- savevm.c | 3 +++ 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/arch_init.c b/arch_init.c index 32b4378..6089c53 100644 --- a/arch_init.c +++ b/arch_init.c @@ -570,10 +570,6 @@ static int ram_save_setup(QEMUFile *f, void *opaque) bitmap_set(migration_bitmap, 0, ram_pages); migration_dirty_pages = ram_pages; - qemu_mutex_lock_ramlist(); - bytes_transferred = 0; - reset_ram_globals(); - if (migrate_use_xbzrle()) { XBZRLE.cache = cache_init(migrate_xbzrle_cache_size() / TARGET_PAGE_SIZE, @@ -587,8 +583,14 @@ static int ram_save_setup(QEMUFile *f, void *opaque) acct_clear(); } + qemu_mutex_lock_iothread(); + qemu_mutex_lock_ramlist(); + bytes_transferred = 0; + reset_ram_globals(); + memory_global_dirty_log_start(); migration_bitmap_sync(); + qemu_mutex_unlock_iothread(); qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE); diff --git a/block-migration.c b/block-migration.c index 8da5f86..2fd7699 100644 --- a/block-migration.c +++ b/block-migration.c @@ -583,10 +583,12 @@ static int block_save_setup(QEMUFile *f, void *opaque) DPRINTF("Enter save live setup submitted %d transferred %d\n", block_mig_state.submitted, block_mig_state.transferred); + qemu_mutex_lock_iothread(); init_blk_migration(f); /* start track dirty blocks */ set_dirty_tracking(1); + qemu_mutex_unlock_iothread(); ret = flush_blks(f); blk_mig_reset_dirty_cursor(); diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index 5f803f5..abc3b47 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -34,7 +34,6 @@ typedef struct SaveVMHandlers { void (*set_params)(const MigrationParams *params, void * opaque); SaveStateHandler *save_state; - int (*save_live_setup)(QEMUFile *f, void *opaque); void (*cancel)(void *opaque); int (*save_live_complete)(QEMUFile *f, void *opaque); @@ -49,6 +48,7 @@ typedef struct SaveVMHandlers { int (*save_live_iterate)(QEMUFile *f, void *opaque); /* This runs outside the iothread lock! */ + int (*save_live_setup)(QEMUFile *f, void *opaque); uint64_t (*save_live_pending)(QEMUFile *f, void *opaque, uint64_t max_size); LoadStateHandler *load_state; diff --git a/migration.c b/migration.c index 92a7152..e64c92d 100644 --- a/migration.c +++ b/migration.c @@ -660,10 +660,8 @@ static void *buffered_file_thread(void *opaque) bool old_vm_running = false; bool last_round = false; - qemu_mutex_lock_iothread(); DPRINTF("beginning savevm\n"); qemu_savevm_state_begin(s->file, &s->params); - qemu_mutex_unlock_iothread(); while (s->state == MIG_STATE_ACTIVE) { int64_t current_time; diff --git a/savevm.c b/savevm.c index e10a045..7c7774e 100644 --- a/savevm.c +++ b/savevm.c @@ -1768,7 +1768,10 @@ static int qemu_savevm_state(QEMUFile *f) return -EINVAL; } + qemu_mutex_unlock_iothread(); qemu_savevm_state_begin(f, ¶ms); + qemu_mutex_lock_iothread(); + while (qemu_file_get_error(f) == 0) { if (qemu_savevm_state_iterate(f) > 0) { break;