From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Alexey Perevalov <a.perevalov@samsung.com>
Cc: qemu-devel@nongnu.org, i.maximets@samsung.com, peterx@redhat.com,
eblake@redhat.com, quintela@redhat.com, heetae82.ahn@samsung.com
Subject: Re: [Qemu-devel] [PATCH v10 06/10] migration: add postcopy blocktime ctx into MigrationIncomingState
Date: Thu, 21 Sep 2017 11:16:09 +0100 [thread overview]
Message-ID: <20170921101608.GA2717@work-vm> (raw)
In-Reply-To: <1505839684-10046-7-git-send-email-a.perevalov@samsung.com>
* Alexey Perevalov (a.perevalov@samsung.com) wrote:
> This patch adds request to kernel space for UFFD_FEATURE_THREAD_ID,
> in case when this feature is provided by kernel.
>
> PostcopyBlocktimeContext is incapsulated inside postcopy-ram.c,
> due to it's postcopy only feature.
> Also it defines PostcopyBlocktimeContext's instance live time.
> Information from PostcopyBlocktimeContext instance will be provided
> much after postcopy migration end, instance of PostcopyBlocktimeContext
> will live till QEMU exit, but part of it (vcpu_addr,
> page_fault_vcpu_time) used only during calculation, will be released
> when postcopy ended or failed.
>
> To enable postcopy blocktime calculation on destination, need to request
> proper capabiltiy (Patch for documentation will be at the tail of the patch
> set).
>
> As an example following command enable that capability, assume QEMU was
> started with
> -chardev socket,id=charmonitor,path=/var/lib/migrate-vm-monitor.sock
> option to control it
>
> [root@host]#printf "{\"execute\" : \"qmp_capabilities\"}\r\n \
> {\"execute\": \"migrate-set-capabilities\" , \"arguments\": {
> \"capabilities\": [ { \"capability\": \"postcopy-blocktime\", \"state\":
> true } ] } }" | nc -U /var/lib/migrate-vm-monitor.sock
>
> Or just with HMP
> (qemu) migrate_set_capability postcopy-blocktime on
>
> Signed-off-by: Alexey Perevalov <a.perevalov@samsung.com>
> ---
> migration/migration.h | 8 ++++++
> migration/postcopy-ram.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 73 insertions(+)
>
> diff --git a/migration/migration.h b/migration/migration.h
> index 56bf33c..770466b 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -21,6 +21,8 @@
> #include "qemu/coroutine_int.h"
> #include "hw/qdev.h"
>
> +struct PostcopyBlocktimeContext;
> +
> /* State for the incoming migration */
> struct MigrationIncomingState {
> QEMUFile *from_src_file;
> @@ -58,6 +60,12 @@ struct MigrationIncomingState {
> /* The coroutine we should enter (back) after failover */
> Coroutine *migration_incoming_co;
> QemuSemaphore colo_incoming_sem;
> +
> + /*
> + * PostcopyBlocktimeContext to keep information for postcopy
> + * live migration, to calculate vCPU block time
> + * */
> + struct PostcopyBlocktimeContext *blocktime_ctx;
> };
>
> MigrationIncomingState *migration_incoming_get_current(void);
> diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
> index bec6c2c..cc78981 100644
> --- a/migration/postcopy-ram.c
> +++ b/migration/postcopy-ram.c
> @@ -61,6 +61,58 @@ struct PostcopyDiscardState {
> #include <sys/eventfd.h>
> #include <linux/userfaultfd.h>
>
> +typedef struct PostcopyBlocktimeContext {
> + /* time when page fault initiated per vCPU */
> + int64_t *page_fault_vcpu_time;
> + /* page address per vCPU */
> + uint64_t *vcpu_addr;
> + int64_t total_blocktime;
> + /* blocktime per vCPU */
> + int64_t *vcpu_blocktime;
> + /* point in time when last page fault was initiated */
> + int64_t last_begin;
> + /* number of vCPU are suspended */
> + int smp_cpus_down;
> +
> + /*
> + * Handler for exit event, necessary for
> + * releasing whole blocktime_ctx
> + */
> + Notifier exit_notifier;
> + /*
> + * Handler for postcopy event, necessary for
> + * releasing unnecessary part of blocktime_ctx
> + */
> + Notifier postcopy_notifier;
Is this actually used? It's just that...
> +} PostcopyBlocktimeContext;
> +
> +static void destroy_blocktime_context(struct PostcopyBlocktimeContext *ctx)
> +{
> + g_free(ctx->page_fault_vcpu_time);
> + g_free(ctx->vcpu_addr);
> + g_free(ctx->vcpu_blocktime);
> + g_free(ctx);
> +}
> +
> +static void migration_exit_cb(Notifier *n, void *data)
> +{
> + PostcopyBlocktimeContext *ctx = container_of(n, PostcopyBlocktimeContext,
> + exit_notifier);
> + destroy_blocktime_context(ctx);
> +}
> +
> +static struct PostcopyBlocktimeContext *blocktime_context_new(void)
> +{
> + PostcopyBlocktimeContext *ctx = g_new0(PostcopyBlocktimeContext, 1);
> + ctx->page_fault_vcpu_time = g_new0(int64_t, smp_cpus);
> + ctx->vcpu_addr = g_new0(uint64_t, smp_cpus);
> + ctx->vcpu_blocktime = g_new0(int64_t, smp_cpus);
> +
> + ctx->exit_notifier.notify = migration_exit_cb;
> + qemu_add_exit_notifier(&ctx->exit_notifier);
> + add_migration_state_change_notifier(&ctx->postcopy_notifier);
Patch 7 removes that line, and I don't see what puts it back;
and this line doesn't actually set up ctx->postcopy_notifier.
Other than that, it looks OK.
Dave
> + return ctx;
> +}
>
> /**
> * receive_ufd_features: check userfault fd features, to request only supported
> @@ -153,6 +205,19 @@ static bool ufd_check_and_apply(int ufd, MigrationIncomingState *mis)
> }
> }
>
> +#ifdef UFFD_FEATURE_THREAD_ID
> + if (migrate_postcopy_blocktime() && mis &&
> + UFFD_FEATURE_THREAD_ID & supported_features) {
> + /* kernel supports that feature */
> + /* don't create blocktime_context if it exists */
> + if (!mis->blocktime_ctx) {
> + mis->blocktime_ctx = blocktime_context_new();
> + }
> +
> + asked_features |= UFFD_FEATURE_THREAD_ID;
> + }
> +#endif
> +
> /*
> * request features, even if asked_features is 0, due to
> * kernel expects UFFD_API before UFFDIO_REGISTER, per
> --
> 1.9.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2017-09-21 10:16 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20170919164818eucas1p292f634ca79c4b7ed8e83d1529dd23c04@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 00/10] calculate blocktime for postcopy live migration Alexey Perevalov
[not found] ` <CGME20170919164820eucas1p25f16f91aa65933fa18cdff7cb7b7444c@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 01/10] userfault: update kernel header for UFFD_FEATURE_* Alexey Perevalov
2017-09-20 18:43 ` Dr. David Alan Gilbert
2017-09-21 7:33 ` Alexey Perevalov
[not found] ` <CGME20170919164821eucas1p2c3d141e6ae576901e95212d1136b0453@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 02/10] migration: pass MigrationIncomingState* into migration check functions Alexey Perevalov
2017-09-20 9:01 ` Juan Quintela
[not found] ` <CGME20170919164822eucas1p2e2b1f9bbf32fdb171a8db1e6d75941ef@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 03/10] migration: fix hardcoded function name in error report Alexey Perevalov
[not found] ` <CGME20170919164822eucas1p27957a05191b242b4982f62fab15a4539@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 04/10] migration: split ufd_version_check onto receive/request features part Alexey Perevalov
[not found] ` <CGME20170919164823eucas1p25540d608fc48a5e0ebd2f170416aec45@eucas1p2.samsung.com>
2017-09-19 16:47 ` [Qemu-devel] [PATCH v10 05/10] migration: introduce postcopy-blocktime capability Alexey Perevalov
[not found] ` <CGME20170919164824eucas1p23607e53e3ea38f8be4e885bb960e803f@eucas1p2.samsung.com>
2017-09-19 16:48 ` [Qemu-devel] [PATCH v10 06/10] migration: add postcopy blocktime ctx into MigrationIncomingState Alexey Perevalov
2017-09-21 10:16 ` Dr. David Alan Gilbert [this message]
2017-09-21 11:27 ` Alexey Perevalov
[not found] ` <CGME20170919164825eucas1p213639e95387bf054270d020f1d7dbfe9@eucas1p2.samsung.com>
2017-09-19 16:48 ` [Qemu-devel] [PATCH v10 07/10] migration: calculate vCPU blocktime on dst side Alexey Perevalov
2017-09-21 11:57 ` Dr. David Alan Gilbert
2017-09-22 8:47 ` Alexey Perevalov
2017-09-28 8:01 ` Alexey Perevalov
[not found] ` <CGME20170919164825eucas1p21fd133a55091e4a09fdeee05d130260d@eucas1p2.samsung.com>
2017-09-19 16:48 ` [Qemu-devel] [PATCH v10 08/10] migration: postcopy_blocktime documentation Alexey Perevalov
2017-09-21 12:33 ` Dr. David Alan Gilbert
2017-09-21 13:26 ` Alexey Perevalov
2017-09-21 14:40 ` Dr. David Alan Gilbert
[not found] ` <CGME20170919164826eucas1p249e6e9759612d74cd5c69bd375a01cd9@eucas1p2.samsung.com>
2017-09-19 16:48 ` [Qemu-devel] [PATCH v10 09/10] migration: add blocktime calculation into postcopy-test Alexey Perevalov
2017-09-21 12:39 ` Dr. David Alan Gilbert
[not found] ` <CGME20170919164827eucas1p231a5b9afd8e81427db114e57a0b6fbbe@eucas1p2.samsung.com>
2017-09-19 16:48 ` [Qemu-devel] [PATCH v10 10/10] migration: add postcopy total blocktime into query-migrate Alexey Perevalov
2017-09-19 17:41 ` Eric Blake
2017-09-21 12:42 ` Dr. David Alan Gilbert
2017-09-21 15:24 ` Alexey Perevalov
2017-09-21 16:44 ` Dr. David Alan Gilbert
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=20170921101608.GA2717@work-vm \
--to=dgilbert@redhat.com \
--cc=a.perevalov@samsung.com \
--cc=eblake@redhat.com \
--cc=heetae82.ahn@samsung.com \
--cc=i.maximets@samsung.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.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).