From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Lidong Chen <jemmy858585@gmail.com>
Cc: zhang.zhanghailiang@huawei.com, quintela@redhat.com,
berrange@redhat.com, aviadye@mellanox.com, pbonzini@redhat.com,
qemu-devel@nongnu.org, adido@mellanox.com, galsha@mellanox.com,
Lidong Chen <lidongchen@tencent.com>
Subject: Re: [Qemu-devel] [PATCH v5 08/10] migration: create a dedicated thread to release rdma resource
Date: Wed, 27 Jun 2018 19:59:53 +0100 [thread overview]
Message-ID: <20180627185952.GJ2423@work-vm> (raw)
In-Reply-To: <1528212489-19137-9-git-send-email-lidongchen@tencent.com>
* Lidong Chen (jemmy858585@gmail.com) wrote:
> ibv_dereg_mr wait for a long time for big memory size virtual server.
>
> The test result is:
> 10GB 326ms
> 20GB 699ms
> 30GB 1021ms
> 40GB 1387ms
> 50GB 1712ms
> 60GB 2034ms
> 70GB 2457ms
> 80GB 2807ms
> 90GB 3107ms
> 100GB 3474ms
> 110GB 3735ms
> 120GB 4064ms
> 130GB 4567ms
> 140GB 4886ms
>
> this will cause the guest os hang for a while when migration finished.
> So create a dedicated thread to release rdma resource.
>
> Signed-off-by: Lidong Chen <lidongchen@tencent.com>
> ---
> migration/rdma.c | 43 +++++++++++++++++++++++++++----------------
> 1 file changed, 27 insertions(+), 16 deletions(-)
>
> diff --git a/migration/rdma.c b/migration/rdma.c
> index dfa4f77..f12e8d5 100644
> --- a/migration/rdma.c
> +++ b/migration/rdma.c
> @@ -2979,35 +2979,46 @@ static void qio_channel_rdma_set_aio_fd_handler(QIOChannel *ioc,
> }
> }
>
> -static int qio_channel_rdma_close(QIOChannel *ioc,
> - Error **errp)
> +static void *qio_channel_rdma_close_thread(void *arg)
> {
> - QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
> - RDMAContext *rdmain, *rdmaout;
> - trace_qemu_rdma_close();
> + RDMAContext **rdma = arg;
> + RDMAContext *rdmain = rdma[0];
> + RDMAContext *rdmaout = rdma[1];
>
> - rdmain = rioc->rdmain;
> - if (rdmain) {
> - atomic_rcu_set(&rioc->rdmain, NULL);
> - }
> -
> - rdmaout = rioc->rdmaout;
> - if (rdmaout) {
> - atomic_rcu_set(&rioc->rdmaout, NULL);
> - }
> + rcu_register_thread();
>
> synchronize_rcu();
* see below
> -
> if (rdmain) {
> qemu_rdma_cleanup(rdmain);
> }
> -
> if (rdmaout) {
> qemu_rdma_cleanup(rdmaout);
> }
>
> g_free(rdmain);
> g_free(rdmaout);
> + g_free(rdma);
> +
> + rcu_unregister_thread();
> + return NULL;
> +}
> +
> +static int qio_channel_rdma_close(QIOChannel *ioc,
> + Error **errp)
> +{
> + QemuThread t;
> + QIOChannelRDMA *rioc = QIO_CHANNEL_RDMA(ioc);
> + RDMAContext **rdma = g_new0(RDMAContext*, 2);
> +
> + trace_qemu_rdma_close();
> + if (rioc->rdmain || rioc->rdmaout) {
> + rdma[0] = rioc->rdmain;
> + rdma[1] = rioc->rdmaout;
> + qemu_thread_create(&t, "rdma cleanup", qio_channel_rdma_close_thread,
> + rdma, QEMU_THREAD_DETACHED);
> + atomic_rcu_set(&rioc->rdmain, NULL);
> + atomic_rcu_set(&rioc->rdmaout, NULL);
I'm not sure this pair is ordered with the synchronise_rcu above;
Doesn't that mean, on a bad day, that you could get:
main-thread rdma_cleanup another-thread
qmu_thread_create
synchronise_rcu
reads rioc->rdmain
starts doing something with rdmain
atomic_rcu_set
rdma_cleanup
so the another-thread is using it during the cleanup?
Would just moving the atomic_rcu_sets before the qemu_thread_create
fix that?
However, I've got other worries as well:
a) qemu_rdma_cleanup does:
migrate_get_current()->state == MIGRATION_STATUS_CANCELLING
which worries me a little if someone immediately tries to restart
the migration.
b) I don't understand what happens if someone does try and restart
the migration after that, but in the ~5s it takes the ibv cleanup
to happen.
Dave
> + }
>
> return 0;
> }
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2018-06-27 19:00 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-05 15:27 [Qemu-devel] [PATCH v5 00/10] Enable postcopy RDMA live migration Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 01/10] migration: disable RDMA WRITE after postcopy started Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 02/10] migration: create a dedicated connection for rdma return path Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 03/10] migration: avoid concurrent invoke channel_close by different threads Lidong Chen
2018-06-13 17:02 ` Daniel P. Berrangé
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 04/10] migration: implement bi-directional RDMA QIOChannel Lidong Chen
2018-06-13 14:21 ` Dr. David Alan Gilbert
2018-06-27 15:31 ` 858585 jemmy
2018-06-27 15:32 ` Dr. David Alan Gilbert
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 05/10] migration: Stop rdma yielding during incoming postcopy Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 06/10] migration: implement io_set_aio_fd_handler function for RDMA QIOChannel Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 07/10] migration: invoke qio_channel_yield only when qemu_in_coroutine() Lidong Chen
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 08/10] migration: create a dedicated thread to release rdma resource Lidong Chen
2018-06-27 18:59 ` Dr. David Alan Gilbert [this message]
2018-07-05 14:26 ` 858585 jemmy
2018-07-19 5:49 ` 858585 jemmy
2018-07-23 14:54 ` Gal Shachaf
2018-07-27 5:34 ` 858585 jemmy
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 09/10] migration: poll the cm event while wait RDMA work request completion Lidong Chen
2018-06-13 14:24 ` Dr. David Alan Gilbert
2018-06-14 2:42 ` 858585 jemmy
2018-06-05 15:28 ` [Qemu-devel] [PATCH v5 10/10] migration: implement the shutdown for RDMA QIOChannel Lidong Chen
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=20180627185952.GJ2423@work-vm \
--to=dgilbert@redhat.com \
--cc=adido@mellanox.com \
--cc=aviadye@mellanox.com \
--cc=berrange@redhat.com \
--cc=galsha@mellanox.com \
--cc=jemmy858585@gmail.com \
--cc=lidongchen@tencent.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=zhang.zhanghailiang@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.