From patchwork Fri Feb 15 17:46:53 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 220791 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 2C7112C007B for ; Sat, 16 Feb 2013 04:56:44 +1100 (EST) Received: from localhost ([::1]:54720 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U6PP3-0007U1-PP for incoming@patchwork.ozlabs.org; Fri, 15 Feb 2013 12:48:53 -0500 Received: from eggs.gnu.org ([208.118.235.92]:51297) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U6POe-0006n4-Kd for qemu-devel@nongnu.org; Fri, 15 Feb 2013 12:48:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U6POU-0004Ny-SF for qemu-devel@nongnu.org; Fri, 15 Feb 2013 12:48:28 -0500 Received: from mail-ve0-f182.google.com ([209.85.128.182]:39028) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U6POT-0004M2-K9 for qemu-devel@nongnu.org; Fri, 15 Feb 2013 12:48:18 -0500 Received: by mail-ve0-f182.google.com with SMTP id ox1so3305526veb.13 for ; Fri, 15 Feb 2013 09:48:08 -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=1B8sUYWtGRayILwlCm/4BGgBZzin9QrjrnbPmUDSElk=; b=Xm2OMLo/tBHdFG7gZTzy7KqG22A9ZJOcX51phhwbRmhjqRWrvEYcsaMUc7l46wJYMQ R+1s119eS2cobEknvv+Sas3YH7y34E7ueK2L0T5VB01lILoWh7+iA6AKu7beA9fPxCcl MTXfN+1tEYydF/jPiJwvrlXiOw2oDdUArbiKvLeWcnFl2qtcpT+/pZP6Y2vFREXqMtzb R+o03gvt/Y/xhDdDo62iJxF+392ykwJurUrDrB8IRAldMqJpW6yMFwUggOnh1DIUDGlx fFbLK1583ttzLECX5VbHHuDrFDuB7NqOizX4k0xHgZMrtC1Z+lzhTOBvKQZrfPZ2K/xH pAhA== X-Received: by 10.52.90.211 with SMTP id by19mr3710736vdb.114.1360950488714; Fri, 15 Feb 2013 09:48:08 -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 yu12sm65402142vec.6.2013.02.15.09.48.06 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 15 Feb 2013 09:48:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 15 Feb 2013 18:46:53 +0100 Message-Id: <1360950433-17106-22-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.2 In-Reply-To: <1360950433-17106-1-git-send-email-pbonzini@redhat.com> References: <1360950433-17106-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.128.182 Cc: owasserm@redhat.com, chegu_vinod@hp.com, quintela@redhat.com Subject: [Qemu-devel] [PATCH 21/41] 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. Signed-off-by: Paolo Bonzini Reviewed-by: Orit Wasserman Reviewed-by: Juan Quintela --- 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 adca555..6f0e389 100644 --- a/arch_init.c +++ b/arch_init.c @@ -569,10 +569,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, @@ -586,8 +582,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 143180c..d673658 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 cb7f7b4..d6a7dff 100644 --- a/migration.c +++ b/migration.c @@ -648,10 +648,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 = qemu_get_clock_ms(rt_clock); 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;