qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 00/20] job: replace AioContext lock with job_mutex
@ 2022-02-08 14:34 Emanuele Giuseppe Esposito
  2022-02-08 14:34 ` [PATCH v5 01/20] job.c: make job_mutex and job_lock/unlock() public Emanuele Giuseppe Esposito
                   ` (19 more replies)
  0 siblings, 20 replies; 49+ messages in thread
From: Emanuele Giuseppe Esposito @ 2022-02-08 14:34 UTC (permalink / raw)
  To: qemu-block
  Cc: Kevin Wolf, Fam Zheng, Vladimir Sementsov-Ogievskiy, Wen Congyang,
	Xie Changlong, Emanuele Giuseppe Esposito, Markus Armbruster,
	qemu-devel, Hanna Reitz, Stefan Hajnoczi, Paolo Bonzini,
	John Snow

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).

This serie is based on my previous series "block layer: split
block APIs in global state and I/O" and also depends on the new
converted tests 141 and 185.

Based-on: <20220121170544.2049944-1-eesposit@redhat.com>
---
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 (19):
  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
  job.c: move inner aiocontext lock in callbacks
  aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED
  jobs: remove aiocontext locks since the functions are under BQL
  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                       | 124 +++---
 blockjob.c                       | 132 ++++---
 include/block/aio-wait.h         |  15 +-
 include/block/blockjob.h         |  29 +-
 include/qemu/job.h               | 304 ++++++++++-----
 job-qmp.c                        |  74 ++--
 job.c                            | 648 ++++++++++++++++++-------------
 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, 1001 insertions(+), 664 deletions(-)

-- 
2.31.1



^ permalink raw reply	[flat|nested] 49+ messages in thread

end of thread, other threads:[~2022-03-10 10:27 UTC | newest]

Thread overview: 49+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-08 14:34 [PATCH v5 00/20] job: replace AioContext lock with job_mutex Emanuele Giuseppe Esposito
2022-02-08 14:34 ` [PATCH v5 01/20] job.c: make job_mutex and job_lock/unlock() public Emanuele Giuseppe Esposito
2022-02-10 15:38   ` Stefan Hajnoczi
2022-02-08 14:34 ` [PATCH v5 02/20] job.h: categorize fields in struct Job Emanuele Giuseppe Esposito
2022-02-10 15:40   ` Stefan Hajnoczi
2022-02-10 16:26     ` Emanuele Giuseppe Esposito
2022-02-10 17:35       ` Stefan Hajnoczi
2022-02-11  9:00         ` Emanuele Giuseppe Esposito
2022-02-08 14:34 ` [PATCH v5 03/20] job.c: API functions not used outside should be static Emanuele Giuseppe Esposito
2022-02-10 15:43   ` Stefan Hajnoczi
2022-02-08 14:34 ` [PATCH v5 04/20] job.c: move inner aiocontext lock in callbacks Emanuele Giuseppe Esposito
2022-02-17 13:45   ` Stefan Hajnoczi
2022-02-24  9:20     ` Emanuele Giuseppe Esposito
2022-02-24  9:29     ` Emanuele Giuseppe Esposito
2022-02-08 14:34 ` [PATCH v5 05/20] aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED Emanuele Giuseppe Esposito
2022-02-17 13:56   ` Stefan Hajnoczi
2022-02-08 14:34 ` [PATCH v5 06/20] jobs: remove aiocontext locks since the functions are under BQL Emanuele Giuseppe Esposito
2022-02-17 14:12   ` Stefan Hajnoczi
2022-02-24  9:27     ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 07/20] job.h: add _locked duplicates for job API functions called with and without job_mutex Emanuele Giuseppe Esposito
2022-02-17 14:20   ` Stefan Hajnoczi
2022-02-24  9:52     ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 08/20] jobs: protect jobs with job_lock/unlock Emanuele Giuseppe Esposito
2022-02-17 14:48   ` Stefan Hajnoczi
2022-02-24 12:45     ` Emanuele Giuseppe Esposito
2022-02-24 16:48       ` Stefan Hajnoczi
2022-02-24 16:55         ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 09/20] jobs: add job lock in find_* functions Emanuele Giuseppe Esposito
2022-02-17 15:00   ` Stefan Hajnoczi
2022-02-24 12:36     ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 10/20] jobs: use job locks also in the unit tests Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 11/20] block/mirror.c: use of job helpers in drivers to avoid TOC/TOU Emanuele Giuseppe Esposito
2022-02-17 16:53   ` Stefan Hajnoczi
2022-02-08 14:35 ` [PATCH v5 12/20] jobs: rename static functions called with job_mutex held Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 13/20] job.h: rename job API " Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 14/20] block_job: rename block_job " Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 15/20] job.h: define unlocked functions Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 16/20] commit and mirror: create new nodes using bdrv_get_aio_context, and not the job aiocontext Emanuele Giuseppe Esposito
2022-03-08 11:13   ` Stefan Hajnoczi
2022-02-08 14:35 ` [PATCH v5 17/20] job: detect change of aiocontext within job coroutine Emanuele Giuseppe Esposito
2022-03-08 11:19   ` Stefan Hajnoczi
2022-02-08 14:35 ` [PATCH v5 18/20] jobs: protect job.aio_context with BQL and job_mutex Emanuele Giuseppe Esposito
2022-03-08 13:41   ` Stefan Hajnoczi
2022-03-10 10:09     ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 19/20] job.c: enable job lock/unlock and remove Aiocontext locks Emanuele Giuseppe Esposito
2022-03-08 14:04   ` Stefan Hajnoczi
2022-03-10 10:25     ` Emanuele Giuseppe Esposito
2022-02-08 14:35 ` [PATCH v5 20/20] block_job_query: remove atomic read Emanuele Giuseppe Esposito
2022-03-08 14:06   ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).