udmabuf: separate out creating/destroying scatter-table
authorGurchetan Singh <gurchetansingh@chromium.org>
Tue, 3 Dec 2019 01:36:26 +0000 (17:36 -0800)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:34:01 +0000 (16:34 +0100)
Commit 17a7ce203490459cff14fb1c8f9a15d65fd1c544 upstream.

These are nice functions and can be re-used.

Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20191203013627.85991-3-gurchetansingh@chromium.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
drivers/dma-buf/udmabuf.c

index f0bf3ba..0a610e0 100644 (file)
@@ -47,10 +47,10 @@ static int mmap_udmabuf(struct dma_buf *buf, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct sg_table *map_udmabuf(struct dma_buf_attachment *at,
-                                   enum dma_data_direction direction)
+static struct sg_table *get_sg_table(struct device *dev, struct dma_buf *buf,
+                                    enum dma_data_direction direction)
 {
-       struct udmabuf *ubuf = at->dmabuf->priv;
+       struct udmabuf *ubuf = buf->priv;
        struct sg_table *sg;
        int ret;
 
@@ -62,7 +62,7 @@ static struct sg_table *map_udmabuf(struct dma_buf_attachment *at,
                                        GFP_KERNEL);
        if (ret < 0)
                goto err;
-       if (!dma_map_sg(at->dev, sg->sgl, sg->nents, direction)) {
+       if (!dma_map_sg(dev, sg->sgl, sg->nents, direction)) {
                ret = -EINVAL;
                goto err;
        }
@@ -74,13 +74,25 @@ err:
        return ERR_PTR(ret);
 }
 
+static void put_sg_table(struct device *dev, struct sg_table *sg,
+                        enum dma_data_direction direction)
+{
+       dma_unmap_sg(dev, sg->sgl, sg->nents, direction);
+       sg_free_table(sg);
+       kfree(sg);
+}
+
+static struct sg_table *map_udmabuf(struct dma_buf_attachment *at,
+                                   enum dma_data_direction direction)
+{
+       return get_sg_table(at->dev, at->dmabuf, direction);
+}
+
 static void unmap_udmabuf(struct dma_buf_attachment *at,
                          struct sg_table *sg,
                          enum dma_data_direction direction)
 {
-       dma_unmap_sg(at->dev, sg->sgl, sg->nents, direction);
-       sg_free_table(sg);
-       kfree(sg);
+       return put_sg_table(at->dev, sg, direction);
 }
 
 static void release_udmabuf(struct dma_buf *buf)