aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libvfio-user.c27
-rw-r--r--lib/private.h1
-rw-r--r--samples/client.c72
-rw-r--r--test/unit-tests.c1
4 files changed, 38 insertions, 63 deletions
diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c
index 0d8a310..4a3aadf 100644
--- a/lib/libvfio-user.c
+++ b/lib/libvfio-user.c
@@ -192,12 +192,6 @@ dump_buffer(const char *prefix UNUSED, const char *buf UNUSED,
#endif
}
-static bool
-is_migr_reg(vfu_ctx_t *vfu_ctx, int index)
-{
- return &vfu_ctx->reg_info[index] == vfu_ctx->migr_reg;
-}
-
static ssize_t
region_access(vfu_ctx_t *vfu_ctx, size_t region_index, char *buf,
size_t count, uint64_t offset, bool is_write)
@@ -219,7 +213,11 @@ region_access(vfu_ctx_t *vfu_ctx, size_t region_index, char *buf,
if (ret == -1) {
ret = -errno;
}
- } else if (is_migr_reg(vfu_ctx, region_index) && vfu_ctx->migration != NULL) {
+ } else if (region_index == VFU_PCI_DEV_MIGR_REGION_IDX) {
+ if (vfu_ctx->migration == NULL) {
+ return -EINVAL;
+ }
+
ret = migration_region_access(vfu_ctx, buf, count, offset, is_write);
if (ret == -1) {
ret = -errno;
@@ -280,7 +278,7 @@ is_valid_region_access(vfu_ctx_t *vfu_ctx, size_t size, uint16_t cmd,
}
if (device_is_stopped_and_copying(vfu_ctx->migration) &&
- !is_migr_reg(vfu_ctx, index)) {
+ index != VFU_PCI_DEV_MIGR_REGION_IDX) {
vfu_log(vfu_ctx, LOG_ERR,
"cannot access region %zu while device in stop-and-copy state",
index);
@@ -382,7 +380,8 @@ dev_get_reginfo(vfu_ctx_t *vfu_ctx, uint32_t index, uint32_t argsz,
if (!*vfio_reg) {
return -ENOMEM;
}
- caps_size = get_vfio_caps_size(is_migr_reg(vfu_ctx, index), vfu_reg);
+ caps_size = get_vfio_caps_size(index == VFU_PCI_DEV_MIGR_REGION_IDX,
+ vfu_reg);
(*vfio_reg)->argsz = caps_size + sizeof(struct vfio_region_info);
(*vfio_reg)->index = index;
(*vfio_reg)->offset = region_to_offset((*vfio_reg)->index);
@@ -405,7 +404,7 @@ dev_get_reginfo(vfu_ctx_t *vfu_ctx, uint32_t index, uint32_t argsz,
if (caps_size > 0) {
(*vfio_reg)->flags |= VFIO_REGION_INFO_FLAG_CAPS;
if (argsz >= (*vfio_reg)->argsz) {
- dev_get_caps(vfu_ctx, vfu_reg, is_migr_reg(vfu_ctx, index),
+ dev_get_caps(vfu_ctx, vfu_reg, index == VFU_PCI_DEV_MIGR_REGION_IDX,
*vfio_reg, fds, nr_fds);
}
}
@@ -1418,12 +1417,6 @@ vfu_setup_region(vfu_ctx_t *vfu_ctx, int region_idx, size_t size,
ret = -EINVAL;
goto out;
}
-
- /*
- * FIXME keeping for now until we're sure we're OK with fixing the
- * migration region index.
- */
- vfu_ctx->migr_reg = reg;
}
out:
if (ret < 0) {
@@ -1488,7 +1481,7 @@ vfu_setup_device_migration_callbacks(vfu_ctx_t *vfu_ctx,
assert(vfu_ctx != NULL);
assert(callbacks != NULL);
- if (vfu_ctx->migr_reg == NULL) {
+ if (vfu_ctx->reg_info[VFU_PCI_DEV_MIGR_REGION_IDX].size == 0) {
vfu_log(vfu_ctx, LOG_ERR, "no device migration region");
return ERROR_INT(EINVAL);
}
diff --git a/lib/private.h b/lib/private.h
index fde5e3c..322a988 100644
--- a/lib/private.h
+++ b/lib/private.h
@@ -131,7 +131,6 @@ struct vfu_ctx {
int client_max_fds;
- vfu_reg_info_t *migr_reg;
struct migration *migration;
uint32_t irq_count[VFU_DEV_NUM_IRQS];
diff --git a/samples/client.c b/samples/client.c
index e4e97b0..797cb00 100644
--- a/samples/client.c
+++ b/samples/client.c
@@ -291,7 +291,7 @@ mmap_sparse_areas(int *fds, struct vfio_region_info_cap_sparse_mmap *sparse)
}
}
-static bool
+static void
get_device_region_info(int sock, uint32_t index)
{
struct vfio_region_info *region_info;
@@ -333,28 +333,18 @@ get_device_region_info(int sock, uint32_t index)
assert(nr_fds == sparse->nr_areas);
mmap_sparse_areas(fds, sparse);
}
- return true;
}
}
- return false;
}
-/*
- * Returns the index of the migration region if found, -1 otherwise.
- */
-static int
+static void
get_device_regions_info(int sock, struct vfio_device_info *client_dev_info)
{
- int migr_reg_index = -1;
unsigned int i;
for (i = 0; i < client_dev_info->num_regions; i++) {
- if (get_device_region_info(sock, i)) {
- assert(migr_reg_index == -1);
- migr_reg_index = i;
- }
+ get_device_region_info(sock, i);
}
- return migr_reg_index;
}
static void
@@ -725,8 +715,7 @@ usage(char *argv0)
* @returns the number of iterations performed
*/
static size_t
-do_migrate(int sock, int migr_reg_index, size_t nr_iters,
- struct iovec *migr_iter)
+do_migrate(int sock, size_t nr_iters, struct iovec *migr_iter)
{
int ret;
uint64_t pending_bytes, data_offset, data_size;
@@ -735,7 +724,7 @@ do_migrate(int sock, int migr_reg_index, size_t nr_iters,
assert(nr_iters > 0);
/* XXX read pending_bytes */
- ret = access_region(sock, migr_reg_index, false,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
offsetof(struct vfio_device_migration_info, pending_bytes),
&pending_bytes, sizeof(pending_bytes));
if (ret < 0) {
@@ -745,14 +734,14 @@ do_migrate(int sock, int migr_reg_index, size_t nr_iters,
for (i = 0; i < nr_iters && pending_bytes > 0; i++) {
/* XXX read data_offset and data_size */
- ret = access_region(sock, migr_reg_index, false,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
offsetof(struct vfio_device_migration_info, data_offset),
&data_offset, sizeof(data_offset));
if (ret < 0) {
err(EXIT_FAILURE, "failed to read data_offset");
}
- ret = access_region(sock, migr_reg_index, false,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
offsetof(struct vfio_device_migration_info, data_size),
&data_size, sizeof(data_size));
if (ret < 0) {
@@ -766,8 +755,9 @@ do_migrate(int sock, int migr_reg_index, size_t nr_iters,
}
/* XXX read migration data */
- ret = access_region(sock, migr_reg_index, false, data_offset,
- (char*)migr_iter[i].iov_base, data_size);
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
+ data_offset,
+ (char *)migr_iter[i].iov_base, data_size);
if (ret < 0) {
err(EXIT_FAILURE, "failed to read migration data");
}
@@ -778,7 +768,7 @@ do_migrate(int sock, int migr_reg_index, size_t nr_iters,
* XXX read pending_bytes again to indicate to the server that the
* migration data have been consumed.
*/
- ret = access_region(sock, migr_reg_index, false,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
offsetof(struct vfio_device_migration_info, pending_bytes),
&pending_bytes, sizeof(pending_bytes));
if (ret < 0) {
@@ -830,8 +820,8 @@ fake_guest(void *arg)
}
static size_t
-migrate_from(int sock, int migr_reg_index, size_t *nr_iters,
- struct iovec **migr_iters, unsigned char *md5sum, size_t bar1_size)
+migrate_from(int sock, size_t *nr_iters, struct iovec **migr_iters,
+ unsigned char *md5sum, size_t bar1_size)
{
uint32_t device_state;
int ret;
@@ -861,14 +851,14 @@ migrate_from(int sock, int migr_reg_index, size_t *nr_iters,
* VMM that cares about performance needs this.
*/
device_state = VFIO_DEVICE_STATE_SAVING | VFIO_DEVICE_STATE_RUNNING;
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, device_state),
&device_state, sizeof(device_state));
if (ret < 0) {
err(EXIT_FAILURE, "failed to write to device state");
}
- _nr_iters = do_migrate(sock, migr_reg_index, 1, *migr_iters);
+ _nr_iters = do_migrate(sock, 1, *migr_iters);
assert(_nr_iters == 1);
printf("client: stopping fake guest thread\n");
fake_guest_data.done = true;
@@ -882,14 +872,14 @@ migrate_from(int sock, int migr_reg_index, size_t *nr_iters,
printf("client: setting device state to stop-and-copy\n");
device_state = VFIO_DEVICE_STATE_SAVING;
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, device_state),
&device_state, sizeof(device_state));
if (ret < 0) {
err(EXIT_FAILURE, "failed to write to device state");
}
- _nr_iters += do_migrate(sock, migr_reg_index, 1, (*migr_iters) + _nr_iters);
+ _nr_iters += do_migrate(sock, 1, (*migr_iters) + _nr_iters);
if (_nr_iters != 2) {
errx(EXIT_FAILURE,
"expected 2 iterations instead of %ld while in stop-and-copy state",
@@ -898,7 +888,7 @@ migrate_from(int sock, int migr_reg_index, size_t *nr_iters,
/* XXX read device state, migration must have finished now */
device_state = VFIO_DEVICE_STATE_STOP;
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, device_state),
&device_state, sizeof(device_state));
if (ret < 0) {
@@ -911,8 +901,7 @@ migrate_from(int sock, int migr_reg_index, size_t *nr_iters,
static int
migrate_to(char *old_sock_path, int *server_max_fds,
size_t *pgsize, size_t nr_iters, struct iovec *migr_iters,
- char *path_to_server, int migr_reg_index, unsigned char *src_md5sum,
- size_t bar1_size)
+ char *path_to_server, unsigned char *src_md5sum, size_t bar1_size)
{
int ret, sock;
char *sock_path;
@@ -970,7 +959,7 @@ migrate_to(char *old_sock_path, int *server_max_fds,
negotiate(sock, server_max_fds, pgsize);
/* XXX set device state to resuming */
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, device_state),
&device_state, sizeof(device_state));
if (ret < 0) {
@@ -980,7 +969,7 @@ migrate_to(char *old_sock_path, int *server_max_fds,
for (i = 0; i < nr_iters; i++) {
/* XXX read data offset */
- ret = access_region(sock, migr_reg_index, false,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, false,
offsetof(struct vfio_device_migration_info, data_offset),
&data_offset, sizeof(data_offset));
if (ret < 0) {
@@ -995,7 +984,7 @@ migrate_to(char *old_sock_path, int *server_max_fds,
*/
printf("client: writing migration device data %#lx-%#lx\n",
data_offset, data_offset + migr_iters[i].iov_len - 1);
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
data_offset, migr_iters[i].iov_base,
migr_iters[i].iov_len);
if (ret < 0) {
@@ -1004,7 +993,7 @@ migrate_to(char *old_sock_path, int *server_max_fds,
/* XXX write data_size */
data_len = migr_iters[i].iov_len;
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, data_size),
&data_len, sizeof(data_len));
if (ret < 0) {
@@ -1014,7 +1003,7 @@ migrate_to(char *old_sock_path, int *server_max_fds,
/* XXX set device state to running */
device_state = VFIO_DEVICE_STATE_RUNNING;
- ret = access_region(sock, migr_reg_index, true,
+ ret = access_region(sock, VFU_PCI_DEV_MIGR_REGION_IDX, true,
offsetof(struct vfio_device_migration_info, device_state),
&device_state, sizeof(device_state));
if (ret < 0) {
@@ -1086,7 +1075,6 @@ int main(int argc, char *argv[])
time_t t;
char *path_to_server = NULL;
vfu_pci_hdr_t config_space;
- int migr_reg_index;
struct iovec *migr_iters;
size_t nr_iters;
unsigned char md5sum[MD5_DIGEST_LENGTH];
@@ -1127,11 +1115,8 @@ int main(int argc, char *argv[])
/* XXX VFIO_USER_DEVICE_GET_INFO */
get_device_info(sock, &client_dev_info);
- /* XXX VFIO_USER_DEVICE_GET_REGION_INFO */
- migr_reg_index = get_device_regions_info(sock, &client_dev_info);
- if (migr_reg_index == -1) {
- errx(EXIT_FAILURE, "could not find migration region");
- }
+ /* VFIO_USER_DEVICE_GET_REGION_INFO */
+ get_device_regions_info(sock, &client_dev_info);
ret = access_region(sock, VFU_PCI_DEV_CFG_REGION_IDX, false, 0, &config_space,
sizeof(config_space));
@@ -1246,8 +1231,7 @@ int main(int argc, char *argv[])
err(EXIT_FAILURE, "failed to write to BAR0");
}
- nr_iters = migrate_from(sock, migr_reg_index, &nr_iters, &migr_iters,
- md5sum, bar1_size);
+ nr_iters = migrate_from(sock, &nr_iters, &migr_iters, md5sum, bar1_size);
/*
* Normally the client would now send the device state to the destination
@@ -1260,7 +1244,7 @@ int main(int argc, char *argv[])
}
sock = migrate_to(argv[optind], &server_max_fds, &pgsize,
- nr_iters, migr_iters, path_to_server, migr_reg_index,
+ nr_iters, migr_iters, path_to_server,
md5sum, bar1_size);
free(path_to_server);
for (i = 0; i < (int)nr_iters; i++) {
diff --git a/test/unit-tests.c b/test/unit-tests.c
index ef93ccb..80d61c7 100644
--- a/test/unit-tests.c
+++ b/test/unit-tests.c
@@ -606,7 +606,6 @@ test_get_region_info(UNUSED void **state)
.client_max_fds = 1,
.nr_regions = ARRAY_SIZE(reg_info),
.reg_info = reg_info,
- .migr_reg = &reg_info[VFU_PCI_DEV_MIGR_REGION_IDX]
};
uint32_t index = 0;
uint32_t argsz = 0;