diff options
author | swapnili <swapnil.ingle@nutanix.com> | 2020-11-30 16:45:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-30 16:45:35 +0100 |
commit | 9d0224ae1c4c6c43e7dee048b71a499c857bc85f (patch) | |
tree | af82f3c83a6ca80da30fc8d18274f7a178d61a26 | |
parent | a3ba81765daeffaaa2e9e59d49d49ae4438b1b59 (diff) | |
download | libvfio-user-9d0224ae1c4c6c43e7dee048b71a499c857bc85f.zip libvfio-user-9d0224ae1c4c6c43e7dee048b71a499c857bc85f.tar.gz libvfio-user-9d0224ae1c4c6c43e7dee048b71a499c857bc85f.tar.bz2 |
Update API's to accept sparse mmap areas as array and its count (#134)
* Pass region mmap areas as array
* Pass migration sparse mmap areas as array
* Move struct vfu_sparse_mmap_areas to lib/priv.h
Signed-off-by: Swapnil Ingle <swapnil.ingle@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
-rw-r--r-- | include/libvfio-user.h | 19 | ||||
-rw-r--r-- | lib/libvfio-user.c | 27 | ||||
-rw-r--r-- | lib/private.h | 5 | ||||
-rw-r--r-- | samples/gpio-pci-idio-16.c | 2 | ||||
-rw-r--r-- | samples/server.c | 24 |
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; } |