Commit de19322d authored by Dave Airlie's avatar Dave Airlie

Merge remote branch 'korg/drm-core-next' into drm-next-stage

* korg/drm-core-next:
  drm/ttm: handle OOM in ttm_tt_swapout
  drm/radeon/kms/atom: fix shr/shl ops
  drm/kms: fix spelling of "CLOCK"
  drm/kms: fix fb_changed = true else statement
  drivers/gpu/drm/drm_fb_helper.c: don't use private implementation of atoi()
  drm: switch all GEM/KMS ioctls to unlocked ioctl status.
  Use drm_gem_object_[handle_]unreference_unlocked where possible
  drm: introduce drm_gem_object_[handle_]unreference_unlocked
parents 60b341b7 290e5505
...@@ -836,11 +836,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) ...@@ -836,11 +836,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
mode_changed = true; mode_changed = true;
} else if (set->fb == NULL) { } else if (set->fb == NULL) {
mode_changed = true; mode_changed = true;
} else if ((set->fb->bits_per_pixel != } else
set->crtc->fb->bits_per_pixel) ||
set->fb->depth != set->crtc->fb->depth)
fb_changed = true;
else
fb_changed = true; fb_changed = true;
} }
......
...@@ -125,28 +125,28 @@ static struct drm_ioctl_desc drm_ioctls[] = { ...@@ -125,28 +125,28 @@ static struct drm_ioctl_desc drm_ioctls[] = {
DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, 0), DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH), DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH), DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_MASTER), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_MASTER|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER), DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_mode_attachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_mode_attachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_mode_detachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_mode_detachmode_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_MASTER | DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_MASTER | DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW), DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW) DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
}; };
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
* Dave Airlie <airlied@linux.ie> * Dave Airlie <airlied@linux.ie>
* Jesse Barnes <jesse.barnes@intel.com> * Jesse Barnes <jesse.barnes@intel.com>
*/ */
#include <linux/kernel.h>
#include <linux/sysrq.h> #include <linux/sysrq.h>
#include <linux/fb.h> #include <linux/fb.h>
#include "drmP.h" #include "drmP.h"
...@@ -50,21 +51,6 @@ int drm_fb_helper_add_connector(struct drm_connector *connector) ...@@ -50,21 +51,6 @@ int drm_fb_helper_add_connector(struct drm_connector *connector)
} }
EXPORT_SYMBOL(drm_fb_helper_add_connector); EXPORT_SYMBOL(drm_fb_helper_add_connector);
static int my_atoi(const char *name)
{
int val = 0;
for (;; name++) {
switch (*name) {
case '0' ... '9':
val = 10*val+(*name-'0');
break;
default:
return val;
}
}
}
/** /**
* drm_fb_helper_connector_parse_command_line - parse command line for connector * drm_fb_helper_connector_parse_command_line - parse command line for connector
* @connector - connector to parse line for * @connector - connector to parse line for
...@@ -111,7 +97,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con ...@@ -111,7 +97,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con
namelen = i; namelen = i;
if (!refresh_specified && !bpp_specified && if (!refresh_specified && !bpp_specified &&
!yres_specified) { !yres_specified) {
refresh = my_atoi(&name[i+1]); refresh = simple_strtol(&name[i+1], NULL, 10);
refresh_specified = 1; refresh_specified = 1;
if (cvt || rb) if (cvt || rb)
cvt = 0; cvt = 0;
...@@ -121,7 +107,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con ...@@ -121,7 +107,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con
case '-': case '-':
namelen = i; namelen = i;
if (!bpp_specified && !yres_specified) { if (!bpp_specified && !yres_specified) {
bpp = my_atoi(&name[i+1]); bpp = simple_strtol(&name[i+1], NULL, 10);
bpp_specified = 1; bpp_specified = 1;
if (cvt || rb) if (cvt || rb)
cvt = 0; cvt = 0;
...@@ -130,7 +116,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con ...@@ -130,7 +116,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con
break; break;
case 'x': case 'x':
if (!yres_specified) { if (!yres_specified) {
yres = my_atoi(&name[i+1]); yres = simple_strtol(&name[i+1], NULL, 10);
yres_specified = 1; yres_specified = 1;
} else } else
goto done; goto done;
...@@ -170,7 +156,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con ...@@ -170,7 +156,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_connector *con
} }
} }
if (i < 0 && yres_specified) { if (i < 0 && yres_specified) {
xres = my_atoi(name); xres = simple_strtol(name, NULL, 10);
res_specified = 1; res_specified = 1;
} }
done: done:
...@@ -694,7 +680,7 @@ int drm_fb_helper_set_par(struct fb_info *info) ...@@ -694,7 +680,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
int i; int i;
if (var->pixclock != 0) { if (var->pixclock != 0) {
DRM_ERROR("PIXEL CLCOK SET\n"); DRM_ERROR("PIXEL CLOCK SET\n");
return -EINVAL; return -EINVAL;
} }
......
...@@ -192,9 +192,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle) ...@@ -192,9 +192,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
idr_remove(&filp->object_idr, handle); idr_remove(&filp->object_idr, handle);
spin_unlock(&filp->table_lock); spin_unlock(&filp->table_lock);
mutex_lock(&dev->struct_mutex); drm_gem_object_handle_unreference_unlocked(obj);
drm_gem_object_handle_unreference(obj);
mutex_unlock(&dev->struct_mutex);
return 0; return 0;
} }
...@@ -325,9 +323,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data, ...@@ -325,9 +323,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
} }
err: err:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -358,9 +354,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data, ...@@ -358,9 +354,7 @@ drm_gem_open_ioctl(struct drm_device *dev, void *data,
return -ENOENT; return -ENOENT;
ret = drm_gem_handle_create(file_priv, obj, &handle); ret = drm_gem_handle_create(file_priv, obj, &handle);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
if (ret) if (ret)
return ret; return ret;
...@@ -390,7 +384,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) ...@@ -390,7 +384,7 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
{ {
struct drm_gem_object *obj = ptr; struct drm_gem_object *obj = ptr;
drm_gem_object_handle_unreference(obj); drm_gem_object_handle_unreference_unlocked(obj);
return 0; return 0;
} }
...@@ -403,16 +397,25 @@ drm_gem_object_release_handle(int id, void *ptr, void *data) ...@@ -403,16 +397,25 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
void void
drm_gem_release(struct drm_device *dev, struct drm_file *file_private) drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
{ {
mutex_lock(&dev->struct_mutex);
idr_for_each(&file_private->object_idr, idr_for_each(&file_private->object_idr,
&drm_gem_object_release_handle, NULL); &drm_gem_object_release_handle, NULL);
idr_destroy(&file_private->object_idr); idr_destroy(&file_private->object_idr);
mutex_unlock(&dev->struct_mutex); }
static void
drm_gem_object_free_common(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
fput(obj->filp);
atomic_dec(&dev->object_count);
atomic_sub(obj->size, &dev->object_memory);
kfree(obj);
} }
/** /**
* Called after the last reference to the object has been lost. * Called after the last reference to the object has been lost.
* Must be called holding struct_ mutex
* *
* Frees the object * Frees the object
*/ */
...@@ -427,13 +430,39 @@ drm_gem_object_free(struct kref *kref) ...@@ -427,13 +430,39 @@ drm_gem_object_free(struct kref *kref)
if (dev->driver->gem_free_object != NULL) if (dev->driver->gem_free_object != NULL)
dev->driver->gem_free_object(obj); dev->driver->gem_free_object(obj);
fput(obj->filp); drm_gem_object_free_common(obj);
atomic_dec(&dev->object_count);
atomic_sub(obj->size, &dev->object_memory);
kfree(obj);
} }
EXPORT_SYMBOL(drm_gem_object_free); EXPORT_SYMBOL(drm_gem_object_free);
/**
* Called after the last reference to the object has been lost.
* Must be called without holding struct_mutex
*
* Frees the object
*/
void
drm_gem_object_free_unlocked(struct kref *kref)
{
struct drm_gem_object *obj = (struct drm_gem_object *) kref;
struct drm_device *dev = obj->dev;
if (dev->driver->gem_free_object_unlocked != NULL)
dev->driver->gem_free_object_unlocked(obj);
else if (dev->driver->gem_free_object != NULL) {
mutex_lock(&dev->struct_mutex);
dev->driver->gem_free_object(obj);
mutex_unlock(&dev->struct_mutex);
}
drm_gem_object_free_common(obj);
}
EXPORT_SYMBOL(drm_gem_object_free_unlocked);
static void drm_gem_object_ref_bug(struct kref *list_kref)
{
BUG();
}
/** /**
* Called after the last handle to the object has been closed * Called after the last handle to the object has been closed
* *
...@@ -458,8 +487,10 @@ drm_gem_object_handle_free(struct kref *kref) ...@@ -458,8 +487,10 @@ drm_gem_object_handle_free(struct kref *kref)
/* /*
* The object name held a reference to this object, drop * The object name held a reference to this object, drop
* that now. * that now.
*
* This cannot be the last reference, since the handle holds one too.
*/ */
drm_gem_object_unreference(obj); kref_put(&obj->refcount, drm_gem_object_ref_bug);
} else } else
spin_unlock(&dev->object_name_lock); spin_unlock(&dev->object_name_lock);
...@@ -477,11 +508,8 @@ EXPORT_SYMBOL(drm_gem_vm_open); ...@@ -477,11 +508,8 @@ EXPORT_SYMBOL(drm_gem_vm_open);
void drm_gem_vm_close(struct vm_area_struct *vma) void drm_gem_vm_close(struct vm_area_struct *vma)
{ {
struct drm_gem_object *obj = vma->vm_private_data; struct drm_gem_object *obj = vma->vm_private_data;
struct drm_device *dev = obj->dev;
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
} }
EXPORT_SYMBOL(drm_gem_vm_close); EXPORT_SYMBOL(drm_gem_vm_close);
......
...@@ -128,9 +128,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data, ...@@ -128,9 +128,7 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
return -ENOMEM; return -ENOMEM;
ret = drm_gem_handle_create(file_priv, obj, &handle); ret = drm_gem_handle_create(file_priv, obj, &handle);
mutex_lock(&dev->struct_mutex); drm_gem_object_handle_unreference_unlocked(obj);
drm_gem_object_handle_unreference(obj);
mutex_unlock(&dev->struct_mutex);
if (ret) if (ret)
return ret; return ret;
...@@ -488,7 +486,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, ...@@ -488,7 +486,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
*/ */
if (args->offset > obj->size || args->size > obj->size || if (args->offset > obj->size || args->size > obj->size ||
args->offset + args->size > obj->size) { args->offset + args->size > obj->size) {
drm_gem_object_unreference(obj); drm_gem_object_unreference_unlocked(obj);
return -EINVAL; return -EINVAL;
} }
...@@ -501,7 +499,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, ...@@ -501,7 +499,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
file_priv); file_priv);
} }
drm_gem_object_unreference(obj); drm_gem_object_unreference_unlocked(obj);
return ret; return ret;
} }
...@@ -961,7 +959,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, ...@@ -961,7 +959,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
*/ */
if (args->offset > obj->size || args->size > obj->size || if (args->offset > obj->size || args->size > obj->size ||
args->offset + args->size > obj->size) { args->offset + args->size > obj->size) {
drm_gem_object_unreference(obj); drm_gem_object_unreference_unlocked(obj);
return -EINVAL; return -EINVAL;
} }
...@@ -995,7 +993,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, ...@@ -995,7 +993,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
DRM_INFO("pwrite failed %d\n", ret); DRM_INFO("pwrite failed %d\n", ret);
#endif #endif
drm_gem_object_unreference(obj); drm_gem_object_unreference_unlocked(obj);
return ret; return ret;
} }
...@@ -1138,9 +1136,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data, ...@@ -1138,9 +1136,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
PROT_READ | PROT_WRITE, MAP_SHARED, PROT_READ | PROT_WRITE, MAP_SHARED,
args->offset); args->offset);
up_write(&current->mm->mmap_sem); up_write(&current->mm->mmap_sem);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
if (IS_ERR((void *)addr)) if (IS_ERR((void *)addr))
return addr; return addr;
......
...@@ -438,9 +438,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data, ...@@ -438,9 +438,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
obj_priv = obj->driver_private; obj_priv = obj->driver_private;
if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) { if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) {
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
return -EINVAL; return -EINVAL;
} }
......
...@@ -3553,11 +3553,10 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc, ...@@ -3553,11 +3553,10 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
intel_crtc->cursor_bo = bo; intel_crtc->cursor_bo = bo;
return 0; return 0;
fail:
mutex_lock(&dev->struct_mutex);
fail_locked: fail_locked:
drm_gem_object_unreference(bo);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
fail:
drm_gem_object_unreference_unlocked(bo);
return ret; return ret;
} }
...@@ -4476,9 +4475,7 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) ...@@ -4476,9 +4475,7 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
intelfb_remove(dev, fb); intelfb_remove(dev, fb);
drm_framebuffer_cleanup(fb); drm_framebuffer_cleanup(fb);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(intel_fb->obj);
drm_gem_object_unreference(intel_fb->obj);
mutex_unlock(&dev->struct_mutex);
kfree(intel_fb); kfree(intel_fb);
} }
...@@ -4541,9 +4538,7 @@ intel_user_framebuffer_create(struct drm_device *dev, ...@@ -4541,9 +4538,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
ret = intel_framebuffer_create(dev, mode_cmd, &fb, obj); ret = intel_framebuffer_create(dev, mode_cmd, &fb, obj);
if (ret) { if (ret) {
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&dev->struct_mutex);
return NULL; return NULL;
} }
......
...@@ -1179,7 +1179,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, ...@@ -1179,7 +1179,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
out_unlock: out_unlock:
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
drm_gem_object_unreference(new_bo); drm_gem_object_unreference_unlocked(new_bo);
kfree(params); kfree(params);
return ret; return ret;
......
...@@ -39,11 +39,8 @@ nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb) ...@@ -39,11 +39,8 @@ nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
if (drm_fb->fbdev) if (drm_fb->fbdev)
nouveau_fbcon_remove(dev, drm_fb); nouveau_fbcon_remove(dev, drm_fb);
if (fb->nvbo) { if (fb->nvbo)
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(fb->nvbo->gem);
drm_gem_object_unreference(fb->nvbo->gem);
mutex_unlock(&dev->struct_mutex);
}
drm_framebuffer_cleanup(drm_fb); drm_framebuffer_cleanup(drm_fb);
kfree(fb); kfree(fb);
......
...@@ -401,10 +401,8 @@ nouveau_fbcon_remove(struct drm_device *dev, struct drm_framebuffer *fb) ...@@ -401,10 +401,8 @@ nouveau_fbcon_remove(struct drm_device *dev, struct drm_framebuffer *fb)
unregister_framebuffer(info); unregister_framebuffer(info);
nouveau_bo_unmap(nouveau_fb->nvbo); nouveau_bo_unmap(nouveau_fb->nvbo);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
drm_gem_object_unreference(nouveau_fb->nvbo->gem);
nouveau_fb->nvbo = NULL; nouveau_fb->nvbo = NULL;
mutex_unlock(&dev->struct_mutex);
if (par) if (par)
drm_fb_helper_free(&par->helper); drm_fb_helper_free(&par->helper);
framebuffer_release(info); framebuffer_release(info);
......
...@@ -167,12 +167,10 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data, ...@@ -167,12 +167,10 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
ret = drm_gem_handle_create(file_priv, nvbo->gem, &req->info.handle); ret = drm_gem_handle_create(file_priv, nvbo->gem, &req->info.handle);
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_handle_unreference_unlocked(nvbo->gem);
drm_gem_object_handle_unreference(nvbo->gem);
mutex_unlock(&dev->struct_mutex);
if (ret) if (ret)
drm_gem_object_unreference(nvbo->gem); drm_gem_object_unreference_unlocked(nvbo->gem);
return ret; return ret;
} }
...@@ -865,9 +863,7 @@ nouveau_gem_ioctl_pin(struct drm_device *dev, void *data, ...@@ -865,9 +863,7 @@ nouveau_gem_ioctl_pin(struct drm_device *dev, void *data,
req->domain = NOUVEAU_GEM_DOMAIN_VRAM; req->domain = NOUVEAU_GEM_DOMAIN_VRAM;
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -891,9 +887,7 @@ nouveau_gem_ioctl_unpin(struct drm_device *dev, void *data, ...@@ -891,9 +887,7 @@ nouveau_gem_ioctl_unpin(struct drm_device *dev, void *data,
ret = nouveau_bo_unpin(nouveau_gem_object(gem)); ret = nouveau_bo_unpin(nouveau_gem_object(gem));
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -935,9 +929,7 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data, ...@@ -935,9 +929,7 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data,
} }
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -965,9 +957,7 @@ nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data, ...@@ -965,9 +957,7 @@ nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data,
ret = 0; ret = 0;
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -986,9 +976,7 @@ nouveau_gem_ioctl_info(struct drm_device *dev, void *data, ...@@ -986,9 +976,7 @@ nouveau_gem_ioctl_info(struct drm_device *dev, void *data,
return -EINVAL; return -EINVAL;
ret = nouveau_gem_info(gem, req); ret = nouveau_gem_info(gem, req);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
...@@ -61,11 +61,8 @@ nouveau_notifier_init_channel(struct nouveau_channel *chan) ...@@ -61,11 +61,8 @@ nouveau_notifier_init_channel(struct nouveau_channel *chan)
chan->notifier_bo = ntfy; chan->notifier_bo = ntfy;
out_err: out_err:
if (ret) { if (ret)
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(ntfy->gem);
drm_gem_object_unreference(ntfy->gem);
mutex_unlock(&dev->struct_mutex);
}
return ret; return ret;
} }
...@@ -81,8 +78,8 @@ nouveau_notifier_takedown_channel(struct nouveau_channel *chan) ...@@ -81,8 +78,8 @@ nouveau_notifier_takedown_channel(struct nouveau_channel *chan)
nouveau_bo_unmap(chan->notifier_bo); nouveau_bo_unmap(chan->notifier_bo);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
nouveau_bo_unpin(chan->notifier_bo); nouveau_bo_unpin(chan->notifier_bo);
drm_gem_object_unreference(chan->notifier_bo->gem);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
drm_gem_object_unreference_unlocked(chan->notifier_bo->gem);
nouveau_mem_takedown(&chan->notifier_heap); nouveau_mem_takedown(&chan->notifier_heap);
} }
......
...@@ -926,9 +926,7 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, ...@@ -926,9 +926,7 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.offset); nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.offset);
nv_crtc->cursor.show(nv_crtc, true); nv_crtc->cursor.show(nv_crtc, true);
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
......
...@@ -358,9 +358,7 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv, ...@@ -358,9 +358,7 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
nv_crtc->cursor.show(nv_crtc, true); nv_crtc->cursor.show(nv_crtc, true);
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gem);
drm_gem_object_unreference(gem);
mutex_unlock(&dev->struct_mutex);
return ret; return ret;
} }
......
...@@ -881,8 +881,6 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg) ...@@ -881,8 +881,6 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
uint8_t attr = U8((*ptr)++), shift; uint8_t attr = U8((*ptr)++), shift;
uint32_t saved, dst; uint32_t saved, dst;
int dptr = *ptr; int dptr = *ptr;
attr &= 0x38;
attr |= atom_def_dst[attr >> 3] << 6;
SDEBUG(" dst: "); SDEBUG(" dst: ");
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
shift = atom_get_src(ctx, attr, ptr); shift = atom_get_src(ctx, attr, ptr);
...@@ -897,8 +895,6 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg) ...@@ -897,8 +895,6 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
uint8_t attr = U8((*ptr)++), shift; uint8_t attr = U8((*ptr)++), shift;
uint32_t saved, dst; uint32_t saved, dst;
int dptr = *ptr; int dptr = *ptr;
attr &= 0x38;
attr |= atom_def_dst[attr >> 3] << 6;
SDEBUG(" dst: "); SDEBUG(" dst: ");
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
shift = atom_get_src(ctx, attr, ptr); shift = atom_get_src(ctx, attr, ptr);
......
...@@ -194,11 +194,8 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error) ...@@ -194,11 +194,8 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
} }
radeon_bo_list_unreserve(&parser->validated); radeon_bo_list_unreserve(&parser->validated);
for (i = 0; i < parser->nrelocs; i++) { for (i = 0; i < parser->nrelocs; i++) {
if (parser->relocs[i].gobj) { if (parser->relocs[i].gobj)
mutex_lock(&parser->rdev->ddev->struct_mutex); drm_gem_object_unreference_unlocked(parser->relocs[i].gobj);
drm_gem_object_unreference(parser->relocs[i].gobj);
mutex_unlock(&parser->rdev->ddev->struct_mutex);
}
} }
kfree(parser->track); kfree(parser->track);
kfree(parser->relocs); kfree(parser->relocs);
......
...@@ -169,17 +169,13 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, ...@@ -169,17 +169,13 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,
unpin: unpin:
if (radeon_crtc->cursor_bo) { if (radeon_crtc->cursor_bo) {
radeon_gem_object_unpin(radeon_crtc->cursor_bo); radeon_gem_object_unpin(radeon_crtc->cursor_bo);
mutex_lock(&crtc->dev->struct_mutex); drm_gem_object_unreference_unlocked(radeon_crtc->cursor_bo);
drm_gem_object_unreference(radeon_crtc->cursor_bo);
mutex_unlock(&crtc->dev->struct_mutex);
} }
radeon_crtc->cursor_bo = obj; radeon_crtc->cursor_bo = obj;
return 0; return 0;
fail: fail:
mutex_lock(&crtc->dev->struct_mutex); drm_gem_object_unreference_unlocked(obj);
drm_gem_object_unreference(obj);
mutex_unlock(&crtc->dev->struct_mutex);
return 0; return 0;
} }
......
...@@ -679,11 +679,8 @@ static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb) ...@@ -679,11 +679,8 @@ static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
if (fb->fbdev) if (fb->fbdev)
radeonfb_remove(dev, fb); radeonfb_remove(dev, fb);
if (radeon_fb->obj) { if (radeon_fb->obj)
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(radeon_fb->obj);
drm_gem_object_unreference(radeon_fb->obj);
mutex_unlock(&dev->struct_mutex);
}
drm_framebuffer_cleanup(fb); drm_framebuffer_cleanup(fb);
kfree(radeon_fb); kfree(radeon_fb);
} }
......
...@@ -69,9 +69,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size, ...@@ -69,9 +69,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
if (r != -ERESTARTSYS) if (r != -ERESTARTSYS)
DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
size, initial_domain, alignment, r); size, initial_domain, alignment, r);
mutex_lock(&rdev->ddev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&rdev->ddev->struct_mutex);
return r; return r;
} }
gobj->driver_private = robj; gobj->driver_private = robj;
...@@ -202,14 +200,10 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data, ...@@ -202,14 +200,10 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,
} }
r = drm_gem_handle_create(filp, gobj, &handle); r = drm_gem_handle_create(filp, gobj, &handle);
if (r) { if (r) {
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
mutex_lock(&dev->struct_mutex); drm_gem_object_handle_unreference_unlocked(gobj);
drm_gem_object_handle_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
args->handle = handle; args->handle = handle;
return 0; return 0;
} }
...@@ -236,9 +230,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data, ...@@ -236,9 +230,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); r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
...@@ -255,9 +247,7 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, ...@@ -255,9 +247,7 @@ int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
} }
robj = gobj->driver_private; robj = gobj->driver_private;
args->addr_ptr = radeon_bo_mmap_offset(robj); args->addr_ptr = radeon_bo_mmap_offset(robj);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return 0; return 0;
} }
...@@ -288,9 +278,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, ...@@ -288,9 +278,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
default: default:
break; break;
} }
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
...@@ -311,9 +299,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, ...@@ -311,9 +299,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
/* callback hw specific functions if any */ /* callback hw specific functions if any */
if (robj->rdev->asic->ioctl_wait_idle) if (robj->rdev->asic->ioctl_wait_idle)
robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj); robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
...@@ -331,9 +317,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data, ...@@ -331,9 +317,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
return -EINVAL; return -EINVAL;
robj = gobj->driver_private; robj = gobj->driver_private;
r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
...@@ -356,8 +340,6 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data, ...@@ -356,8 +340,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_get_tiling_flags(rbo, &args->tiling_flags, &args->pitch);
radeon_bo_unreserve(rbo); radeon_bo_unreserve(rbo);
out: out:
mutex_lock(&dev->struct_mutex); drm_gem_object_unreference_unlocked(gobj);
drm_gem_object_unreference(gobj);
mutex_unlock(&dev->struct_mutex);
return r; return r;
} }
...@@ -480,7 +480,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm) ...@@ -480,7 +480,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
void *from_virtual; void *from_virtual;
void *to_virtual; void *to_virtual;
int i; int i;
int ret; int ret = -ENOMEM;
if (ttm->page_flags & TTM_PAGE_FLAG_USER) { if (ttm->page_flags & TTM_PAGE_FLAG_USER) {
ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start, ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start,
...@@ -499,8 +499,10 @@ static int ttm_tt_swapin(struct ttm_tt *ttm) ...@@ -499,8 +499,10 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
for (i = 0; i < ttm->num_pages; ++i) { for (i = 0; i < ttm->num_pages; ++i) {
from_page = read_mapping_page(swap_space, i, NULL); from_page = read_mapping_page(swap_space, i, NULL);
if (IS_ERR(from_page)) if (IS_ERR(from_page)) {
ret = PTR_ERR(from_page);
goto out_err; goto out_err;
}
to_page = __ttm_tt_get_page(ttm, i); to_page = __ttm_tt_get_page(ttm, i);
if (unlikely(to_page == NULL)) if (unlikely(to_page == NULL))
goto out_err; goto out_err;
...@@ -523,7 +525,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm) ...@@ -523,7 +525,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
return 0; return 0;
out_err: out_err:
ttm_tt_free_alloced_pages(ttm); ttm_tt_free_alloced_pages(ttm);
return -ENOMEM; return ret;
} }
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
...@@ -535,6 +537,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) ...@@ -535,6 +537,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
void *from_virtual; void *from_virtual;
void *to_virtual; void *to_virtual;
int i; int i;
int ret = -ENOMEM;
BUG_ON(ttm->state != tt_unbound && ttm->state != tt_unpopulated); BUG_ON(ttm->state != tt_unbound && ttm->state != tt_unpopulated);
BUG_ON(ttm->caching_state != tt_cached); BUG_ON(ttm->caching_state != tt_cached);
...@@ -557,7 +560,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) ...@@ -557,7 +560,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
0); 0);
if (unlikely(IS_ERR(swap_storage))) { if (unlikely(IS_ERR(swap_storage))) {
printk(KERN_ERR "Failed allocating swap storage.\n"); printk(KERN_ERR "Failed allocating swap storage.\n");
return -ENOMEM; return PTR_ERR(swap_storage);
} }
} else } else
swap_storage = persistant_swap_storage; swap_storage = persistant_swap_storage;
...@@ -569,9 +572,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) ...@@ -569,9 +572,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
if (unlikely(from_page == NULL)) if (unlikely(from_page == NULL))
continue; continue;
to_page = read_mapping_page(swap_space, i, NULL); to_page = read_mapping_page(swap_space, i, NULL);
if (unlikely(to_page == NULL)) if (unlikely(IS_ERR(to_page))) {
ret = PTR_ERR(to_page);
goto out_err; goto out_err;
}
preempt_disable(); preempt_disable();
from_virtual = kmap_atomic(from_page, KM_USER0); from_virtual = kmap_atomic(from_page, KM_USER0);
to_virtual = kmap_atomic(to_page, KM_USER1); to_virtual = kmap_atomic(to_page, KM_USER1);
...@@ -595,5 +599,5 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) ...@@ -595,5 +599,5 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
if (!persistant_swap_storage) if (!persistant_swap_storage)
fput(swap_storage); fput(swap_storage);
return -ENOMEM; return ret;
} }
...@@ -801,6 +801,7 @@ struct drm_driver { ...@@ -801,6 +801,7 @@ struct drm_driver {
*/ */
int (*gem_init_object) (struct drm_gem_object *obj); int (*gem_init_object) (struct drm_gem_object *obj);
void (*gem_free_object) (struct drm_gem_object *obj); void (*gem_free_object) (struct drm_gem_object *obj);
void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
/* vga arb irq handler */ /* vga arb irq handler */
void (*vgaarb_irq)(struct drm_device *dev, bool state); void (*vgaarb_irq)(struct drm_device *dev, bool state);
...@@ -1427,6 +1428,7 @@ extern void drm_sysfs_connector_remove(struct drm_connector *connector); ...@@ -1427,6 +1428,7 @@ extern void drm_sysfs_connector_remove(struct drm_connector *connector);
int drm_gem_init(struct drm_device *dev); int drm_gem_init(struct drm_device *dev);
void drm_gem_destroy(struct drm_device *dev); void drm_gem_destroy(struct drm_device *dev);
void drm_gem_object_free(struct kref *kref); void drm_gem_object_free(struct kref *kref);
void drm_gem_object_free_unlocked(struct kref *kref);
struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
size_t size); size_t size);
void drm_gem_object_handle_free(struct kref *kref); void drm_gem_object_handle_free(struct kref *kref);
...@@ -1443,12 +1445,17 @@ drm_gem_object_reference(struct drm_gem_object *obj) ...@@ -1443,12 +1445,17 @@ drm_gem_object_reference(struct drm_gem_object *obj)
static inline void static inline void
drm_gem_object_unreference(struct drm_gem_object *obj) drm_gem_object_unreference(struct drm_gem_object *obj)
{ {
if (obj == NULL) if (obj != NULL)
return;
kref_put(&obj->refcount, drm_gem_object_free); kref_put(&obj->refcount, drm_gem_object_free);
} }
static inline void
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
{
if (obj != NULL)
kref_put(&obj->refcount, drm_gem_object_free_unlocked);
}
int drm_gem_handle_create(struct drm_file *file_priv, int drm_gem_handle_create(struct drm_file *file_priv,
struct drm_gem_object *obj, struct drm_gem_object *obj,
u32 *handlep); u32 *handlep);
...@@ -1475,6 +1482,21 @@ drm_gem_object_handle_unreference(struct drm_gem_object *obj) ...@@ -1475,6 +1482,21 @@ drm_gem_object_handle_unreference(struct drm_gem_object *obj)
drm_gem_object_unreference(obj); drm_gem_object_unreference(obj);
} }
static inline void
drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
{
if (obj == NULL)
return;
/*
* Must bump handle count first as this may be the last
* ref, in which case the object would disappear before we
* checked for a name
*/
kref_put(&obj->handlecount, drm_gem_object_handle_free);
drm_gem_object_unreference_unlocked(obj);
}
struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
struct drm_file *filp, struct drm_file *filp,
u32 handle); u32 handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment