From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Cc: Laurent Vivier <lvivier@redhat.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v3 11/20] migrate: vu_migrate_{source,target}() aren't actually vu speciic
Date: Fri, 31 Jan 2025 20:39:44 +0100 [thread overview]
Message-ID: <20250131193953.3034031-12-sbrivio@redhat.com> (raw)
In-Reply-To: <20250131193953.3034031-1-sbrivio@redhat.com>
From: David Gibson <david@gibson.dropbear.id.au>
vu_migrate_source() and vu_migrate_target() don't directly rely on anything
vhost-user specific - it's just that they'll only be called for vhost-user
so far. They are suitable as general top-level dispatchers for
migration. Move them to migrate.c, rename to migrate_{source,target}() and
make the lower-level functions they call local to migrate.c.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
migrate.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++------
migrate.h | 10 ++-----
vu_common.c | 66 ++-----------------------------------------
3 files changed, 75 insertions(+), 81 deletions(-)
diff --git a/migrate.c b/migrate.c
index 10cb242..0e60475 100644
--- a/migrate.c
+++ b/migrate.c
@@ -98,7 +98,7 @@ struct migrate_target_handlers target_handlers[] = {
*
* Return: 0 on success, error code on failure
*/
-int migrate_source_pre(struct ctx *c, struct migrate_meta *m)
+static int migrate_source_pre(struct ctx *c, struct migrate_meta *m)
{
struct migrate_handler *h;
@@ -113,13 +113,13 @@ int migrate_source_pre(struct ctx *c, struct migrate_meta *m)
}
/**
- * migrate_source() - Perform migration as source: send state to hypervisor
+ * migrate_source_state() - Send device state as migration source
* @fd: Descriptor for state transfer
* @m: Migration metadata
*
* Return: 0 on success, error code on failure
*/
-int migrate_source(int fd, const struct migrate_meta *m)
+static int migrate_source_state(int fd, const struct migrate_meta *m)
{
static struct migrate_data *d;
int count, rc;
@@ -145,7 +145,7 @@ int migrate_source(int fd, const struct migrate_meta *m)
*
* Return: 0 on success, error code on failure
*/
-void migrate_source_post(struct ctx *c, struct migrate_meta *m)
+static void migrate_source_post(struct ctx *c, struct migrate_meta *m)
{
struct migrate_handler *h;
@@ -153,6 +153,34 @@ void migrate_source_post(struct ctx *c, struct migrate_meta *m)
h->fn(c, m);
}
+/**
+ * migrate_source() - Migration as source, send state to hypervisor
+ * @c: Execution context
+ * @fd: File descriptor for state transfer
+ *
+ * Return: 0 on success, positive error code on failure
+ */
+int migrate_source(struct ctx *c, int fd)
+{
+ struct migrate_meta m;
+ int rc;
+
+ if ((rc = migrate_source_pre(c, &m))) {
+ err("Source pre-migration failed: %s, abort", strerror_(rc));
+ return rc;
+ }
+
+ debug("Saving backend state");
+
+ rc = migrate_source_state(fd, &m);
+ if (rc)
+ err("Source migration failed: %s", strerror_(rc));
+ else
+ migrate_source_post(c, &m);
+
+ return rc;
+}
+
/**
* migrate_target_read_header() - Set metadata in target from source header
* @fd: Descriptor for state transfer
@@ -160,7 +188,7 @@ void migrate_source_post(struct ctx *c, struct migrate_meta *m)
*
* Return: 0 on success, error code on failure
*/
-int migrate_target_read_header(int fd, struct migrate_meta *m)
+static int migrate_target_read_header(int fd, struct migrate_meta *m)
{
static struct migrate_data *d;
union migrate_header h;
@@ -210,7 +238,7 @@ int migrate_target_read_header(int fd, struct migrate_meta *m)
*
* Return: 0 on success, error code on failure
*/
-int migrate_target_pre(struct ctx *c, struct migrate_meta *m)
+static int migrate_target_pre(struct ctx *c, struct migrate_meta *m)
{
struct migrate_target_handlers *th;
struct migrate_handler *h;
@@ -228,7 +256,7 @@ int migrate_target_pre(struct ctx *c, struct migrate_meta *m)
}
/**
- * migrate_target() - Perform migration as target: receive state from hypervisor
+ * migrate_target_state() - Receive device state as migration target
* @fd: Descriptor for state transfer
* @m: Migration metadata
*
@@ -236,7 +264,7 @@ int migrate_target_pre(struct ctx *c, struct migrate_meta *m)
*
* #syscalls:vu readv
*/
-int migrate_target(int fd, const struct migrate_meta *m)
+static int migrate_target_state(int fd, const struct migrate_meta *m)
{
static struct migrate_data *d;
unsigned cnt;
@@ -259,7 +287,7 @@ int migrate_target(int fd, const struct migrate_meta *m)
* @c: Execution context
* @m: Migration metadata
*/
-void migrate_target_post(struct ctx *c, struct migrate_meta *m)
+static void migrate_target_post(struct ctx *c, struct migrate_meta *m)
{
struct migrate_target_handlers *th;
struct migrate_handler *h;
@@ -269,3 +297,37 @@ void migrate_target_post(struct ctx *c, struct migrate_meta *m)
for (h = th->post; h->fn; h++)
h->fn(c, m);
}
+
+/**
+ * migrate_target() - Migration as target, receive state from hypervisor
+ * @c: Execution context
+ * @fd: File descriptor for state transfer
+ *
+ * Return: 0 on success, positive error code on failure
+ */
+int migrate_target(struct ctx *c, int fd)
+{
+ struct migrate_meta m;
+ int rc;
+
+ rc = migrate_target_read_header(fd, &m);
+ if (rc) {
+ err("Migration header check failed: %s, abort", strerror_(rc));
+ return rc;
+ }
+
+ if ((rc = migrate_target_pre(c, &m))) {
+ err("Target pre-migration failed: %s, abort", strerror_(rc));
+ return rc;
+ }
+
+ debug("Loading backend state");
+
+ rc = migrate_target_state(fd, &m);
+ if (rc)
+ err("Target migration failed: %s", strerror_(rc));
+ else
+ migrate_target_post(c, &m);
+
+ return rc;
+}
diff --git a/migrate.h b/migrate.h
index 9a68f17..21de70d 100644
--- a/migrate.h
+++ b/migrate.h
@@ -76,13 +76,7 @@ struct migrate_target_handlers {
struct migrate_handler *post;
};
-int migrate_source_pre(struct ctx *c, struct migrate_meta *m);
-int migrate_source(int fd, const struct migrate_meta *m);
-void migrate_source_post(struct ctx *c, struct migrate_meta *m);
-
-int migrate_target_read_header(int fd, struct migrate_meta *m);
-int migrate_target_pre(struct ctx *c, struct migrate_meta *m);
-int migrate_target(int fd, const struct migrate_meta *m);
-void migrate_target_post(struct ctx *c, struct migrate_meta *m);
+int migrate_source(struct ctx *c, int fd);
+int migrate_target(struct ctx *c, int fd);
#endif /* MIGRATE_H */
diff --git a/vu_common.c b/vu_common.c
index 6c346c8..4797ef9 100644
--- a/vu_common.c
+++ b/vu_common.c
@@ -306,68 +306,6 @@ err:
return -1;
}
-/**
- * vu_migrate_source() - Migration as source, send state to hypervisor
- * @c: Execution context
- * @fd: File descriptor for state transfer
- *
- * Return: 0 on success, positive error code on failure
- */
-static int vu_migrate_source(struct ctx *c, int fd)
-{
- struct migrate_meta m;
- int rc;
-
- if ((rc = migrate_source_pre(c, &m))) {
- err("Source pre-migration failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- debug("Saving backend state");
-
- rc = migrate_source(fd, &m);
- if (rc)
- err("Source migration failed: %s", strerror_(rc));
- else
- migrate_source_post(c, &m);
-
- return rc;
-}
-
-/**
- * vu_migrate_target() - Migration as target, receive state from hypervisor
- * @c: Execution context
- * @fd: File descriptor for state transfer
- *
- * Return: 0 on success, positive error code on failure
- */
-static int vu_migrate_target(struct ctx *c, int fd)
-{
- struct migrate_meta m;
- int rc;
-
- rc = migrate_target_read_header(fd, &m);
- if (rc) {
- err("Migration header check failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- if ((rc = migrate_target_pre(c, &m))) {
- err("Target pre-migration failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- debug("Loading backend state");
-
- rc = migrate_target(fd, &m);
- if (rc)
- err("Target migration failed: %s", strerror_(rc));
- else
- migrate_target_post(c, &m);
-
- return rc;
-}
-
/**
* vu_migrate() - Send/receive passt internal state to/from QEMU
* @c: Execution context
@@ -381,9 +319,9 @@ void vu_migrate(struct ctx *c, uint32_t events)
debug("vu_migrate fd %d events %x", vdev->device_state_fd, events);
if (events & EPOLLOUT)
- rc = vu_migrate_source(c, vdev->device_state_fd);
+ rc = migrate_source(c, vdev->device_state_fd);
else if (events & EPOLLIN)
- rc = vu_migrate_target(c, vdev->device_state_fd);
+ rc = migrate_target(c, vdev->device_state_fd);
/* EPOLLHUP without EPOLLIN/EPOLLOUT, or EPOLLERR? Migration failed */
--
@@ -306,68 +306,6 @@ err:
return -1;
}
-/**
- * vu_migrate_source() - Migration as source, send state to hypervisor
- * @c: Execution context
- * @fd: File descriptor for state transfer
- *
- * Return: 0 on success, positive error code on failure
- */
-static int vu_migrate_source(struct ctx *c, int fd)
-{
- struct migrate_meta m;
- int rc;
-
- if ((rc = migrate_source_pre(c, &m))) {
- err("Source pre-migration failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- debug("Saving backend state");
-
- rc = migrate_source(fd, &m);
- if (rc)
- err("Source migration failed: %s", strerror_(rc));
- else
- migrate_source_post(c, &m);
-
- return rc;
-}
-
-/**
- * vu_migrate_target() - Migration as target, receive state from hypervisor
- * @c: Execution context
- * @fd: File descriptor for state transfer
- *
- * Return: 0 on success, positive error code on failure
- */
-static int vu_migrate_target(struct ctx *c, int fd)
-{
- struct migrate_meta m;
- int rc;
-
- rc = migrate_target_read_header(fd, &m);
- if (rc) {
- err("Migration header check failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- if ((rc = migrate_target_pre(c, &m))) {
- err("Target pre-migration failed: %s, abort", strerror_(rc));
- return rc;
- }
-
- debug("Loading backend state");
-
- rc = migrate_target(fd, &m);
- if (rc)
- err("Target migration failed: %s", strerror_(rc));
- else
- migrate_target_post(c, &m);
-
- return rc;
-}
-
/**
* vu_migrate() - Send/receive passt internal state to/from QEMU
* @c: Execution context
@@ -381,9 +319,9 @@ void vu_migrate(struct ctx *c, uint32_t events)
debug("vu_migrate fd %d events %x", vdev->device_state_fd, events);
if (events & EPOLLOUT)
- rc = vu_migrate_source(c, vdev->device_state_fd);
+ rc = migrate_source(c, vdev->device_state_fd);
else if (events & EPOLLIN)
- rc = vu_migrate_target(c, vdev->device_state_fd);
+ rc = migrate_target(c, vdev->device_state_fd);
/* EPOLLHUP without EPOLLIN/EPOLLOUT, or EPOLLERR? Migration failed */
--
2.43.0
next prev parent reply other threads:[~2025-01-31 19:39 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-31 19:39 [PATCH v3 00/20] Draft, incomplete series introducing state migration Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 01/20] tcp: Always pass NULL event with EPOLL_CTL_DEL Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 02/20] util: Rename and make global vu_remove_watch() Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 03/20] icmp, udp: Pad time_t timestamp to 64-bit to ease state migration Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 04/20] flow, flow_table: Pad flow table entries to 128 bytes, hash entries to 32 bits Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 05/20] flow_table: Use size in extern declaration for flowtab Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 06/20] util: Add read_remainder() and read_all_buf() Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 07/20] Introduce facilities for guest migration on top of vhost-user infrastructure Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 08/20] Introduce passt-repair Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 09/20] Add interfaces and configuration bits for passt-repair Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 10/20] flow, tcp: Basic pre-migration source handler to dump sequence numbers Stefano Brivio
2025-01-31 19:39 ` Stefano Brivio [this message]
2025-01-31 19:39 ` [PATCH v3 12/20] migrate: Move repair_sock_init() to vu_init() Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 13/20] migrate: Make more handling common rather than vhost-user specific Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 14/20] migrate: Don't handle the migration channel through epoll Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 15/20] flow, flow_table: Export declaration of hash table Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 16/20] vhost_user: Turn vhost-user message reports to trace() Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 17/20] vhost_user: Make source quit after reporting migration state Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 18/20] tcp: Get our socket port using getsockname() when connecting from guest Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 19/20] tcp: Add HOSTSIDE(x), HOSTFLOW(x) macros Stefano Brivio
2025-01-31 19:39 ` [PATCH v3 20/20] Implement target side of migration Stefano Brivio
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=20250131193953.3034031-12-sbrivio@redhat.com \
--to=sbrivio@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=lvivier@redhat.com \
--cc=passt-dev@passt.top \
/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.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
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 IMAP folder(s).