diff options
-rw-r--r-- | kmod/muser.c | 21 | ||||
-rw-r--r-- | kmod/muser.h | 20 | ||||
-rw-r--r-- | lib/libmuser.c | 78 |
3 files changed, 51 insertions, 68 deletions
diff --git a/kmod/muser.c b/kmod/muser.c index 7463441..96a2134 100644 --- a/kmod/muser.c +++ b/kmod/muser.c @@ -599,8 +599,8 @@ static int muser_process_dma_request(struct muser_dev *mudev, .type = type, .mmap = { .request = { - .start = dma_map->iova, - .end = dma_map->iova + dma_map->length, + .addr = dma_map->iova, + .len = dma_map->length, .flags = flags} } } @@ -610,7 +610,7 @@ static int muser_process_dma_request(struct muser_dev *mudev, if (unlikely(err)) return err; - return mucmd.muser_cmd.mmap.response.addr; + return mucmd.muser_cmd.mmap.response; } static int muser_process_dma_map(struct muser_dev *mudev, int flags) @@ -710,21 +710,21 @@ static int has_anonymous_pages(struct vfio_dma_mapping *dma_map) } static int muser_iommu_dma_map(struct muser_dev *mudev, - struct vfio_iommu_type1_dma_map *map) + struct vfio_iommu_type1_dma_map *map) { struct vfio_dma_mapping *dma_map; int ret; /* TODO: support multiple DMA map operations in parallel */ mutex_lock(&mudev->dev_lock); - if (mudev->dma_map) { + if (mudev->dma_map != NULL) { mutex_unlock(&mudev->dev_lock); muser_dbg("another DMA map operation is ongoing"); return -EBUSY; } dma_map = kmalloc(sizeof(struct vfio_dma_mapping), GFP_KERNEL); - if (!dma_map) { + if (dma_map == NULL) { mutex_unlock(&mudev->dev_lock); return -ENOMEM; } @@ -818,7 +818,7 @@ out: * is called? */ static int muser_iommu_notifier(struct notifier_block *nb, unsigned long action, - void *data) + void *data) { struct muser_dev *mudev; int err; @@ -1252,10 +1252,11 @@ static int muser_mmap(struct mdev_device *const mdev, } mucmd.type = MUSER_MMAP; + mucmd.mmap_len = vma->vm_end - vma->vm_start; + mucmd.muser_cmd.type = MUSER_MMAP; + mucmd.muser_cmd.mmap.request.addr = vma->vm_pgoff; mucmd.muser_cmd.mmap.request.len = vma->vm_end - vma->vm_start; - mucmd.muser_cmd.mmap.request.pgoff = vma->vm_pgoff; - mucmd.mmap_len = vma->vm_end - vma->vm_start; /* Process mudev_cmd in server context. */ err = muser_process_cmd(mudev, &mucmd); @@ -1449,7 +1450,7 @@ static inline int maybe_install_fds(struct mudev_cmd *mucmd) static inline int mmap_done(struct mudev_cmd * const mucmd) { struct muser_cmd *cmd = &mucmd->muser_cmd; - char __user *addr = (char __user *) cmd->mmap.response.addr; + char __user *addr = (char __user *) cmd->mmap.response; int ret; if (cmd->err < 0) diff --git a/kmod/muser.h b/kmod/muser.h index 0cd76a9..34a68bc 100644 --- a/kmod/muser.h +++ b/kmod/muser.h @@ -8,8 +8,8 @@ * */ -#ifndef _LINUX_MUSER_H -#define _LINUX_MUSER_H +#ifndef _UAPI_LINUX_MUSER_H +#define _UAPI_LINUX_MUSER_H #ifndef __KERNEL__ #include <sys/types.h> @@ -47,19 +47,11 @@ struct muser_cmd_ioctl { union muser_cmd_mmap { struct { - union { - struct { - unsigned long start; - unsigned long end; - }; - unsigned long len; - }; + unsigned long addr; /* iova for DMA_MAP, offset for MMAP */ + unsigned long len; unsigned long flags; - unsigned long pgoff; } request; - struct { - unsigned long addr; - } response; + unsigned long response; }; struct muser_cmd { @@ -76,4 +68,4 @@ struct muser_cmd { #define MUSER_DEV_CMD_WAIT _IOW('M', 1, struct muser_cmd) #define MUSER_DEV_CMD_DONE _IOW('M', 2, struct muser_cmd) -#endif /* _LINUX_MUSER_H */ +#endif /* _UAPI_LINUX_MUSER_H */ diff --git a/lib/libmuser.c b/lib/libmuser.c index f9ce245..29a4375 100644 --- a/lib/libmuser.c +++ b/lib/libmuser.c @@ -511,25 +511,25 @@ static int muser_dma_unmap(lm_ctx_t * lm_ctx, struct muser_cmd *cmd) { int err; - lm_log(lm_ctx, LM_INF, "removing DMA region %lx-%lx\n", - cmd->mmap.request.start, cmd->mmap.request.end); + lm_log(lm_ctx, LM_INF, "removing DMA region %#lx@%#lx\n", + cmd->mmap.request.len, cmd->mmap.request.addr); if (lm_ctx->dma == NULL) { lm_log(lm_ctx, LM_ERR, "DMA not initialized\n"); - cmd->mmap.response.addr = -1; + cmd->mmap.response = -1; return -1; } err = dma_controller_remove_region(lm_ctx->dma, - cmd->mmap.request.start, - cmd->mmap.request.end - - cmd->mmap.request.start, lm_ctx->fd); + cmd->mmap.request.addr, + cmd->mmap.request.len, + lm_ctx->fd); if (err != 0) { - lm_log(lm_ctx, LM_ERR, "failed to remove DMA region %lx-%lx: %s\n", - cmd->mmap.request.start, cmd->mmap.request.end, strerror(err)); + lm_log(lm_ctx, LM_ERR, "failed to remove DMA region %#lx@%#lx: %s\n", + cmd->mmap.request.len, cmd->mmap.request.addr, strerror(err)); } - cmd->mmap.response.addr = err; + cmd->mmap.response = err; return err; } @@ -538,76 +538,66 @@ static int muser_dma_map(lm_ctx_t * lm_ctx, struct muser_cmd *cmd) { int err; - lm_log(lm_ctx, LM_INF, "adding DMA region %lx-%lx\n", - cmd->mmap.request.start, cmd->mmap.request.end); + lm_log(lm_ctx, LM_INF, "adding DMA region %#lx@%#lx\n", + cmd->mmap.request.len, cmd->mmap.request.addr); if (lm_ctx->dma == NULL) { lm_log(lm_ctx, LM_ERR, "DMA not initialized\n"); - cmd->mmap.response.addr = -1; + cmd->mmap.response = -1; return -1; } - if (cmd->mmap.request.start >= cmd->mmap.request.end) { - lm_log(lm_ctx, LM_ERR, "bad DMA region %lx-%lx\n", - cmd->mmap.request.start, cmd->mmap.request.end); - cmd->mmap.response.addr = -1; - return -1; - } err = dma_controller_add_region(lm_ctx, lm_ctx->dma, - cmd->mmap.request.start, - cmd->mmap.request.end - - cmd->mmap.request.start, lm_ctx->fd, 0); + cmd->mmap.request.addr, + cmd->mmap.request.len, + lm_ctx->fd, 0); if (err < 0) { - lm_log(lm_ctx, LM_ERR, "failed to add DMA region %lx-%lx: %d\n", - cmd->mmap.request.start, cmd->mmap.request.end, err); - cmd->mmap.response.addr = -1; + lm_log(lm_ctx, LM_ERR, "failed to add DMA region %#lx@%#lx: %d\n", + cmd->mmap.request.len, cmd->mmap.request.addr, err); + cmd->mmap.response = -1; return -1; } - // TODO: Are we just abusing response.addr as a rc? - cmd->mmap.response.addr = 0; + cmd->mmap.response = 0; return 0; } /* - * Callback that is executed when device memory is to be memory mapped. + * Callback that is executed when device memory is to be mmap'd. */ static int muser_mmap(lm_ctx_t * lm_ctx, struct muser_cmd *cmd) { int region, err = 0; unsigned long addr; unsigned long len = cmd->mmap.request.len; - unsigned long pgoff = cmd->mmap.request.pgoff; + unsigned long offset = cmd->mmap.request.addr; - region = lm_get_region(pgoff, len, &pgoff); + region = lm_get_region(offset, len, &offset); if (region < 0) { lm_log(lm_ctx, LM_ERR, "bad region %d\n", region); err = region; goto out; } - if (!lm_ctx->pci_info.reg_info[region].map) { + if (lm_ctx->pci_info.reg_info[region].map == NULL) { lm_log(lm_ctx, LM_ERR, "region not mmapable\n"); - err = -EINVAL; + err = -ENOTSUP; goto out; } - if (lm_ctx->pci_info.reg_info[region].map) { - addr = lm_ctx->pci_info.reg_info[region].map(lm_ctx->pvt, pgoff, len); - if ((void *)addr == MAP_FAILED) { - lm_log(lm_ctx, LM_ERR, "failed to mmap: %m\n"); - err = -errno; - goto out; - } - cmd->mmap.response.addr = addr; - } else - err = -ENOTSUP; + addr = lm_ctx->pci_info.reg_info[region].map(lm_ctx->pvt, offset, len); + if ((void *)addr == MAP_FAILED) { + err = -errno; + lm_log(lm_ctx, LM_ERR, "failed to mmap: %m\n"); + goto out; + } + cmd->mmap.response = addr; out: - if (err) { - lm_log(lm_ctx, LM_ERR, "failed to mmap device memory %x@%lx: %s\n", - len, pgoff, strerror(-errno)); + if (err != 0) { + lm_log(lm_ctx, LM_ERR, "failed to mmap device memory %#x@%#lx: %s\n", + len, offset, strerror(-errno)); cmd->err = err; err = -1; } |