diff mbox series

[v4,5/9] block/nvme: Implement .bdrv_(un)register_buf

Message ID 20180110091846.10699-6-famz@redhat.com
State New
Headers show
Series block: Add VFIO based driver for NVMe device | expand

Commit Message

Fam Zheng Jan. 10, 2018, 9:18 a.m. UTC
Forward these two calls to the IOVA manager.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 block/nvme.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Stefan Hajnoczi Jan. 10, 2018, 6:56 p.m. UTC | #1
On Wed, Jan 10, 2018 at 05:18:42PM +0800, Fam Zheng wrote:
> Forward these two calls to the IOVA manager.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  block/nvme.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
diff mbox series

Patch

diff --git a/block/nvme.c b/block/nvme.c
index 5162272e5b..7042743929 100644
--- a/block/nvme.c
+++ b/block/nvme.c
@@ -1089,6 +1089,27 @@  static void nvme_aio_unplug(BlockDriverState *bs)
     }
 }
 
+static void nvme_register_buf(BlockDriverState *bs, void *host, size_t size)
+{
+    int ret;
+    BDRVNVMeState *s = bs->opaque;
+
+    ret = qemu_vfio_dma_map(s->vfio, host, size, false, NULL);
+    if (ret) {
+        /* FIXME: we may run out of IOVA addresses after repeated
+         * bdrv_register_buf/bdrv_unregister_buf, because nvme_vfio_dma_unmap
+         * doesn't reclaim addresses for fixed mappings. */
+        error_report("nvme_register_buf failed: %s", strerror(-ret));
+    }
+}
+
+static void nvme_unregister_buf(BlockDriverState *bs, void *host)
+{
+    BDRVNVMeState *s = bs->opaque;
+
+    qemu_vfio_dma_unmap(s->vfio, host);
+}
+
 static BlockDriver bdrv_nvme = {
     .format_name              = "nvme",
     .protocol_name            = "nvme",
@@ -1114,6 +1135,9 @@  static BlockDriver bdrv_nvme = {
 
     .bdrv_io_plug             = nvme_aio_plug,
     .bdrv_io_unplug           = nvme_aio_unplug,
+
+    .bdrv_register_buf        = nvme_register_buf,
+    .bdrv_unregister_buf      = nvme_unregister_buf,
 };
 
 static void bdrv_nvme_init(void)