diff options
author | John Levon <john.levon@nutanix.com> | 2021-03-31 16:49:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-31 16:49:52 +0100 |
commit | 14b237fc80473bf4419a2bccda4cf7e7d382c174 (patch) | |
tree | 959e0cc1c4d2557f624df6fa5c189a8cdc92993f /test/mocks.c | |
parent | 0ae00cbb9edcc3879b1276cd61479d668a7f1ec9 (diff) | |
download | libvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.zip libvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.tar.gz libvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.tar.bz2 |
rework DMA callbacks (#396)
This fixes a number of issues with how DMA is handled, based on some changes by
Thanos Makatos:
- rename callbacks to register/unregister, as there is not necessarily
any mapping
- provide the (large) page-aligned mapped start and size, the page size used,
as well as the protection flags: some API users need these
- for convenience, provide the virtual address separately that corresponds to
the mapped region
- we should only require a DMA controller to use vfu_addr_to_sg(),
not an unregister callback
- the callbacks should return errno not -errno
- region removal was incorrectly updating the region array
- various other cleanups and clarifications
Signed-off-by: John Levon <john.levon@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'test/mocks.c')
-rw-r--r-- | test/mocks.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/test/mocks.c b/test/mocks.c index 3a83ed5..b01011e 100644 --- a/test/mocks.c +++ b/test/mocks.c @@ -50,16 +50,16 @@ struct function const char *name; bool patched; }; -; + static int (*__real_close)(int); static struct function funcs[] = { /* mocked internal funcs */ - { .name = "_dma_controller_do_remove_region" }, { .name = "cmd_allowed_when_stopped_and_copying" }, { .name = "device_is_stopped_and_copying" }, { .name = "device_is_stopped" }, { .name = "dma_controller_add_region" }, + { .name = "dma_controller_unmap_region" }, { .name = "dma_controller_remove_region" }, { .name = "dma_map_region" }, { .name = "exec_command" }, @@ -110,7 +110,7 @@ unpatch_all(void) } int -dma_controller_add_region(dma_controller_t *dma, dma_addr_t dma_addr, +dma_controller_add_region(dma_controller_t *dma, void *dma_addr, size_t size, int fd, off_t offset, uint32_t prot) { @@ -130,36 +130,26 @@ dma_controller_add_region(dma_controller_t *dma, dma_addr_t dma_addr, int dma_controller_remove_region(dma_controller_t *dma, - dma_addr_t dma_addr, size_t size, - vfu_unmap_dma_cb_t *unmap_dma, void *data) + void *dma_addr, size_t size, + vfu_dma_unregister_cb_t *dma_unregister, + void *data) { if (!is_patched("dma_controller_remove_region")) { return __real_dma_controller_remove_region(dma, dma_addr, size, - unmap_dma, data); + dma_unregister, data); } check_expected(dma); check_expected(dma_addr); check_expected(size); - check_expected(unmap_dma); + check_expected(dma_unregister); check_expected(data); return mock(); } -void * -dma_map_region(dma_memory_region_t *region, int prot, size_t offset, - size_t len) -{ - check_expected_ptr(region); - check_expected(prot); - check_expected(offset); - check_expected(len); - return mock_ptr_type(void*); -} - void -_dma_controller_do_remove_region(dma_controller_t *dma, - dma_memory_region_t *region) +dma_controller_unmap_region(dma_controller_t *dma, + dma_memory_region_t *region) { check_expected(dma); check_expected(region); @@ -291,12 +281,18 @@ handle_dirty_pages(vfu_ctx_t *vfu_ctx, uint32_t size, } /* Always mocked. */ +void +mock_dma_register(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info) +{ + check_expected(vfu_ctx); + check_expected(info); +} + int -mock_unmap_dma(vfu_ctx_t *vfu_ctx, uint64_t iova, uint64_t len) +mock_dma_unregister(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info) { check_expected(vfu_ctx); - check_expected(iova); - check_expected(len); + check_expected(info); return mock(); } |