Merge branch 'drm-ttm-unmappable' into drm-core-next
[pandora-kernel.git] / drivers / gpu / drm / radeon / radeon_gem.c
index db8e9a3..a72a3ee 100644 (file)
@@ -44,6 +44,9 @@ void radeon_gem_object_free(struct drm_gem_object *gobj)
        if (robj) {
                radeon_bo_unref(&robj);
        }
+
+       drm_gem_object_release(gobj);
+       kfree(gobj);
 }
 
 int radeon_gem_object_create(struct radeon_device *rdev, int size,
@@ -69,9 +72,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
                if (r != -ERESTARTSYS)
                        DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
                                  size, initial_domain, alignment, r);
-               mutex_lock(&rdev->ddev->struct_mutex);
-               drm_gem_object_unreference(gobj);
-               mutex_unlock(&rdev->ddev->struct_mutex);
+               drm_gem_object_unreference_unlocked(gobj);
                return r;
        }
        gobj->driver_private = robj;
@@ -160,8 +161,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
        args->vram_visible = rdev->mc.real_vram_size;
        if (rdev->stollen_vga_memory)
                args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
-       if (rdev->fbdev_rbo)
-               args->vram_visible -= radeon_bo_size(rdev->fbdev_rbo);
+       args->vram_visible -= radeon_fbdev_total_size(rdev);
        args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 -
                RADEON_IB_POOL_SIZE*64*1024;
        return 0;
@@ -202,14 +202,10 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,
        }
        r = drm_gem_handle_create(filp, gobj, &handle);
        if (r) {
-               mutex_lock(&dev->struct_mutex);
-               drm_gem_object_unreference(gobj);
-               mutex_unlock(&dev->struct_mutex);
+               drm_gem_object_unreference_unlocked(gobj);
                return r;
        }
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_handle_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_handle_unreference_unlocked(gobj);
        args->handle = handle;
        return 0;
 }
@@ -236,9 +232,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 
        r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
 
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return r;
 }
 
@@ -255,9 +249,7 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
        }
        robj = gobj->driver_private;
        args->addr_ptr = radeon_bo_mmap_offset(robj);
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return 0;
 }
 
@@ -288,9 +280,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
        default:
                break;
        }
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return r;
 }
 
@@ -311,9 +301,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
        /* callback hw specific functions if any */
        if (robj->rdev->asic->ioctl_wait_idle)
                robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return r;
 }
 
@@ -331,9 +319,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
                return -EINVAL;
        robj = gobj->driver_private;
        r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return r;
 }
 
@@ -356,8 +342,6 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
        radeon_bo_get_tiling_flags(rbo, &args->tiling_flags, &args->pitch);
        radeon_bo_unreserve(rbo);
 out:
-       mutex_lock(&dev->struct_mutex);
-       drm_gem_object_unreference(gobj);
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(gobj);
        return r;
 }