From patchwork Thu Jun 16 13:18:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emanuele Giuseppe Esposito X-Patchwork-Id: 1644346 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=LsC+fzH4; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LP3H13X3cz9sGC for ; Thu, 16 Jun 2022 23:41:16 +1000 (AEST) Received: from localhost ([::1]:58348 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1o1pkG-0003sB-HC for incoming@patchwork.ozlabs.org; Thu, 16 Jun 2022 09:41:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51464) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1pOY-0005DD-DQ for qemu-devel@nongnu.org; Thu, 16 Jun 2022 09:18:49 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:51668) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1o1pOU-0007Wq-CP for qemu-devel@nongnu.org; Thu, 16 Jun 2022 09:18:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655385521; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=4rrqBrOgcKotZ5l4RrxrDpLacnpzAO5Ew4DWx4Ydb8A=; b=LsC+fzH4fRLingOeOUOW5WSbA33CfjFMIIjGxHKyhO7MsNqi/N3zcP6hKBBGrHLx7d+a5F rbsBkunxXCdl/pEN8Wdn16OQpyGK37bXDt/b4E9ceQi3upaCPgCB0G632f4Gm+gmnMklpx VqpxqX39/lugyZ8dFdi9iwVNUT22QiE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-544-kCb7-lVOM8iC1njhjQlcaw-1; Thu, 16 Jun 2022 09:18:37 -0400 X-MC-Unique: kCb7-lVOM8iC1njhjQlcaw-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6BC85101E985; Thu, 16 Jun 2022 13:18:37 +0000 (UTC) Received: from virtlab701.virt.lab.eng.bos.redhat.com (virtlab701.virt.lab.eng.bos.redhat.com [10.19.152.228]) by smtp.corp.redhat.com (Postfix) with ESMTP id D9FF5403350; Thu, 16 Jun 2022 13:18:36 +0000 (UTC) From: Emanuele Giuseppe Esposito To: qemu-block@nongnu.org Cc: Kevin Wolf , Hanna Reitz , Paolo Bonzini , John Snow , Vladimir Sementsov-Ogievskiy , Wen Congyang , Xie Changlong , Markus Armbruster , Stefan Hajnoczi , Fam Zheng , qemu-devel@nongnu.org, Emanuele Giuseppe Esposito Subject: [PATCH v7 00/18] job: replace AioContext lock with job_mutex Date: Thu, 16 Jun 2022 09:18:17 -0400 Message-Id: <20220616131835.2004262-1-eesposit@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 Received-SPF: pass client-ip=170.10.133.124; envelope-from=eesposit@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.082, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 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" In this series, we want to remove the AioContext lock and instead use the already existent job_mutex to protect the job structures and list. This is part of the work to get rid of AioContext lock usage in favour of smaller granularity locks. In order to simplify reviewer's job, job lock/unlock functions and macros are added as empty prototypes (nop) in patch 1. They are converted to use the actual job mutex only in the last patch. In this way we can freely create locking sections without worrying about deadlocks with the aiocontext lock. Patch 2 defines what fields in the job structure need protection. Patches 3-6 are in preparation to the job locks, moving functions from global to static and introducing helpers. Patch 7-9 introduce the (nop) job lock into the job API and its users, and patches 10-13 categorize respectively locked and unlocked functions in the job API. Patches 14-17 take care of protecting job->aio_context, and finally patch 18 makes the prototypes in patch 1 use the job_mutex and removes all aiocontext lock at the same time. Tested this series by running unit tests, qemu-iotests and qtests (x86_64). --- v7: * s/temporary/temporarly * double identical locking comment to the same function * patch 2: add "Protected by AioContext lock" to better categorize fields in job.h * use same comment style in all function headers ("Just like {funct}, but called between job_lock and job_unlock") v6: * patch 4 and 6 squashed with patch 19 (enable job lock and reduce/remove AioContext lock) * patch 19: job_unref_locked read the aiocontext inside the job lock. v5: * just restructured patches a little bit better, as there were functions used before they were defined. * rebased on kwolf/block branch and API split serie v4: * move "protected by job_mutex" from patch 2 to 15, where the job_mutex is actually added. * s/aio_co_enter/aio_co_schedule in job.c, and adjust tests accordingly. * remove job_get_aio_context, add job_set_aio_context. Use "fake rwlock" to protect job->aiocontext. * get rid of useless getters method, namely: job_get_status job_get_pause_count job_get_paused job_get_busy They are all used only by tests, and such getter is pretty useless. Replace with job_lock(); assert(); job_unlock(); * use job lock macros instead of job lock/unlock in unit tests. * convert also blockjob functions to have _locked * put the job_lock/unlock patches before the _locked ones * replace aio_co_enter in job.c and detect change of context v3: * add "_locked" suffix to the functions called under job_mutex lock * rename _job_lock in real_job_lock * job_mutex is now public, and drivers like monitor use it directly * introduce and protect job_get_aio_context * remove mirror-specific APIs and just use WITH_JOB_GUARD * more extensive use of WITH_JOB_GUARD and JOB_LOCK_GUARD RFC v2: * use JOB_LOCK_GUARD and WITH_JOB_LOCK_GUARD * mu(u)ltiple typos in commit messages * job API split patches are sent separately in another series * use of empty job_{lock/unlock} and JOB_LOCK_GUARD/WITH_JOB_LOCK_GUARD to avoid deadlocks and simplify the reviewer job * move patch 11 (block_job_query: remove atomic read) as last Emanuele Giuseppe Esposito (17): job.c: make job_mutex and job_lock/unlock() public job.h: categorize fields in struct Job job.c: API functions not used outside should be static aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED job.h: add _locked duplicates for job API functions called with and without job_mutex jobs: protect jobs with job_lock/unlock jobs: add job lock in find_* functions jobs: use job locks also in the unit tests block/mirror.c: use of job helpers in drivers to avoid TOC/TOU jobs: rename static functions called with job_mutex held job.h: rename job API functions called with job_mutex held block_job: rename block_job functions called with job_mutex held job.h: define unlocked functions commit and mirror: create new nodes using bdrv_get_aio_context, and not the job aiocontext jobs: protect job.aio_context with BQL and job_mutex job.c: enable job lock/unlock and remove Aiocontext locks block_job_query: remove atomic read Paolo Bonzini (1): job: detect change of aiocontext within job coroutine block.c | 19 +- block/backup.c | 4 +- block/commit.c | 4 +- block/mirror.c | 21 +- block/replication.c | 10 +- blockdev.c | 143 +++---- blockjob.c | 126 +++--- include/block/aio-wait.h | 17 +- include/block/blockjob.h | 29 +- include/qemu/job.h | 303 +++++++++----- job-qmp.c | 87 ++-- job.c | 658 +++++++++++++++++++------------ monitor/qmp-cmds.c | 7 +- qemu-img.c | 41 +- tests/unit/test-bdrv-drain.c | 80 ++-- tests/unit/test-block-iothread.c | 8 +- tests/unit/test-blockjob-txn.c | 32 +- tests/unit/test-blockjob.c | 113 ++++-- 18 files changed, 1034 insertions(+), 668 deletions(-)