]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/exynos: Convert from atomic_t to refcount_t on g2d_cmdlist_userptr->refcount
authorXiyu Yang <xiyuyang19@fudan.edu.cn>
Mon, 19 Jul 2021 05:58:51 +0000 (13:58 +0800)
committerInki Dae <inki.dae@samsung.com>
Sat, 21 Aug 2021 16:56:38 +0000 (01:56 +0900)
refcount_t type and corresponding API can protect refcounters from
accidental underflow and overflow and further use-after-free situations.

Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn>
Signed-off-by: Xin Tan <tanxin.ctf@gmail.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_g2d.c

index 0ed665501ac488d7ae7282090ecd792d4cc805fd..b00230626c6a008fcd46d9d6ae92861ac193c307 100644 (file)
@@ -4,6 +4,7 @@
  * Authors: Joonyoung Shim <jy0922.shim@samsung.com>
  */
 
+#include <linux/refcount.h>
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/delay.h>
@@ -208,7 +209,7 @@ struct g2d_cmdlist_userptr {
        struct page             **pages;
        unsigned int            npages;
        struct sg_table         *sgt;
-       atomic_t                refcount;
+       refcount_t              refcount;
        bool                    in_pool;
        bool                    out_of_list;
 };
@@ -386,9 +387,9 @@ static void g2d_userptr_put_dma_addr(struct g2d_data *g2d,
        if (force)
                goto out;
 
-       atomic_dec(&g2d_userptr->refcount);
+       refcount_dec(&g2d_userptr->refcount);
 
-       if (atomic_read(&g2d_userptr->refcount) > 0)
+       if (refcount_read(&g2d_userptr->refcount) > 0)
                return;
 
        if (g2d_userptr->in_pool)
@@ -436,7 +437,7 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct g2d_data *g2d,
                         * and different size.
                         */
                        if (g2d_userptr->size == size) {
-                               atomic_inc(&g2d_userptr->refcount);
+                               refcount_inc(&g2d_userptr->refcount);
                                *obj = g2d_userptr;
 
                                return &g2d_userptr->dma_addr;
@@ -461,7 +462,7 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct g2d_data *g2d,
        if (!g2d_userptr)
                return ERR_PTR(-ENOMEM);
 
-       atomic_set(&g2d_userptr->refcount, 1);
+       refcount_set(&g2d_userptr->refcount, 1);
        g2d_userptr->size = size;
 
        start = userptr & PAGE_MASK;