From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490290877332972.2986190136996; Thu, 23 Mar 2017 10:41:17 -0700 (PDT) Received: from localhost ([::1]:57683 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6jb-0006YW-Rs for importer@patchew.org; Thu, 23 Mar 2017 13:41:15 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6hy-0005Og-Np for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6hw-0002QQ-2g for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60446) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6hv-0002QJ-Sg for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:32 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E205442BAF for ; Thu, 23 Mar 2017 17:39:31 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1f032060; Thu, 23 Mar 2017 13:39:30 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E205442BAF Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E205442BAF From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:19 +0100 Message-Id: <20170323173928.14439-2-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 23 Mar 2017 17:39:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 01/10] blockjob: remove unnecessary check 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" !job is always checked prior to the call, drop it from here. Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- blockjob.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blockjob.c b/blockjob.c index 9b619f385..a9fb624 100644 --- a/blockjob.c +++ b/blockjob.c @@ -480,7 +480,7 @@ static bool block_job_should_pause(BlockJob *job) =20 bool block_job_user_paused(BlockJob *job) { - return job ? job->user_paused : 0; + return job->user_paused; } =20 void coroutine_fn block_job_pause_point(BlockJob *job) --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291019803611.0779881308908; Thu, 23 Mar 2017 10:43:39 -0700 (PDT) Received: from localhost ([::1]:57692 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6lu-0000L7-2F for importer@patchew.org; Thu, 23 Mar 2017 13:43:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6hy-0005Oh-OH for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6hx-0002Qe-F2 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54210) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6hx-0002QY-8n for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:33 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4972075EDE for ; Thu, 23 Mar 2017 17:39:33 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1g032060; Thu, 23 Mar 2017 13:39:32 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4972075EDE Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 4972075EDE From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:20 +0100 Message-Id: <20170323173928.14439-3-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 23 Mar 2017 17:39:33 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 02/10] blockjob: remove iostatus_reset callback 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is unused since commit 66a0fae ("blockjob: Don't touch BDS iostatus", 2016-05-19). Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Stefan Hajnoczi --- blockjob.c | 3 --- include/block/blockjob_int.h | 3 --- 2 files changed, 6 deletions(-) diff --git a/blockjob.c b/blockjob.c index a9fb624..24d1e12 100644 --- a/blockjob.c +++ b/blockjob.c @@ -555,9 +555,6 @@ bool block_job_is_cancelled(BlockJob *job) void block_job_iostatus_reset(BlockJob *job) { job->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; - if (job->driver->iostatus_reset) { - job->driver->iostatus_reset(job); - } } =20 static int block_job_finish_sync(BlockJob *job, diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index 3f86cc5..bfcc5d1 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -44,9 +44,6 @@ struct BlockJobDriver { /** Optional callback for job types that support setting a speed limit= */ void (*set_speed)(BlockJob *job, int64_t speed, Error **errp); =20 - /** Optional callback for job types that need to forward I/O status re= set */ - void (*iostatus_reset)(BlockJob *job); - /** Mandatory: Entrypoint for the Coroutine. */ CoroutineEntry *start; =20 --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291018235545.5415361895786; Thu, 23 Mar 2017 10:43:38 -0700 (PDT) Received: from localhost ([::1]:57691 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6ls-0000JP-3B for importer@patchew.org; Thu, 23 Mar 2017 13:43:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53831) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i0-0005Ov-25 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6hy-0002Qw-Rd for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53372) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6hy-0002Qi-Jk for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:34 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 96D90C03BD5F for ; Thu, 23 Mar 2017 17:39:34 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1h032060; Thu, 23 Mar 2017 13:39:33 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 96D90C03BD5F Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 96D90C03BD5F From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:21 +0100 Message-Id: <20170323173928.14439-4-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 23 Mar 2017 17:39:34 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 03/10] blockjob: introduce block_job_fail 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Outside blockjob.c, block_job_unref is only used when a block job fails to start, and block_job_ref is not used at all. The reference counting thus is pretty well hidden. Introduce a separate function to be used by block jobs; because block_job_ref and block_job_unref now become static, move them earlier in blockjob.c. Later on, block_job_fail will also have different locking than block_job_unref. Signed-off-by: Paolo Bonzini --- block/backup.c | 2 +- block/commit.c | 2 +- block/mirror.c | 2 +- blockjob.c | 47 ++++++++++++++++++++++++++--------------= ---- include/block/blockjob_int.h | 15 +++----------- tests/test-blockjob.c | 10 +++++----- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/block/backup.c b/block/backup.c index a4fb288..f284fd5 100644 --- a/block/backup.c +++ b/block/backup.c @@ -692,7 +692,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, } if (job) { backup_clean(&job->common); - block_job_unref(&job->common); + block_job_fail(&job->common); } =20 return NULL; diff --git a/block/commit.c b/block/commit.c index 2832482..9b9ea39 100644 --- a/block/commit.c +++ b/block/commit.c @@ -424,7 +424,7 @@ fail: if (commit_top_bs) { bdrv_set_backing_hd(overlay_bs, top, &error_abort); } - block_job_unref(&s->common); + block_job_fail(&s->common); } =20 =20 diff --git a/block/mirror.c b/block/mirror.c index ca4baa5..5cb2134 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1243,7 +1243,7 @@ fail: if (s) { g_free(s->replaces); blk_unref(s->target); - block_job_unref(&s->common); + block_job_fail(&s->common); } =20 bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL, diff --git a/blockjob.c b/blockjob.c index 24d1e12..1c63d15 100644 --- a/blockjob.c +++ b/blockjob.c @@ -106,6 +106,32 @@ BlockJob *block_job_get(const char *id) return NULL; } =20 +static void block_job_ref(BlockJob *job) +{ + ++job->refcnt; +} + +static void block_job_attached_aio_context(AioContext *new_context, + void *opaque); +static void block_job_detach_aio_context(void *opaque); + +static void block_job_unref(BlockJob *job) +{ + if (--job->refcnt =3D=3D 0) { + BlockDriverState *bs =3D blk_bs(job->blk); + bs->job =3D NULL; + block_job_remove_all_bdrv(job); + blk_remove_aio_context_notifier(job->blk, + block_job_attached_aio_context, + block_job_detach_aio_context, job); + blk_unref(job->blk); + error_free(job->blocker); + g_free(job->id); + QLIST_REMOVE(job, job_list); + g_free(job); + } +} + static void block_job_attached_aio_context(AioContext *new_context, void *opaque) { @@ -293,26 +319,9 @@ void block_job_start(BlockJob *job) qemu_coroutine_enter(job->co); } =20 -void block_job_ref(BlockJob *job) -{ - ++job->refcnt; -} - -void block_job_unref(BlockJob *job) +void block_job_fail(BlockJob *job) { - if (--job->refcnt =3D=3D 0) { - BlockDriverState *bs =3D blk_bs(job->blk); - bs->job =3D NULL; - block_job_remove_all_bdrv(job); - blk_remove_aio_context_notifier(job->blk, - block_job_attached_aio_context, - block_job_detach_aio_context, job); - blk_unref(job->blk); - error_free(job->blocker); - g_free(job->id); - QLIST_REMOVE(job, job_list); - g_free(job); - } + block_job_unref(job); } =20 static void block_job_completed_single(BlockJob *job) diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index bfcc5d1..97ffc43 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -156,21 +156,12 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType = type, int64_t ns); void block_job_yield(BlockJob *job); =20 /** - * block_job_ref: + * block_job_fail: * @bs: The block device. * - * Grab a reference to the block job. Should be paired with block_job_unre= f. + * The block job could not be started, free it. */ -void block_job_ref(BlockJob *job); - -/** - * block_job_unref: - * @bs: The block device. - * - * Release reference to the block job and release resources if it is the l= ast - * reference. - */ -void block_job_unref(BlockJob *job); +void block_job_fail(BlockJob *job); =20 /** * block_job_completed: diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 740e740..35bbbbc 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -116,11 +116,11 @@ static void test_job_ids(void) job[1] =3D do_test_id(blk[1], "id0", false); =20 /* But once job[0] finishes we can reuse its ID */ - block_job_unref(job[0]); + block_job_fail(job[0]); job[1] =3D do_test_id(blk[1], "id0", true); =20 /* No job ID specified, defaults to the backend name ('drive1') */ - block_job_unref(job[1]); + block_job_fail(job[1]); job[1] =3D do_test_id(blk[1], NULL, true); =20 /* Duplicate job ID */ @@ -133,9 +133,9 @@ static void test_job_ids(void) /* This one is valid */ job[2] =3D do_test_id(blk[2], "id_2", true); =20 - block_job_unref(job[0]); - block_job_unref(job[1]); - block_job_unref(job[2]); + block_job_fail(job[0]); + block_job_fail(job[1]); + block_job_fail(job[2]); =20 destroy_blk(blk[0]); destroy_blk(blk[1]); --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490290940446442.1402009984024; Thu, 23 Mar 2017 10:42:20 -0700 (PDT) Received: from localhost ([::1]:57687 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6kd-0007Un-4R for importer@patchew.org; Thu, 23 Mar 2017 13:42:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53846) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i1-0005Pz-Cv for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i0-0002RI-4c for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37358) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6hz-0002R9-Rv for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:36 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E1655624A9 for ; Thu, 23 Mar 2017 17:39:35 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1i032060; Thu, 23 Mar 2017 13:39:34 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E1655624A9 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E1655624A9 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:22 +0100 Message-Id: <20170323173928.14439-5-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 23 Mar 2017 17:39:36 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 04/10] blockjob: introduce block_job_pause/resume_all 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Remove use of block_job_pause/resume from outside blockjob.c, thus making them static. Again, one reason to do this is that block_job_pause/resume will have different locking rules compared to everything else that block.c and block/io.c use. Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- block/io.c | 18 +------- blockjob.c | 114 ++++++++++++++++++++++++++++---------------= ---- include/block/blockjob.h | 14 +++--- 3 files changed, 77 insertions(+), 69 deletions(-) diff --git a/block/io.c b/block/io.c index 2709a70..1cc9318 100644 --- a/block/io.c +++ b/block/io.c @@ -284,16 +284,9 @@ void bdrv_drain_all_begin(void) bool waited =3D true; BlockDriverState *bs; BdrvNextIterator it; - BlockJob *job =3D NULL; GSList *aio_ctxs =3D NULL, *ctx; =20 - while ((job =3D block_job_next(job))) { - AioContext *aio_context =3D blk_get_aio_context(job->blk); - - aio_context_acquire(aio_context); - block_job_pause(job); - aio_context_release(aio_context); - } + block_job_pause_all(); =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *aio_context =3D bdrv_get_aio_context(bs); @@ -337,7 +330,6 @@ void bdrv_drain_all_end(void) { BlockDriverState *bs; BdrvNextIterator it; - BlockJob *job =3D NULL; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *aio_context =3D bdrv_get_aio_context(bs); @@ -348,13 +340,7 @@ void bdrv_drain_all_end(void) aio_context_release(aio_context); } =20 - while ((job =3D block_job_next(job))) { - AioContext *aio_context =3D blk_get_aio_context(job->blk); - - aio_context_acquire(aio_context); - block_job_resume(job); - aio_context_release(aio_context); - } + block_job_resume_all(); } =20 void bdrv_drain_all(void) diff --git a/blockjob.c b/blockjob.c index 1c63d15..caca718 100644 --- a/blockjob.c +++ b/blockjob.c @@ -55,36 +55,6 @@ struct BlockJobTxn { =20 static QLIST_HEAD(, BlockJob) block_jobs =3D QLIST_HEAD_INITIALIZER(block_= jobs); =20 -static char *child_job_get_parent_desc(BdrvChild *c) -{ - BlockJob *job =3D c->opaque; - return g_strdup_printf("%s job '%s'", - BlockJobType_lookup[job->driver->job_type], - job->id); -} - -static const BdrvChildRole child_job =3D { - .get_parent_desc =3D child_job_get_parent_desc, - .stay_at_node =3D true, -}; - -static void block_job_drained_begin(void *opaque) -{ - BlockJob *job =3D opaque; - block_job_pause(job); -} - -static void block_job_drained_end(void *opaque) -{ - BlockJob *job =3D opaque; - block_job_resume(job); -} - -static const BlockDevOps block_job_dev_ops =3D { - .drained_begin =3D block_job_drained_begin, - .drained_end =3D block_job_drained_end, -}; - BlockJob *block_job_next(BlockJob *job) { if (!job) { @@ -106,6 +76,21 @@ BlockJob *block_job_get(const char *id) return NULL; } =20 +static void block_job_pause(BlockJob *job) +{ + job->pause_count++; +} + +static void block_job_resume(BlockJob *job) +{ + assert(job->pause_count > 0); + job->pause_count--; + if (job->pause_count) { + return; + } + block_job_enter(job); +} + static void block_job_ref(BlockJob *job) { ++job->refcnt; @@ -171,6 +156,36 @@ static void block_job_detach_aio_context(void *opaque) block_job_unref(job); } =20 +static char *child_job_get_parent_desc(BdrvChild *c) +{ + BlockJob *job =3D c->opaque; + return g_strdup_printf("%s job '%s'", + BlockJobType_lookup[job->driver->job_type], + job->id); +} + +static const BdrvChildRole child_job =3D { + .get_parent_desc =3D child_job_get_parent_desc, + .stay_at_node =3D true, +}; + +static void block_job_drained_begin(void *opaque) +{ + BlockJob *job =3D opaque; + block_job_pause(job); +} + +static void block_job_drained_end(void *opaque) +{ + BlockJob *job =3D opaque; + block_job_resume(job); +} + +static const BlockDevOps block_job_dev_ops =3D { + .drained_begin =3D block_job_drained_begin, + .drained_end =3D block_job_drained_end, +}; + void block_job_remove_all_bdrv(BlockJob *job) { GSList *l; @@ -471,11 +486,6 @@ void block_job_complete(BlockJob *job, Error **errp) job->driver->complete(job, errp); } =20 -void block_job_pause(BlockJob *job) -{ - job->pause_count++; -} - void block_job_user_pause(BlockJob *job) { job->user_paused =3D true; @@ -520,16 +530,6 @@ void coroutine_fn block_job_pause_point(BlockJob *job) } } =20 -void block_job_resume(BlockJob *job) -{ - assert(job->pause_count > 0); - job->pause_count--; - if (job->pause_count) { - return; - } - block_job_enter(job); -} - void block_job_user_resume(BlockJob *job) { if (job && job->user_paused && job->pause_count > 0) { @@ -723,6 +723,30 @@ static void block_job_event_completed(BlockJob *job, c= onst char *msg) &error_abort); } =20 +void block_job_pause_all(void) +{ + BlockJob *job =3D NULL; + while ((job =3D block_job_next(job))) { + AioContext *aio_context =3D blk_get_aio_context(job->blk); + + aio_context_acquire(aio_context); + block_job_pause(job); + aio_context_release(aio_context); + } +} + +void block_job_resume_all(void) +{ + BlockJob *job =3D NULL; + while ((job =3D block_job_next(job))) { + AioContext *aio_context =3D blk_get_aio_context(job->blk); + + aio_context_acquire(aio_context); + block_job_resume(job); + aio_context_release(aio_context); + } +} + void block_job_event_ready(BlockJob *job) { job->ready =3D true; diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 9e906f7..aac87cd 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -235,12 +235,11 @@ void block_job_complete(BlockJob *job, Error **errp); BlockJobInfo *block_job_query(BlockJob *job, Error **errp); =20 /** - * block_job_pause: - * @job: The job to be paused. + * block_job_pause_all: * - * Asynchronously pause the specified job. + * Asynchronously pause all jobs. */ -void block_job_pause(BlockJob *job); +void block_job_pause_all(void); =20 /** * block_job_user_pause: @@ -260,12 +259,11 @@ void block_job_user_pause(BlockJob *job); bool block_job_user_paused(BlockJob *job); =20 /** - * block_job_resume: - * @job: The job to be resumed. + * block_job_resume_all: * - * Resume the specified job. Must be paired with a preceding block_job_pa= use. + * Resume all block jobs. Must be paired with a preceding block_job_pause= _all. */ -void block_job_resume(BlockJob *job); +void block_job_resume_all(void); =20 /** * block_job_user_resume: --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490290884754817.2876799469448; Thu, 23 Mar 2017 10:41:24 -0700 (PDT) Received: from localhost ([::1]:57685 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6jj-0006f9-EX for importer@patchew.org; Thu, 23 Mar 2017 13:41:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53861) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i2-0005Qz-LU for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i1-0002Rh-Gz for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60548) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i1-0002RP-7O for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:37 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3CD232560 for ; Thu, 23 Mar 2017 17:39:37 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1j032060; Thu, 23 Mar 2017 13:39:36 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3CD232560 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3CD232560 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:23 +0100 Message-Id: <20170323173928.14439-6-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 23 Mar 2017 17:39:37 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 05/10] blockjob: separate monitor and blockjob APIs 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We already have different locking policies for APIs called by the monitor and the block job. Monitor APIs need consistency across block_job_get and the actual operation (e.g. block_job_set_speed), so currently there are explicit aio_context_acquire/release calls in blockdev.c. When a block job needs to do something instead it doesn't care about lockin= g, because the whole coroutine runs under the AioContext lock. When moving away from the AioContext lock, the monitor will have to call new block_job_lock/unlock APIs, while blockjob APIs will take care of this for the users. In preparation for that, keep all the blockjob APIs together in the blockjob.c file. Signed-off-by: Paolo Bonzini Reviewed-by: Stefan Hajnoczi --- blockjob.c | 206 +++++++++++++++++++++++++++++++--------------------------= ---- 1 file changed, 105 insertions(+), 101 deletions(-) diff --git a/blockjob.c b/blockjob.c index caca718..c5f1d19 100644 --- a/blockjob.c +++ b/blockjob.c @@ -334,11 +334,6 @@ void block_job_start(BlockJob *job) qemu_coroutine_enter(job->co); } =20 -void block_job_fail(BlockJob *job) -{ - block_job_unref(job); -} - static void block_job_completed_single(BlockJob *job) { if (!job->ret) { @@ -440,21 +435,6 @@ static void block_job_completed_txn_success(BlockJob *= job) } } =20 -void block_job_completed(BlockJob *job, int ret) -{ - assert(blk_bs(job->blk)->job =3D=3D job); - assert(!job->completed); - job->completed =3D true; - job->ret =3D ret; - if (!job->txn) { - block_job_completed_single(job); - } else if (ret < 0 || block_job_is_cancelled(job)) { - block_job_completed_txn_abort(job); - } else { - block_job_completed_txn_success(job); - } -} - void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp) { Error *local_err =3D NULL; @@ -492,44 +472,11 @@ void block_job_user_pause(BlockJob *job) block_job_pause(job); } =20 -static bool block_job_should_pause(BlockJob *job) -{ - return job->pause_count > 0; -} - bool block_job_user_paused(BlockJob *job) { return job->user_paused; } =20 -void coroutine_fn block_job_pause_point(BlockJob *job) -{ - assert(job && block_job_started(job)); - - if (!block_job_should_pause(job)) { - return; - } - if (block_job_is_cancelled(job)) { - return; - } - - if (job->driver->pause) { - job->driver->pause(job); - } - - if (block_job_should_pause(job) && !block_job_is_cancelled(job)) { - job->paused =3D true; - job->busy =3D false; - qemu_coroutine_yield(); /* wait for block_job_resume() */ - job->busy =3D true; - job->paused =3D false; - } - - if (job->driver->resume) { - job->driver->resume(job); - } -} - void block_job_user_resume(BlockJob *job) { if (job && job->user_paused && job->pause_count > 0) { @@ -538,13 +485,6 @@ void block_job_user_resume(BlockJob *job) } } =20 -void block_job_enter(BlockJob *job) -{ - if (job->co && !job->busy) { - qemu_coroutine_enter(job->co); - } -} - void block_job_cancel(BlockJob *job) { if (block_job_started(job)) { @@ -556,11 +496,6 @@ void block_job_cancel(BlockJob *job) } } =20 -bool block_job_is_cancelled(BlockJob *job) -{ - return job->cancelled; -} - void block_job_iostatus_reset(BlockJob *job) { job->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; @@ -628,42 +563,6 @@ int block_job_complete_sync(BlockJob *job, Error **err= p) return block_job_finish_sync(job, &block_job_complete, errp); } =20 -void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns) -{ - assert(job->busy); - - /* Check cancellation *before* setting busy =3D false, too! */ - if (block_job_is_cancelled(job)) { - return; - } - - job->busy =3D false; - if (!block_job_should_pause(job)) { - co_aio_sleep_ns(blk_get_aio_context(job->blk), type, ns); - } - job->busy =3D true; - - block_job_pause_point(job); -} - -void block_job_yield(BlockJob *job) -{ - assert(job->busy); - - /* Check cancellation *before* setting busy =3D false, too! */ - if (block_job_is_cancelled(job)) { - return; - } - - job->busy =3D false; - if (!block_job_should_pause(job)) { - qemu_coroutine_yield(); - } - job->busy =3D true; - - block_job_pause_point(job); -} - BlockJobInfo *block_job_query(BlockJob *job, Error **errp) { BlockJobInfo *info; @@ -723,6 +622,10 @@ static void block_job_event_completed(BlockJob *job, c= onst char *msg) &error_abort); } =20 +/* + * API for block job drivers and the block layer. + */ + void block_job_pause_all(void) { BlockJob *job =3D NULL; @@ -735,6 +638,59 @@ void block_job_pause_all(void) } } =20 +void block_job_fail(BlockJob *job) +{ + block_job_unref(job); +} + +void block_job_completed(BlockJob *job, int ret) +{ + assert(blk_bs(job->blk)->job =3D=3D job); + assert(!job->completed); + job->completed =3D true; + job->ret =3D ret; + if (!job->txn) { + block_job_completed_single(job); + } else if (ret < 0 || block_job_is_cancelled(job)) { + block_job_completed_txn_abort(job); + } else { + block_job_completed_txn_success(job); + } +} + +static bool block_job_should_pause(BlockJob *job) +{ + return job->pause_count > 0; +} + +void coroutine_fn block_job_pause_point(BlockJob *job) +{ + assert(job && block_job_started(job)); + + if (!block_job_should_pause(job)) { + return; + } + if (block_job_is_cancelled(job)) { + return; + } + + if (job->driver->pause) { + job->driver->pause(job); + } + + if (block_job_should_pause(job) && !block_job_is_cancelled(job)) { + job->paused =3D true; + job->busy =3D false; + qemu_coroutine_yield(); /* wait for block_job_resume() */ + job->busy =3D true; + job->paused =3D false; + } + + if (job->driver->resume) { + job->driver->resume(job); + } +} + void block_job_resume_all(void) { BlockJob *job =3D NULL; @@ -747,6 +703,54 @@ void block_job_resume_all(void) } } =20 +void block_job_enter(BlockJob *job) +{ + if (job->co && !job->busy) { + qemu_coroutine_enter(job->co); + } +} + +bool block_job_is_cancelled(BlockJob *job) +{ + return job->cancelled; +} + +void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns) +{ + assert(job->busy); + + /* Check cancellation *before* setting busy =3D false, too! */ + if (block_job_is_cancelled(job)) { + return; + } + + job->busy =3D false; + if (!block_job_should_pause(job)) { + co_aio_sleep_ns(blk_get_aio_context(job->blk), type, ns); + } + job->busy =3D true; + + block_job_pause_point(job); +} + +void block_job_yield(BlockJob *job) +{ + assert(job->busy); + + /* Check cancellation *before* setting busy =3D false, too! */ + if (block_job_is_cancelled(job)) { + return; + } + + job->busy =3D false; + if (!block_job_should_pause(job)) { + qemu_coroutine_yield(); + } + job->busy =3D true; + + block_job_pause_point(job); +} + void block_job_event_ready(BlockJob *job) { job->ready =3D true; --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291161116238.18634451354092; Thu, 23 Mar 2017 10:46:01 -0700 (PDT) Received: from localhost ([::1]:57707 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6oB-0002KP-Qo for importer@patchew.org; Thu, 23 Mar 2017 13:45:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53873) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i3-0005Rz-LV for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i2-0002S8-Oz for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54300) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i2-0002Rq-JR for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:38 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 94883A0E46 for ; Thu, 23 Mar 2017 17:39:38 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1k032060; Thu, 23 Mar 2017 13:39:37 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 94883A0E46 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 94883A0E46 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:24 +0100 Message-Id: <20170323173928.14439-7-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 23 Mar 2017 17:39:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 06/10] blockjob: move iostatus reset inside block_job_user_resume 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Outside blockjob.c, the block_job_iostatus_reset function is used once in the monitor and once in BlockBackend. When we introduce the block job mutex, block_job_iostatus_reset's client is going to be the block layer (for which blockjob.c will take the block job mutex) rather than the monitor (which will take the block job mutex by itself). The monitor's call to block_job_iostatus_reset from the monitor comes just before the sole call to block_job_user_resume, so reset the iostatus directly from block_job_iostatus_reset. This will avoid the need to introduce separate block_job_iostatus_reset and block_job_iostatus_reset_locked APIs. After making this change, move the function together with the others that were moved in the previous patch. Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- blockdev.c | 1 - blockjob.c | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/blockdev.c b/blockdev.c index c5b2c2c..fbc376b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3726,7 +3726,6 @@ void qmp_block_job_resume(const char *device, Error *= *errp) } =20 trace_qmp_block_job_resume(job); - block_job_iostatus_reset(job); block_job_user_resume(job); aio_context_release(aio_context); } diff --git a/blockjob.c b/blockjob.c index c5f1d19..c9cb5b1 100644 --- a/blockjob.c +++ b/blockjob.c @@ -481,6 +481,7 @@ void block_job_user_resume(BlockJob *job) { if (job && job->user_paused && job->pause_count > 0) { job->user_paused =3D false; + block_job_iostatus_reset(job); block_job_resume(job); } } @@ -496,11 +497,6 @@ void block_job_cancel(BlockJob *job) } } =20 -void block_job_iostatus_reset(BlockJob *job) -{ - job->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; -} - static int block_job_finish_sync(BlockJob *job, void (*finish)(BlockJob *, Error **errp), Error **errp) @@ -751,6 +747,11 @@ void block_job_yield(BlockJob *job) block_job_pause_point(job); } =20 +void block_job_iostatus_reset(BlockJob *job) +{ + job->iostatus =3D BLOCK_DEVICE_IO_STATUS_OK; +} + void block_job_event_ready(BlockJob *job) { job->ready =3D true; --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291023292294.19975236054086; Thu, 23 Mar 2017 10:43:43 -0700 (PDT) Received: from localhost ([::1]:57693 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6lx-0000Ni-TQ for importer@patchew.org; Thu, 23 Mar 2017 13:43:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53930) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i8-0005V5-0d for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i4-0002SZ-29 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50326) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i3-0002SM-SP for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:39 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E6A827713 for ; Thu, 23 Mar 2017 17:39:39 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1l032060; Thu, 23 Mar 2017 13:39:38 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E6A827713 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E6A827713 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:25 +0100 Message-Id: <20170323173928.14439-8-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 23 Mar 2017 17:39:40 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 07/10] blockjob: strengthen a bit test-blockjob-txn 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Unlike test-blockjob-txn, QMP releases the reference to the transaction before the jobs finish. Thus, while working on the next patch, qemu-iotest 124 showed a failure that the unit tests did not have. Make the unit test just a little nastier, so that it fails too. Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- tests/test-blockjob-txn.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c index 4ccbda1..bfc2aaa 100644 --- a/tests/test-blockjob-txn.c +++ b/tests/test-blockjob-txn.c @@ -165,6 +165,11 @@ static void test_pair_jobs(int expected1, int expected= 2) job2 =3D test_block_job_start(2, true, expected2, &result2); block_job_txn_add_job(txn, job2); =20 + /* Release our reference now to trigger as many nice + * use-after-free bugs as possible. + */ + block_job_txn_unref(txn); + if (expected1 =3D=3D -ECANCELED) { block_job_cancel(job1); } @@ -185,8 +190,6 @@ static void test_pair_jobs(int expected1, int expected2) =20 g_assert_cmpint(result1, =3D=3D, expected1); g_assert_cmpint(result2, =3D=3D, expected2); - - block_job_txn_unref(txn); } =20 static void test_pair_jobs_success(void) --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291387473359.88559673539316; Thu, 23 Mar 2017 10:49:47 -0700 (PDT) Received: from localhost ([::1]:57727 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6rq-0005K4-CU for importer@patchew.org; Thu, 23 Mar 2017 13:49:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i8-0005V4-0A for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i5-0002T0-D0 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60628) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i5-0002Sn-6d for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:41 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3A9A93F75C for ; Thu, 23 Mar 2017 17:39:41 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1m032060; Thu, 23 Mar 2017 13:39:40 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3A9A93F75C Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3A9A93F75C From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:26 +0100 Message-Id: <20170323173928.14439-9-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 23 Mar 2017 17:39:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 08/10] blockjob: introduce block_job_cancel_async 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- blockjob.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/blockjob.c b/blockjob.c index c9cb5b1..093962b 100644 --- a/blockjob.c +++ b/blockjob.c @@ -373,6 +373,12 @@ static void block_job_completed_single(BlockJob *job) block_job_unref(job); } =20 +static void block_job_cancel_async(BlockJob *job) +{ + job->cancelled =3D true; + block_job_iostatus_reset(job); +} + static void block_job_completed_txn_abort(BlockJob *job) { AioContext *ctx; @@ -397,7 +403,7 @@ static void block_job_completed_txn_abort(BlockJob *job) * them; this job, however, may or may not be cancelled, depen= ding * on the caller, so leave it. */ if (other_job !=3D job) { - other_job->cancelled =3D true; + block_job_cancel_async(other_job); } continue; } @@ -489,8 +495,7 @@ void block_job_user_resume(BlockJob *job) void block_job_cancel(BlockJob *job) { if (block_job_started(job)) { - job->cancelled =3D true; - block_job_iostatus_reset(job); + block_job_cancel_async(job); block_job_enter(job); } else { block_job_completed(job, -ECANCELED); --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291452975323.0013171358281; Thu, 23 Mar 2017 10:50:52 -0700 (PDT) Received: from localhost ([::1]:57736 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6st-0005u9-MV for importer@patchew.org; Thu, 23 Mar 2017 13:50:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53927) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i7-0005Uy-WE for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i6-0002TR-SV for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33460) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i6-0002TE-Jm for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:42 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9E6587AEA4 for ; Thu, 23 Mar 2017 17:39:42 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1n032060; Thu, 23 Mar 2017 13:39:41 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9E6587AEA4 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9E6587AEA4 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:27 +0100 Message-Id: <20170323173928.14439-10-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 23 Mar 2017 17:39:42 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 09/10] blockjob: reorganize block_job_completed_txn_abort 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This splits the part that touches job states from the part that invokes callbacks. It will be a bit simpler to understand once job states will be protected by a different mutex than the AioContext lock. Signed-off-by: Paolo Bonzini Reviewed-by: Stefan Hajnoczi --- blockjob.c | 165 ++++++++++++++++++++++++++++++++-------------------------= ---- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/blockjob.c b/blockjob.c index 093962b..3fa2885 100644 --- a/blockjob.c +++ b/blockjob.c @@ -76,6 +76,39 @@ BlockJob *block_job_get(const char *id) return NULL; } =20 +BlockJobTxn *block_job_txn_new(void) +{ + BlockJobTxn *txn =3D g_new0(BlockJobTxn, 1); + QLIST_INIT(&txn->jobs); + txn->refcnt =3D 1; + return txn; +} + +static void block_job_txn_ref(BlockJobTxn *txn) +{ + txn->refcnt++; +} + +void block_job_txn_unref(BlockJobTxn *txn) +{ + if (txn && --txn->refcnt =3D=3D 0) { + g_free(txn); + } +} + +void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job) +{ + if (!txn) { + return; + } + + assert(!job->txn); + job->txn =3D txn; + + QLIST_INSERT_HEAD(&txn->jobs, job, txn_list); + block_job_txn_ref(txn); +} + static void block_job_pause(BlockJob *job) { job->pause_count++; @@ -336,6 +369,8 @@ void block_job_start(BlockJob *job) =20 static void block_job_completed_single(BlockJob *job) { + assert(job->completed); + if (!job->ret) { if (job->driver->commit) { job->driver->commit(job); @@ -376,14 +411,49 @@ static void block_job_completed_single(BlockJob *job) static void block_job_cancel_async(BlockJob *job) { job->cancelled =3D true; - block_job_iostatus_reset(job); + if (!job->completed) { + block_job_iostatus_reset(job); + } +} + +static int block_job_finish_sync(BlockJob *job, + void (*finish)(BlockJob *, Error **errp), + Error **errp) +{ + Error *local_err =3D NULL; + int ret; + + assert(blk_bs(job->blk)->job =3D=3D job); + + block_job_ref(job); + + if (finish) { + finish(job, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + block_job_unref(job); + return -EBUSY; + } + /* block_job_drain calls block_job_enter, and it should be enough to + * induce progress until the job completes or moves to the main thread. + */ + while (!job->deferred_to_main_loop && !job->completed) { + block_job_drain(job); + } + while (!job->completed) { + aio_poll(qemu_get_aio_context(), true); + } + ret =3D (job->cancelled && job->ret =3D=3D 0) ? -ECANCELED : job->ret; + block_job_unref(job); + return ret; } =20 static void block_job_completed_txn_abort(BlockJob *job) { AioContext *ctx; BlockJobTxn *txn =3D job->txn; - BlockJob *other_job, *next; + BlockJob *other_job; =20 if (txn->aborting) { /* @@ -392,29 +462,34 @@ static void block_job_completed_txn_abort(BlockJob *j= ob) return; } txn->aborting =3D true; + block_job_txn_ref(txn); + /* We are the first failed job. Cancel other jobs. */ QLIST_FOREACH(other_job, &txn->jobs, txn_list) { ctx =3D blk_get_aio_context(other_job->blk); aio_context_acquire(ctx); } + + /* Other jobs are "effectively" cancelled by us, set the status for + * them; this job, however, may or may not be cancelled, depending + * on the caller, so leave it. */ QLIST_FOREACH(other_job, &txn->jobs, txn_list) { - if (other_job =3D=3D job || other_job->completed) { - /* Other jobs are "effectively" cancelled by us, set the statu= s for - * them; this job, however, may or may not be cancelled, depen= ding - * on the caller, so leave it. */ - if (other_job !=3D job) { - block_job_cancel_async(other_job); - } - continue; + if (other_job !=3D job) { + block_job_cancel_async(other_job); } - block_job_cancel_sync(other_job); - assert(other_job->completed); } - QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) { + while (!QLIST_EMPTY(&txn->jobs)) { + other_job =3D QLIST_FIRST(&txn->jobs); ctx =3D blk_get_aio_context(other_job->blk); + if (!other_job->completed) { + assert(other_job->cancelled); + block_job_finish_sync(other_job, NULL, NULL); + } block_job_completed_single(other_job); aio_context_release(ctx); } + + block_job_txn_unref(txn); } =20 static void block_job_completed_txn_success(BlockJob *job) @@ -502,37 +577,6 @@ void block_job_cancel(BlockJob *job) } } =20 -static int block_job_finish_sync(BlockJob *job, - void (*finish)(BlockJob *, Error **errp), - Error **errp) -{ - Error *local_err =3D NULL; - int ret; - - assert(blk_bs(job->blk)->job =3D=3D job); - - block_job_ref(job); - - finish(job, &local_err); - if (local_err) { - error_propagate(errp, local_err); - block_job_unref(job); - return -EBUSY; - } - /* block_job_drain calls block_job_enter, and it should be enough to - * induce progress until the job completes or moves to the main thread. - */ - while (!job->deferred_to_main_loop && !job->completed) { - block_job_drain(job); - } - while (!job->completed) { - aio_poll(qemu_get_aio_context(), true); - } - ret =3D (job->cancelled && job->ret =3D=3D 0) ? -ECANCELED : job->ret; - block_job_unref(job); - return ret; -} - /* A wrapper around block_job_cancel() taking an Error ** parameter so it = may be * used with block_job_finish_sync() without the need for (rather nasty) * function pointer casts there. */ @@ -856,36 +900,3 @@ void block_job_defer_to_main_loop(BlockJob *job, aio_bh_schedule_oneshot(qemu_get_aio_context(), block_job_defer_to_main_loop_bh, data); } - -BlockJobTxn *block_job_txn_new(void) -{ - BlockJobTxn *txn =3D g_new0(BlockJobTxn, 1); - QLIST_INIT(&txn->jobs); - txn->refcnt =3D 1; - return txn; -} - -static void block_job_txn_ref(BlockJobTxn *txn) -{ - txn->refcnt++; -} - -void block_job_txn_unref(BlockJobTxn *txn) -{ - if (txn && --txn->refcnt =3D=3D 0) { - g_free(txn); - } -} - -void block_job_txn_add_job(BlockJobTxn *txn, BlockJob *job) -{ - if (!txn) { - return; - } - - assert(!job->txn); - job->txn =3D txn; - - QLIST_INSERT_HEAD(&txn->jobs, job, txn_list); - block_job_txn_ref(txn); -} --=20 2.9.3 From nobody Sun May 5 08:55:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1490291165096414.10620551624277; Thu, 23 Mar 2017 10:46:05 -0700 (PDT) Received: from localhost ([::1]:57708 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6oF-0002Pp-R2 for importer@patchew.org; Thu, 23 Mar 2017 13:46:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53957) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cr6i8-0005Vt-T0 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cr6i8-0002U0-47 for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33508) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cr6i7-0002Th-UH for qemu-devel@nongnu.org; Thu, 23 Mar 2017 13:39:44 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EB5D77AEA1 for ; Thu, 23 Mar 2017 17:39:43 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-116-97.ams2.redhat.com [10.36.116.97]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2NHdS1o032060; Thu, 23 Mar 2017 13:39:42 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com EB5D77AEA1 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=pbonzini@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com EB5D77AEA1 From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 23 Mar 2017 18:39:28 +0100 Message-Id: <20170323173928.14439-11-pbonzini@redhat.com> In-Reply-To: <20170323173928.14439-1-pbonzini@redhat.com> References: <20170323173928.14439-1-pbonzini@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 23 Mar 2017 17:39:44 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 10/10] blockjob: use deferred_to_main_loop to indicate the coroutine has ended 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: jcody@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All block jobs are using block_job_defer_to_main_loop as the final step just before the coroutine terminates. At this point, block_job_enter should do nothing, but currently it restarts the freed coroutine. Now, the job->co states should probably be changed to an enum (e.g. BEFORE_START, STARTED, YIELDED, COMPLETED) subsuming block_job_started, job->deferred_to_main_loop and job->busy. For now, this patch eliminates the problematic reenter by removing the reset of job->deferred_to_main_loop (which served no purpose, as far as I could see) and checking the flag in block_job_enter. Signed-off-by: Paolo Bonzini Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi --- blockjob.c | 10 ++++++++-- include/block/blockjob_int.h | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/blockjob.c b/blockjob.c index 3fa2885..2d80dae 100644 --- a/blockjob.c +++ b/blockjob.c @@ -750,7 +750,14 @@ void block_job_resume_all(void) =20 void block_job_enter(BlockJob *job) { - if (job->co && !job->busy) { + if (!block_job_started(job)) { + return; + } + if (job->deferred_to_main_loop) { + return; + } + + if (!job->busy) { qemu_coroutine_enter(job->co); } } @@ -874,7 +881,6 @@ static void block_job_defer_to_main_loop_bh(void *opaqu= e) aio_context_acquire(aio_context); } =20 - data->job->deferred_to_main_loop =3D false; data->fn(data->job, data->opaque); =20 if (aio_context !=3D data->aio_context) { diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index 97ffc43..4d287ba 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -227,7 +227,8 @@ typedef void BlockJobDeferToMainLoopFn(BlockJob *job, v= oid *opaque); * @fn: The function to run in the main loop * @opaque: The opaque value that is passed to @fn * - * Execute a given function in the main loop with the BlockDriverState + * This function must be called by the main job coroutine just before it + * returns. @fn is executed in the main loop with the BlockDriverState * AioContext acquired. Block jobs must call bdrv_unref(), bdrv_close(), = and * anything that uses bdrv_drain_all() in the main loop. * --=20 2.9.3