aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kmod/muser.c21
-rw-r--r--kmod/muser.h20
-rw-r--r--lib/libmuser.c78
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;
}