diff options
author | John Levon <john.levon@nutanix.com> | 2022-05-27 19:06:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-27 19:06:31 +0100 |
commit | 188cd00c520855615331d35c087a22215767b8fb (patch) | |
tree | 8bda987bcdeb1c8cf0751dbe190a28aef2609272 /lib/libvfio-user.c | |
parent | 538d6063c9f8d395e1d38285ddfe405c3fcd7619 (diff) | |
download | libvfio-user-188cd00c520855615331d35c087a22215767b8fb.zip libvfio-user-188cd00c520855615331d35c087a22215767b8fb.tar.gz libvfio-user-188cd00c520855615331d35c087a22215767b8fb.tar.bz2 |
re-work SGL API (#675)
Harmonize and rename the vfu_*sg() APIs to better reflect their functionality:
in our case, there is no mapping happening as part of these calls, they are
merely housekeeping for range splitting, dirty tracking, and so on.
Signed-off-by: John Levon <john.levon@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'lib/libvfio-user.c')
-rw-r--r-- | lib/libvfio-user.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/lib/libvfio-user.c b/lib/libvfio-user.c index 7d324aa..90c4b39 100644 --- a/lib/libvfio-user.c +++ b/lib/libvfio-user.c @@ -2003,8 +2003,8 @@ quiesce_check_allowed(vfu_ctx_t *vfu_ctx) } EXPORT int -vfu_addr_to_sg(vfu_ctx_t *vfu_ctx, vfu_dma_addr_t dma_addr, - size_t len, dma_sg_t *sg, int max_sg, int prot) +vfu_addr_to_sgl(vfu_ctx_t *vfu_ctx, vfu_dma_addr_t dma_addr, + size_t len, dma_sg_t *sgl, size_t max_nr_sgs, int prot) { assert(vfu_ctx != NULL); @@ -2014,31 +2014,24 @@ vfu_addr_to_sg(vfu_ctx_t *vfu_ctx, vfu_dma_addr_t dma_addr, quiesce_check_allowed(vfu_ctx); - return dma_addr_to_sg(vfu_ctx->dma, dma_addr, len, sg, max_sg, prot); + return dma_addr_to_sgl(vfu_ctx->dma, dma_addr, len, sgl, max_nr_sgs, prot); } EXPORT int -vfu_map_sg(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, struct iovec *iov, int cnt, - int flags) +vfu_sgl_get(vfu_ctx_t *vfu_ctx, dma_sg_t *sgl, struct iovec *iov, size_t cnt, + int flags) { - int ret; - if (unlikely(vfu_ctx->dma_unregister == NULL) || flags != 0) { return ERROR_INT(EINVAL); } quiesce_check_allowed(vfu_ctx); - ret = dma_map_sg(vfu_ctx->dma, sg, iov, cnt); - if (ret < 0) { - return -1; - } - - return 0; + return dma_sgl_get(vfu_ctx->dma, sgl, iov, cnt); } EXPORT void -vfu_mark_sg_dirty(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, int cnt) +vfu_sgl_mark_dirty(vfu_ctx_t *vfu_ctx, dma_sg_t *sgl, size_t cnt) { if (unlikely(vfu_ctx->dma_unregister == NULL)) { return; @@ -2046,12 +2039,12 @@ vfu_mark_sg_dirty(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, int cnt) quiesce_check_allowed(vfu_ctx); - return dma_mark_sg_dirty(vfu_ctx->dma, sg, cnt); + return dma_sgl_mark_dirty(vfu_ctx->dma, sgl, cnt); } EXPORT void -vfu_unmap_sg(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, - struct iovec *iov UNUSED, int cnt) +vfu_sgl_put(vfu_ctx_t *vfu_ctx, dma_sg_t *sgl, + struct iovec *iov UNUSED, size_t cnt) { if (unlikely(vfu_ctx->dma_unregister == NULL)) { return; @@ -2059,7 +2052,7 @@ vfu_unmap_sg(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, quiesce_check_allowed(vfu_ctx); - return dma_unmap_sg(vfu_ctx->dma, sg, cnt); + return dma_sgl_put(vfu_ctx->dma, sgl, cnt); } static int @@ -2156,17 +2149,29 @@ vfu_dma_transfer(vfu_ctx_t *vfu_ctx, enum vfio_user_command cmd, } EXPORT int -vfu_dma_read(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, void *data) +vfu_sgl_read(vfu_ctx_t *vfu_ctx, dma_sg_t *sgl, size_t cnt, void *data) { assert(vfu_ctx->pending.state == VFU_CTX_PENDING_NONE); - return vfu_dma_transfer(vfu_ctx, VFIO_USER_DMA_READ, sg, data); + + /* Not currently implemented. */ + if (cnt != 1) { + return ERROR_INT(ENOTSUP); + } + + return vfu_dma_transfer(vfu_ctx, VFIO_USER_DMA_READ, sgl, data); } EXPORT int -vfu_dma_write(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, void *data) +vfu_sgl_write(vfu_ctx_t *vfu_ctx, dma_sg_t *sgl, size_t cnt, void *data) { assert(vfu_ctx->pending.state == VFU_CTX_PENDING_NONE); - return vfu_dma_transfer(vfu_ctx, VFIO_USER_DMA_WRITE, sg, data); + + /* Not currently implemented. */ + if (cnt != 1) { + return ERROR_INT(ENOTSUP); + } + + return vfu_dma_transfer(vfu_ctx, VFIO_USER_DMA_WRITE, sgl, data); } EXPORT bool |