From patchwork Thu Mar 1 16:36:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 879938 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XFtJ9ydk"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zsdXH5Bvkz9s3D for ; Fri, 2 Mar 2018 03:42:55 +1100 (AEDT) Received: from localhost ([::1]:58014 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRID-0002qf-QP for incoming@patchwork.ozlabs.org; Thu, 01 Mar 2018 11:42:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCJ-0006jN-JS for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCH-0002wD-Hi for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:47 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:50310) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCH-0002v7-6N; Thu, 01 Mar 2018 11:36:45 -0500 Received: by mail-wm0-x242.google.com with SMTP id w128so13410127wmw.0; Thu, 01 Mar 2018 08:36:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=St1PuUguZbmMkN9L21Dlcjj8WJIP8O3mx03xlKZx5BA=; b=XFtJ9ydkP5+Z7gS/Wf8ZuI5+kfAP/ZM/oKjioVGFFyrcPw77VfZofsDIjFD/BsGnkA 649EgmXe6y3XWeVyVlPWXnUCceFEMzYYytrIQsB+MvG1gKkusyXgWWJPOUyE4eH9EYSZ 0Ij1a4c+6pd8OmAddKEJ/NPLpsjj2bA3YF1twZEAe1EyRQpVxHUGy1K41A7x8qESUmUA Mbyz7eLFbMN6wUXxOQgr/d1O6j589YC7leyVlEuPtnrAPod6UIfLS2roCUhio9gDgEpd yFLVTWHqq7GWDtnpSMjtBU/i3KlX5yx13BKw46FZ/hNluyQBKemwsn8xPzHmzwpeGNoC 4vhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=St1PuUguZbmMkN9L21Dlcjj8WJIP8O3mx03xlKZx5BA=; b=TPNT/CSfr0k1dQRsMKdHSHqzbGMgfYXQW4NFlDEPHCoxTpZ+0qwzlqoe6pItxYcBfR ZQtRYbW3AhRZXzgCy19biM9mDOKT4OHeF+1q/ATvAgADsVyv200s6C9DqMcPEiGm2JPB wgLJIPlQEl6lGIPY8tFCzXqCL+P16oGelsNrPgx+vJ/Gmt3YqRgqa0bTY1x8mr1DdLDY xDT/3O3h7KyjsmV6opXrt+oZAm1ADxKsg5FX2MNSOxisK3WWDG8J9N8qcNQE20O+R10Y dzcG2OU7r0ycT7CWzlXl6HWPoj0GbpqIm4qR8QHOOzuBKa0qJee3aI9jCEExqQET3qKa g0lg== X-Gm-Message-State: AElRT7EsH8cUbe9VimatH8RJt4y27xs9yaoMcABikl3MI2QMyA+1eDXV XOfMCHxHc8c0+5n1VDrOUBo/t77V X-Google-Smtp-Source: AG47ELt6sxufEmGblq/zDFlkJpOomayMOlKVrY8CgLOAlKdvkJQDV6ZS38sLhM5F0R9ERTTM9OlPew== X-Received: by 10.28.113.205 with SMTP id d74mr2609018wmi.3.1519922203685; Thu, 01 Mar 2018 08:36:43 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:17 +0100 Message-Id: <20180301163619.21072-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PATCH 6/8] qed: make bdrv_qed_do_open a coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" It is called from qed_invalidate_cache in coroutine context (incoming migration runs in a coroutine), so it's cleaner if metadata is always loaded from a coroutine. Signed-off-by: Paolo Bonzini Message-Id: <1516279431-30424-5-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini --- block/qed.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/block/qed.c b/block/qed.c index dd31c5046e..d379c8c2f0 100644 --- a/block/qed.c +++ b/block/qed.c @@ -381,8 +381,9 @@ static void bdrv_qed_init_state(BlockDriverState *bs) qemu_co_queue_init(&s->allocating_write_reqs); } -static int bdrv_qed_do_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) +/* Called with table_lock held. */ +static int coroutine_fn bdrv_qed_do_open(BlockDriverState *bs, QDict *options, + int flags, Error **errp) { BDRVQEDState *s = bs->opaque; QEDHeader le_header; @@ -513,9 +514,35 @@ out: return ret; } +typedef struct QEDOpenCo { + BlockDriverState *bs; + QDict *options; + int flags; + Error **errp; + int ret; +} QEDOpenCo; + +static void coroutine_fn bdrv_qed_open_entry(void *opaque) +{ + QEDOpenCo *qoc = opaque; + BDRVQEDState *s = qoc->bs->opaque; + + qemu_co_mutex_lock(&s->table_lock); + qoc->ret = bdrv_qed_do_open(qoc->bs, qoc->options, qoc->flags, qoc->errp); + qemu_co_mutex_unlock(&s->table_lock); +} + static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { + QEDOpenCo qoc = { + .bs = bs, + .options = options, + .flags = flags, + .errp = errp, + .ret = -EINPROGRESS + }; + bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, false, errp); if (!bs->file) { @@ -523,7 +550,14 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags, } bdrv_qed_init_state(bs); - return bdrv_qed_do_open(bs, options, flags, errp); + if (qemu_in_coroutine()) { + bdrv_qed_open_entry(&qoc); + } else { + qemu_coroutine_enter(qemu_coroutine_create(bdrv_qed_open_entry, &qoc)); + BDRV_POLL_WHILE(bs, qoc.ret == -EINPROGRESS); + } + BDRV_POLL_WHILE(bs, qoc.ret == -EINPROGRESS); + return qoc.ret; } static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)