struct virtio_gpu_object {
        struct drm_gem_shmem_object base;
+       struct sg_table *sgt;
        uint32_t hw_res_handle;
        bool dumb;
        bool created;
 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
        struct drm_device *dev, struct dma_buf_attachment *attach,
        struct sg_table *sgt);
+int virtgpu_dma_buf_import_sgt(struct virtio_gpu_mem_entry **ents,
+                              unsigned int *nents,
+                              struct virtio_gpu_object *bo,
+                              struct dma_buf_attachment *attach);
 
 /* virtgpu_debugfs.c */
 void virtio_gpu_debugfs_init(struct drm_minor *minor);
 
 
 #include "virtgpu_drv.h"
 
+MODULE_IMPORT_NS(DMA_BUF);
+
 static int virtgpu_virtio_get_uuid(struct dma_buf *buf,
                                   uuid_t *uuid)
 {
        return buf;
 }
 
+int virtgpu_dma_buf_import_sgt(struct virtio_gpu_mem_entry **ents,
+                              unsigned int *nents,
+                              struct virtio_gpu_object *bo,
+                              struct dma_buf_attachment *attach)
+{
+       struct scatterlist *sl;
+       struct sg_table *sgt;
+       long i, ret;
+
+       dma_resv_assert_held(attach->dmabuf->resv);
+
+       ret = dma_resv_wait_timeout(attach->dmabuf->resv,
+                                   DMA_RESV_USAGE_KERNEL,
+                                   false, MAX_SCHEDULE_TIMEOUT);
+       if (ret <= 0)
+               return ret < 0 ? ret : -ETIMEDOUT;
+
+       sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
+       if (IS_ERR(sgt))
+               return PTR_ERR(sgt);
+
+       *ents = kvmalloc_array(sgt->nents,
+                              sizeof(struct virtio_gpu_mem_entry),
+                              GFP_KERNEL);
+       if (!(*ents)) {
+               dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
+               return -ENOMEM;
+       }
+
+       *nents = sgt->nents;
+       for_each_sgtable_dma_sg(sgt, sl, i) {
+               (*ents)[i].addr = cpu_to_le64(sg_dma_address(sl));
+               (*ents)[i].length = cpu_to_le32(sg_dma_len(sl));
+               (*ents)[i].padding = 0;
+       }
+
+       bo->sgt = sgt;
+       return 0;
+}
+
 struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
                                                struct dma_buf *buf)
 {