OSDN Git Service

drm/radeon: Maintain prime import/export refcount for BOs
authorChristopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Mon, 3 Apr 2017 03:35:22 +0000 (13:35 +1000)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 7 Apr 2017 16:20:40 +0000 (12:20 -0400)
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_prime.c

index 2e400dc..c1c8e22 100644 (file)
@@ -499,6 +499,7 @@ struct radeon_bo {
        u32                             tiling_flags;
        u32                             pitch;
        int                             surface_reg;
+       unsigned                        prime_shared_count;
        /* list of all virtual address to which this bo
         * is associated to
         */
index f3609c9..7110d40 100644 (file)
@@ -77,6 +77,7 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
        list_add_tail(&bo->list, &rdev->gem.objects);
        mutex_unlock(&rdev->gem.mutex);
 
+       bo->prime_shared_count = 1;
        return &bo->gem_base;
 }
 
@@ -91,6 +92,9 @@ int radeon_gem_prime_pin(struct drm_gem_object *obj)
 
        /* pin buffer into GTT */
        ret = radeon_bo_pin(bo, RADEON_GEM_DOMAIN_GTT, NULL);
+       if (likely(ret == 0))
+               bo->prime_shared_count++;
+
        radeon_bo_unreserve(bo);
        return ret;
 }
@@ -105,6 +109,8 @@ void radeon_gem_prime_unpin(struct drm_gem_object *obj)
                return;
 
        radeon_bo_unpin(bo);
+       if (bo->prime_shared_count)
+               bo->prime_shared_count--;
        radeon_bo_unreserve(bo);
 }