aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libvfio-user.h19
-rw-r--r--lib/libvfio-user.c27
-rw-r--r--lib/private.h5
-rw-r--r--samples/gpio-pci-idio-16.c2
-rw-r--r--samples/server.c24
5 files changed, 37 insertions, 40 deletions
diff --git a/include/libvfio-user.h b/include/libvfio-user.h
index 0e3923e..4e53d6d 100644
--- a/include/libvfio-user.h
+++ b/include/libvfio-user.h
@@ -73,11 +73,6 @@ struct vfu_mmap_area {
uint64_t size;
};
-struct vfu_sparse_mmap_areas {
- int nr_mmap_areas;
- struct vfu_mmap_area areas[];
-};
-
/**
* Prototype for memory access callback. The program MUST first map device
* memory in its own virtual address space using vfu_mmap, do any additional work
@@ -229,9 +224,10 @@ typedef struct {
} vfu_migration_callbacks_t;
typedef struct {
- size_t size;
- vfu_migration_callbacks_t callbacks;
- struct vfu_sparse_mmap_areas *mmap_areas;
+ size_t size;
+ vfu_migration_callbacks_t callbacks;
+ struct vfu_mmap_area *mmap_areas;
+ uint32_t nr_mmap_areas;
} vfu_migration_t;
/*
@@ -331,13 +327,14 @@ enum {
* @size: size of the region
* @region_access: callback function to access region
* @flags: region flags
- * @mmap_areas: mmap areas info
- * @region_map: callback function to map region
+ * @mmap_areas: array of struct vfu_mmap_area
+ * @nr_mmap_areas: size of mmap_areas
+ * @map: callback function to map region
*/
int
vfu_setup_region(vfu_ctx_t *vfu_ctx, int region_idx, size_t size,
vfu_region_access_cb_t *region_access, int flags,
- struct vfu_sparse_mmap_areas *mmap_areas,
+ struct vfu_mmap_area *mmap_areas, uint32_t nr_mmap_areas,
vfu_map_region_cb_t *map);
/*
diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c
index 51013ef..ab1cde5 100644
--- a/lib/libvfio-user.c
+++ b/lib/libvfio-user.c
@@ -1393,23 +1393,25 @@ int vfu_pci_setup_caps(vfu_ctx_t *vfu_ctx, vfu_cap_t **caps, int nr_caps)
static int
copy_sparse_mmap_areas(vfu_reg_info_t *reg_info,
- struct vfu_sparse_mmap_areas *mmap_areas)
+ struct vfu_mmap_area *mmap_areas, uint32_t nr_mmap_areas)
{
- int nr_mmap_areas;
- size_t size;
+ struct vfu_sparse_mmap_areas *smmap_areas;
+ size_t areas_sz;
- if (mmap_areas == NULL) {
+ if (mmap_areas == NULL || nr_mmap_areas == 0) {
return 0;
}
- nr_mmap_areas = mmap_areas->nr_mmap_areas;
- size = sizeof(*mmap_areas) + (nr_mmap_areas * sizeof(struct vfu_mmap_area));
- reg_info->mmap_areas = calloc(1, size);
- if (reg_info->mmap_areas == NULL) {
+ areas_sz = nr_mmap_areas * sizeof(struct vfu_mmap_area);
+
+ smmap_areas = calloc(1, sizeof(struct vfu_sparse_mmap_areas) + areas_sz);
+ if (smmap_areas == NULL) {
return -ENOMEM;
}
- memcpy(reg_info->mmap_areas, mmap_areas, size);
+ smmap_areas->nr_mmap_areas = nr_mmap_areas;
+ memcpy(smmap_areas->areas, mmap_areas, areas_sz);
+ reg_info->mmap_areas = smmap_areas;
return 0;
}
@@ -1422,7 +1424,7 @@ static inline bool is_valid_pci_config_space_region(int flags, size_t size)
int vfu_setup_region(vfu_ctx_t *vfu_ctx, int region_idx, size_t size,
vfu_region_access_cb_t *region_access, int flags,
- struct vfu_sparse_mmap_areas *mmap_areas,
+ struct vfu_mmap_area *mmap_areas, uint32_t nr_mmap_areas,
vfu_map_region_cb_t *map)
{
int ret;
@@ -1446,7 +1448,7 @@ int vfu_setup_region(vfu_ctx_t *vfu_ctx, int region_idx, size_t size,
}
if (mmap_areas) {
ret = copy_sparse_mmap_areas(&vfu_ctx->reg_info[region_idx],
- mmap_areas);
+ mmap_areas, nr_mmap_areas);
if (ret < 0) {
return ERROR(-ret);
}
@@ -1525,7 +1527,8 @@ int vfu_setup_device_migration(vfu_ctx_t *vfu_ctx, vfu_migration_t *migration)
migr_reg = &vfu_ctx->reg_info[(vfu_ctx->nr_regions - 1)];
/* FIXME: Are there sparse areas need to be setup flags accordingly */
- ret = copy_sparse_mmap_areas(migr_reg, migration->mmap_areas);
+ ret = copy_sparse_mmap_areas(migr_reg, migration->mmap_areas,
+ migration->nr_mmap_areas);
if (ret < 0) {
return ERROR(-ret);
}
diff --git a/lib/private.h b/lib/private.h
index 9b13949..7ffe099 100644
--- a/lib/private.h
+++ b/lib/private.h
@@ -67,6 +67,11 @@ typedef struct {
struct migration;
+struct vfu_sparse_mmap_areas {
+ int nr_mmap_areas;
+ struct vfu_mmap_area areas[];
+};
+
typedef struct {
/*
diff --git a/samples/gpio-pci-idio-16.c b/samples/gpio-pci-idio-16.c
index aabcf75..86d5177 100644
--- a/samples/gpio-pci-idio-16.c
+++ b/samples/gpio-pci-idio-16.c
@@ -120,7 +120,7 @@ main(int argc, char *argv[])
}
ret = vfu_setup_region(vfu_ctx, VFU_PCI_DEV_BAR2_REGION_IDX, 0x100,
- &bar2_access, VFU_REG_FLAG_RW, NULL, NULL);
+ &bar2_access, VFU_REG_FLAG_RW, NULL, 0, NULL);
if (ret < 0) {
fprintf(stderr, "failed to setup region\n");
goto out;
diff --git a/samples/server.c b/samples/server.c
index dd84f16..7f9eefa 100644
--- a/samples/server.c
+++ b/samples/server.c
@@ -380,8 +380,6 @@ int main(int argc, char *argv[])
.state = VFU_MIGR_STATE_RUNNING
}
};
- int nr_sparse_areas = 2, size = 1024, i;
- struct vfu_sparse_mmap_areas *sparse_areas;
vfu_ctx_t *vfu_ctx;
vfu_pci_hdr_id_t id = {.raw = 0xdeadbeef};
vfu_pci_hdr_ss_t ss = {.raw = 0xcafebabe};
@@ -407,16 +405,6 @@ int main(int argc, char *argv[])
err(EXIT_FAILURE, "BAR1");
}
- sparse_areas = calloc(1, sizeof(*sparse_areas) +
- (nr_sparse_areas * sizeof(struct vfu_mmap_area)));
- if (sparse_areas == NULL) {
- err(EXIT_FAILURE, "MMAP sparse areas ENOMEM");
- }
- sparse_areas->nr_mmap_areas = nr_sparse_areas;
- for (i = 0; i < nr_sparse_areas; i++) {
- sparse_areas->areas[i].start += size;
- sparse_areas->areas[i].size = size;
- }
sigemptyset(&act.sa_mask);
if (sigaction(SIGALRM, &act, NULL) == -1) {
err(EXIT_FAILURE, "failed to register signal handler");
@@ -439,14 +427,18 @@ int main(int argc, char *argv[])
}
ret = vfu_setup_region(vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, sizeof(time_t),
- &bar0_access, VFU_REG_FLAG_RW, NULL, NULL);
+ &bar0_access, VFU_REG_FLAG_RW, NULL, 0, NULL);
if (ret < 0) {
err(EXIT_FAILURE, "failed to setup BAR0 region");
}
+ struct vfu_mmap_area mmap_areas[] = {
+ { .start = 1024, .size = 1024 },
+ { .start = 8192, .size = 1024 }
+ };
ret = vfu_setup_region(vfu_ctx, VFU_PCI_DEV_BAR1_REGION_IDX,
sysconf(_SC_PAGESIZE), &bar1_access,
- VFU_REG_FLAG_RW, sparse_areas, map_area);
+ VFU_REG_FLAG_RW, mmap_areas, 2, map_area);
if (ret < 0) {
err(EXIT_FAILURE, "failed to setup BAR1 region");
}
@@ -468,7 +460,8 @@ int main(int argc, char *argv[])
vfu_migration_t migration = {
.size = server_data.migration.migr_data_len,
- .mmap_areas = sparse_areas,
+ .mmap_areas = mmap_areas,
+ .nr_mmap_areas = 2,
.callbacks = {
.transition = &migration_device_state_transition,
.get_pending_bytes = &migration_get_pending_bytes,
@@ -515,7 +508,6 @@ int main(int argc, char *argv[])
vfu_ctx_destroy(vfu_ctx);
free(server_data.bar1);
- free(sparse_areas);
return EXIT_SUCCESS;
}