]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/radeon/radeon_object.c
drm/radeon/kms: take vram mutex pointer before derefing object.
[karo-tx-linux.git] / drivers / gpu / drm / radeon / radeon_object.c
index 57b3f95c0efae878ec801f84c29112fd4ef84083..a8d18bcae7db08ba2c62cd2cedb45acc3afdeac5 100644 (file)
@@ -30,6 +30,7 @@
  *    Dave Airlie
  */
 #include <linux/list.h>
+#include <linux/slab.h>
 #include <drm/drmP.h>
 #include "radeon_drm.h"
 #include "radeon.h"
@@ -111,9 +112,11 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
 
        radeon_ttm_placement_from_domain(bo, domain);
        /* Kernel allocation are uninterruptible */
+       mutex_lock(&rdev->vram_mutex);
        r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
                        &bo->placement, 0, 0, !kernel, NULL, size,
                        &radeon_ttm_bo_destroy);
+       mutex_unlock(&rdev->vram_mutex);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS)
                        dev_err(rdev->dev,
@@ -165,11 +168,15 @@ void radeon_bo_kunmap(struct radeon_bo *bo)
 void radeon_bo_unref(struct radeon_bo **bo)
 {
        struct ttm_buffer_object *tbo;
+       struct radeon_device *rdev;
 
        if ((*bo) == NULL)
                return;
+       rdev = (*bo)->rdev;
        tbo = &((*bo)->tbo);
+       mutex_lock(&rdev->vram_mutex);
        ttm_bo_unref(&tbo);
+       mutex_unlock(&rdev->vram_mutex);
        if (tbo == NULL)
                *bo = NULL;
 }