From mboxrd@z Thu Jan  1 00:00:00 1970
Received: by passt.top (Postfix, from userid 1000)
	id CD0395A0636; Fri, 31 Jan 2025 20:39:53 +0100 (CET)
From: Stefano Brivio <sbrivio@redhat.com>
To: passt-dev@passt.top
Subject: [PATCH v3 11/20] migrate: vu_migrate_{source,target}() aren't actually vu speciic
Date: Fri, 31 Jan 2025 20:39:44 +0100
Message-ID: <20250131193953.3034031-12-sbrivio@redhat.com>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <20250131193953.3034031-1-sbrivio@redhat.com>
References: <20250131193953.3034031-1-sbrivio@redhat.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Message-ID-Hash: MMSTAC5JRAQNZWZEPRHTO7IYEGCDCUB3
X-Message-ID-Hash: MMSTAC5JRAQNZWZEPRHTO7IYEGCDCUB3
X-MailFrom: sbrivio@passt.top
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: Laurent Vivier <lvivier@redhat.com>, David Gibson <david@gibson.dropbear.id.au>
X-Mailman-Version: 3.3.8
Precedence: list
List-Id: Development discussion and patches for passt <passt-dev.passt.top>
Archived-At: <https://archives.passt.top/passt-dev/20250131193953.3034031-12-sbrivio@redhat.com/>
Archived-At: <https://passt.top/hyperkitty/list/passt-dev@passt.top/message/MMSTAC5JRAQNZWZEPRHTO7IYEGCDCUB3/>
List-Archive: <https://archives.passt.top/passt-dev/>
List-Archive: <https://passt.top/hyperkitty/list/passt-dev@passt.top/>
List-Help: <mailto:passt-dev-request@passt.top?subject=help>
List-Owner: <mailto:passt-dev-owner@passt.top>
List-Post: <mailto:passt-dev@passt.top>
List-Subscribe: <mailto:passt-dev-join@passt.top>
List-Unsubscribe: <mailto:passt-dev-leave@passt.top>

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 */
 
-- 
2.43.0