From: Stefan Reiter <s.reiter@proxmox.com>
To: Max Reitz <mreitz@redhat.com>
Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, slp@redhat.com,
qemu-block@nongnu.org, qemu-devel@nongnu.org,
stefanha@redhat.com, jsnow@redhat.com, dietmar@proxmox.com
Subject: Re: [PATCH v4 2/3] replication: acquire aio context before calling job_cancel_sync
Date: Thu, 2 Apr 2020 17:05:04 +0200 [thread overview]
Message-ID: <67ea19c5-077d-08b8-e1f8-9978e3e37fff@proxmox.com> (raw)
In-Reply-To: <7d231bb6-4b1c-1cd1-51a6-4bef97de65e0@redhat.com>
On 02/04/2020 14:41, Max Reitz wrote:
> On 01.04.20 10:15, Stefan Reiter wrote:
>> job_cancel_sync requires the job's lock to be held, all other callers
>> already do this (replication_stop, drive_backup_abort,
>> blockdev_backup_abort, job_cancel_sync_all, cancel_common).
>
> I think all other callers come directly from QMP, though, so they have
> no locks yet. This OTOH is called from a block driver function, so I
> would assume the BDS context is locked already (or rather, this is
> executed in the BDS context).
>
> I also think that the commit job runs in the same context. So I would
> assume that this would be a nested lock, which should be unnecessary and
> might cause problems. Maybe we should just assert that the job’s
> context is the current context?
>
> (Or would that still be problematic because now job_txn_apply() wants to
> release some context, and that isn’t possible without this patch? I
> would hope it’s possible, because I think we shouldn’t have to acquire
> the current context, and should be free to release it...? I have no
> idea. Maybe we are actually free to reacquire the current context here.)
>
You're right, this seems to be unnecessary. Adding an
assert(commit_job->aio_context == qemu_get_current_aio_context());
to make sure seems like a good idea though. bdrv_close appears to always
have the lock on its driver's context held.
>> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
>> ---
>> block/replication.c | 8 +++++++-
>> 1 file changed, 7 insertions(+), 1 deletion(-)
>>
>> diff --git a/block/replication.c b/block/replication.c
>> index 413d95407d..17ddc31569 100644
>> --- a/block/replication.c
>> +++ b/block/replication.c
>> @@ -144,12 +144,18 @@ fail:
>> static void replication_close(BlockDriverState *bs)
>> {
>> BDRVReplicationState *s = bs->opaque;
>> + Job *commit_job;
>> + AioContext *commit_ctx;
>>
>> if (s->stage == BLOCK_REPLICATION_RUNNING) {
>> replication_stop(s->rs, false, NULL);
>> }
>> if (s->stage == BLOCK_REPLICATION_FAILOVER) {
>> - job_cancel_sync(&s->commit_job->job);
>> + commit_job = &s->commit_job->job;
>> + commit_ctx = commit_job->aio_context;
>> + aio_context_acquire(commit_ctx);
>> + job_cancel_sync(commit_job);
>> + aio_context_release(commit_ctx);
>
> Anyway, there’s also the problem that I would guess the
> job_cancel_sync() might move the job from its current context back into
> the main context. Then we’d release the wrong context here.
> > Max
>
>> }
>>
>> if (s->mode == REPLICATION_MODE_SECONDARY) {
>>
>
>
next prev parent reply other threads:[~2020-04-02 15:09 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-01 8:15 [PATCH v4 0/3] Fix some AIO context locking in jobs Stefan Reiter
2020-04-01 8:15 ` [PATCH v4 1/3] job: take each job's lock individually in job_txn_apply Stefan Reiter
2020-04-02 12:33 ` Max Reitz
2020-04-02 15:04 ` Stefan Reiter
2020-04-01 8:15 ` [PATCH v4 2/3] replication: acquire aio context before calling job_cancel_sync Stefan Reiter
2020-04-02 12:41 ` Max Reitz
2020-04-02 15:05 ` Stefan Reiter [this message]
2020-04-01 8:15 ` [PATCH v4 3/3] backup: don't acquire aio_context in backup_clean Stefan Reiter
2020-04-02 12:59 ` Max Reitz
2020-04-02 12:48 ` [PATCH v4 0/3] Fix some AIO context locking in jobs Kevin Wolf
2020-04-06 20:11 ` John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=67ea19c5-077d-08b8-e1f8-9978e3e37fff@proxmox.com \
--to=s.reiter@proxmox.com \
--cc=dietmar@proxmox.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=slp@redhat.com \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).