From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Steve Sistare <steven.sistare@oracle.com>
Cc: "Daniel P. Berrange" <berrange@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Juan Quintela" <quintela@redhat.com>,
qemu-devel@nongnu.org, "Markus Armbruster" <armbru@redhat.com>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: Re: [PATCH V1 01/32] savevm: add vmstate handler iterators
Date: Fri, 11 Sep 2020 17:24:41 +0100 [thread overview]
Message-ID: <20200911162441.GJ3310@work-vm> (raw)
In-Reply-To: <1596122076-341293-2-git-send-email-steven.sistare@oracle.com>
Apologies for taking a while to get around to this,
* Steve Sistare (steven.sistare@oracle.com) wrote:
> Provide the SAVEVM_FOREACH and SAVEVM_FORALL macros to loop over all save
> VM state handlers. The former will filter handlers based on the operation
> in the later patch "savevm: VM handlers mode mask". The latter loops over
> all handlers.
>
> No functional change.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
> migration/savevm.c | 57 ++++++++++++++++++++++++++++++++++++------------------
> 1 file changed, 38 insertions(+), 19 deletions(-)
>
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 45c9dd9..a07fcad 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -266,6 +266,25 @@ static SaveState savevm_state = {
> .global_section_id = 0,
> };
>
> +/*
> + * The FOREACH macros will filter handlers based on the current operation when
> + * additional conditions are added in a subsequent patch.
> + */
> +
> +#define SAVEVM_FOREACH(se, entry) \
> + QTAILQ_FOREACH(se, &savevm_state.handlers, entry) \
> +
> +#define SAVEVM_FOREACH_SAFE(se, entry, new_se) \
> + QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) \
> +
> +/* The FORALL macros unconditionally loop over all handlers. */
> +
> +#define SAVEVM_FORALL(se, entry) \
> + QTAILQ_FOREACH(se, &savevm_state.handlers, entry)
> +
> +#define SAVEVM_FORALL_SAFE(se, entry, new_se) \
> + QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se)
> +
OK, can I ask you to merge this with the next patch but to spin it the
other way, so that we have:
SAVEVM_FOR(se, entry, mask)
and the places you use SAVEVM_FORALL_SAFE would become
SAVEVM_FOR(se, entry, VMS_MODE_ALL)
I'm thinking at some point in the future we could merge a bunch of the
other flag checks in there.
Dave
> static bool should_validate_capability(int capability)
> {
> assert(capability >= 0 && capability < MIGRATION_CAPABILITY__MAX);
> @@ -673,7 +692,7 @@ static uint32_t calculate_new_instance_id(const char *idstr)
> SaveStateEntry *se;
> uint32_t instance_id = 0;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FORALL(se, entry) {
> if (strcmp(idstr, se->idstr) == 0
> && instance_id <= se->instance_id) {
> instance_id = se->instance_id + 1;
> @@ -689,7 +708,7 @@ static int calculate_compat_instance_id(const char *idstr)
> SaveStateEntry *se;
> int instance_id = 0;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FORALL(se, entry) {
> if (!se->compat) {
> continue;
> }
> @@ -803,7 +822,7 @@ void unregister_savevm(VMStateIf *obj, const char *idstr, void *opaque)
> }
> pstrcat(id, sizeof(id), idstr);
>
> - QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
> + SAVEVM_FORALL_SAFE(se, entry, new_se) {
> if (strcmp(se->idstr, id) == 0 && se->opaque == opaque) {
> savevm_state_handler_remove(se);
> g_free(se->compat);
> @@ -867,7 +886,7 @@ void vmstate_unregister(VMStateIf *obj, const VMStateDescription *vmsd,
> {
> SaveStateEntry *se, *new_se;
>
> - QTAILQ_FOREACH_SAFE(se, &savevm_state.handlers, entry, new_se) {
> + SAVEVM_FORALL_SAFE(se, entry, new_se) {
> if (se->vmsd == vmsd && se->opaque == opaque) {
> savevm_state_handler_remove(se);
> g_free(se->compat);
> @@ -1119,7 +1138,7 @@ bool qemu_savevm_state_blocked(Error **errp)
> {
> SaveStateEntry *se;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FORALL(se, entry) {
> if (se->vmsd && se->vmsd->unmigratable) {
> error_setg(errp, "State blocked by non-migratable device '%s'",
> se->idstr);
> @@ -1145,7 +1164,7 @@ bool qemu_savevm_state_guest_unplug_pending(void)
> {
> SaveStateEntry *se;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (se->vmsd && se->vmsd->dev_unplug_pending &&
> se->vmsd->dev_unplug_pending(se->opaque)) {
> return true;
> @@ -1162,7 +1181,7 @@ void qemu_savevm_state_setup(QEMUFile *f)
> int ret;
>
> trace_savevm_state_setup();
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->save_setup) {
> continue;
> }
> @@ -1193,7 +1212,7 @@ int qemu_savevm_state_resume_prepare(MigrationState *s)
>
> trace_savevm_state_resume_prepare();
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->resume_prepare) {
> continue;
> }
> @@ -1223,7 +1242,7 @@ int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy)
> int ret = 1;
>
> trace_savevm_state_iterate();
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->save_live_iterate) {
> continue;
> }
> @@ -1291,7 +1310,7 @@ void qemu_savevm_state_complete_postcopy(QEMUFile *f)
> SaveStateEntry *se;
> int ret;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->save_live_complete_postcopy) {
> continue;
> }
> @@ -1324,7 +1343,7 @@ int qemu_savevm_state_complete_precopy_iterable(QEMUFile *f, bool in_postcopy)
> SaveStateEntry *se;
> int ret;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops ||
> (in_postcopy && se->ops->has_postcopy &&
> se->ops->has_postcopy(se->opaque)) ||
> @@ -1366,7 +1385,7 @@ int qemu_savevm_state_complete_precopy_non_iterable(QEMUFile *f,
> vmdesc = qjson_new();
> json_prop_int(vmdesc, "page_size", qemu_target_page_size());
> json_start_array(vmdesc, "devices");
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
>
> if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
> continue;
> @@ -1476,7 +1495,7 @@ void qemu_savevm_state_pending(QEMUFile *f, uint64_t threshold_size,
> *res_postcopy_only = 0;
>
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->save_live_pending) {
> continue;
> }
> @@ -1501,7 +1520,7 @@ void qemu_savevm_state_cleanup(void)
> }
>
> trace_savevm_state_cleanup();
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (se->ops && se->ops->save_cleanup) {
> se->ops->save_cleanup(se->opaque);
> }
> @@ -1580,7 +1599,7 @@ int qemu_save_device_state(QEMUFile *f)
> }
> cpu_synchronize_all_states();
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> int ret;
>
> if (se->is_ram) {
> @@ -1612,7 +1631,7 @@ static SaveStateEntry *find_se(const char *idstr, uint32_t instance_id)
> {
> SaveStateEntry *se;
>
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FORALL(se, entry) {
> if (!strcmp(se->idstr, idstr) &&
> (instance_id == se->instance_id ||
> instance_id == se->alias_id))
> @@ -2334,7 +2353,7 @@ qemu_loadvm_section_part_end(QEMUFile *f, MigrationIncomingState *mis)
> }
>
> trace_qemu_loadvm_state_section_partend(section_id);
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (se->load_section_id == section_id) {
> break;
> }
> @@ -2400,7 +2419,7 @@ static int qemu_loadvm_state_setup(QEMUFile *f)
> int ret;
>
> trace_loadvm_state_setup();
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (!se->ops || !se->ops->load_setup) {
> continue;
> }
> @@ -2425,7 +2444,7 @@ void qemu_loadvm_state_cleanup(void)
> SaveStateEntry *se;
>
> trace_loadvm_state_cleanup();
> - QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
> + SAVEVM_FOREACH(se, entry) {
> if (se->ops && se->ops->load_cleanup) {
> se->ops->load_cleanup(se->opaque);
> }
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-09-11 16:25 UTC|newest]
Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-30 15:14 [PATCH V1 00/32] Live Update Steve Sistare
2020-07-30 15:14 ` [PATCH V1 01/32] savevm: add vmstate handler iterators Steve Sistare
2020-09-11 16:24 ` Dr. David Alan Gilbert [this message]
2020-09-24 21:43 ` Steven Sistare
2020-09-25 9:07 ` Dr. David Alan Gilbert
2020-07-30 15:14 ` [PATCH V1 02/32] savevm: VM handlers mode mask Steve Sistare
2020-07-30 15:14 ` [PATCH V1 03/32] savevm: QMP command for cprsave Steve Sistare
2020-07-30 16:12 ` Eric Blake
2020-07-30 17:52 ` Steven Sistare
2020-09-11 16:43 ` Dr. David Alan Gilbert
2020-09-25 18:43 ` Steven Sistare
2020-09-25 22:22 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 04/32] savevm: HMP Command " Steve Sistare
2020-09-11 16:57 ` Dr. David Alan Gilbert
2020-09-24 21:44 ` Steven Sistare
2020-09-25 9:26 ` Dr. David Alan Gilbert
2020-07-30 15:14 ` [PATCH V1 05/32] savevm: QMP command for cprload Steve Sistare
2020-07-30 16:14 ` Eric Blake
2020-07-30 18:00 ` Steven Sistare
2020-09-11 17:18 ` Dr. David Alan Gilbert
2020-09-24 21:49 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 06/32] savevm: HMP Command " Steve Sistare
2020-07-30 15:14 ` [PATCH V1 07/32] savevm: QMP command for cprinfo Steve Sistare
2020-07-30 16:17 ` Eric Blake
2020-07-30 18:02 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 08/32] savevm: HMP " Steve Sistare
2020-09-11 17:27 ` Dr. David Alan Gilbert
2020-09-24 21:50 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 09/32] savevm: prevent cprsave if memory is volatile Steve Sistare
2020-09-11 17:35 ` Dr. David Alan Gilbert
2020-09-24 21:51 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 10/32] kvmclock: restore paused KVM clock Steve Sistare
2020-09-11 17:50 ` Dr. David Alan Gilbert
2020-09-25 18:07 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 11/32] cpu: disable ticks when suspended Steve Sistare
2020-09-11 17:53 ` Dr. David Alan Gilbert
2020-09-24 20:42 ` Steven Sistare
2020-09-25 9:03 ` Dr. David Alan Gilbert
2020-07-30 15:14 ` [PATCH V1 12/32] vl: pause option Steve Sistare
2020-07-30 16:20 ` Eric Blake
2020-07-30 18:11 ` Steven Sistare
2020-07-31 10:07 ` Daniel P. Berrangé
2020-07-31 15:18 ` Steven Sistare
2020-07-30 17:03 ` Alex Bennée
2020-07-30 18:14 ` Steven Sistare
2020-07-31 9:44 ` Alex Bennée
2020-09-11 17:59 ` Dr. David Alan Gilbert
2020-09-24 21:51 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 13/32] gdbstub: gdb support for suspended state Steve Sistare
2020-09-11 18:41 ` Dr. David Alan Gilbert
2020-09-24 21:51 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 14/32] savevm: VMS_RESTART and cprsave restart Steve Sistare
2020-07-30 16:22 ` Eric Blake
2020-07-30 18:14 ` Steven Sistare
2020-09-11 18:44 ` Dr. David Alan Gilbert
2020-09-24 21:44 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 15/32] vl: QEMU_START_FREEZE env var Steve Sistare
2020-09-11 18:49 ` Dr. David Alan Gilbert
2020-09-24 21:47 ` Steven Sistare
2020-09-25 15:52 ` Dr. David Alan Gilbert
2020-07-30 15:14 ` [PATCH V1 16/32] oslib: add qemu_clr_cloexec Steve Sistare
2020-09-11 18:52 ` Dr. David Alan Gilbert
2020-07-30 15:14 ` [PATCH V1 17/32] util: env var helpers Steve Sistare
2020-09-11 19:00 ` Dr. David Alan Gilbert
2020-09-24 21:52 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 18/32] osdep: import MADV_DOEXEC Steve Sistare
2020-08-17 18:30 ` Steven Sistare
2020-08-17 20:48 ` Alex Williamson
2020-08-17 21:20 ` Steven Sistare
2020-08-17 21:44 ` Alex Williamson
2020-08-18 2:42 ` Alex Williamson
2020-08-19 21:52 ` Steven Sistare
2020-08-24 22:30 ` Alex Williamson
2020-10-08 16:32 ` Steven Sistare
2020-10-15 20:36 ` Alex Williamson
2020-10-19 16:33 ` Steven Sistare
2020-10-26 18:28 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 19/32] memory: ram_block_add cosmetic changes Steve Sistare
2020-07-30 15:14 ` [PATCH V1 20/32] vl: add helper to request re-exec Steve Sistare
2020-07-30 15:14 ` [PATCH V1 21/32] exec, memory: exec(3) to restart Steve Sistare
2020-07-30 15:14 ` [PATCH V1 22/32] char: qio_channel_socket_accept reuse fd Steve Sistare
2020-09-15 17:33 ` Dr. David Alan Gilbert
2020-09-15 17:53 ` Daniel P. Berrangé
2020-09-24 21:54 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 23/32] char: save/restore chardev socket fds Steve Sistare
2020-07-30 15:14 ` [PATCH V1 24/32] ui: save/restore vnc " Steve Sistare
2020-07-31 9:06 ` Daniel P. Berrangé
2020-07-31 16:51 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 25/32] char: save/restore chardev pty fds Steve Sistare
2020-07-30 15:14 ` [PATCH V1 26/32] monitor: save/restore QMP negotiation status Steve Sistare
2020-07-30 15:14 ` [PATCH V1 27/32] vhost: reset vhost devices upon cprsave Steve Sistare
2020-07-30 15:14 ` [PATCH V1 28/32] char: restore terminal on restart Steve Sistare
2020-07-30 15:14 ` [PATCH V1 29/32] pci: export pci_update_mappings Steve Sistare
2020-07-30 15:14 ` [PATCH V1 30/32] vfio-pci: save and restore Steve Sistare
2020-08-06 10:22 ` Jason Zeng
2020-08-07 20:38 ` Steven Sistare
2020-08-10 3:50 ` Jason Zeng
2020-08-19 21:15 ` Steven Sistare
2020-08-20 10:33 ` Jason Zeng
2020-10-07 21:25 ` Steven Sistare
2020-07-30 15:14 ` [PATCH V1 31/32] vfio-pci: trace pci config Steve Sistare
2020-07-30 15:14 ` [PATCH V1 32/32] vfio-pci: improved tracing Steve Sistare
2020-09-15 18:49 ` Dr. David Alan Gilbert
2020-09-24 21:52 ` Steven Sistare
2020-07-30 16:52 ` [PATCH V1 00/32] Live Update Daniel P. Berrangé
2020-07-30 18:48 ` Steven Sistare
2020-07-31 8:53 ` Daniel P. Berrangé
2020-07-31 15:27 ` Steven Sistare
2020-07-31 15:52 ` Daniel P. Berrangé
2020-07-31 17:20 ` Steven Sistare
2020-08-11 19:08 ` Dr. David Alan Gilbert
2020-07-30 17:15 ` Paolo Bonzini
2020-07-30 19:09 ` Steven Sistare
2020-07-30 21:39 ` Paolo Bonzini
2020-07-31 19:22 ` Steven Sistare
2020-07-30 17:49 ` Dr. David Alan Gilbert
2020-07-30 19:31 ` Steven Sistare
2020-08-04 18:18 ` Steven Sistare
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=20200911162441.GJ3310@work-vm \
--to=dgilbert@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@redhat.com \
--cc=steven.sistare@oracle.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.