Skip to content

Commit 18ffe4b

Browse files
committed
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: vmwgfx: Fix fb VRAM pinning failure due to fragmentation vmwgfx: Remove initialisation of dev::devname vmwgfx: Enable use of the vblank system vmwgfx: vt-switch (master drop) fixes drm/vmwgfx: Fix breakage introduced by commit "drm: block userspace under allocating buffer and having drivers overwrite it (v2)" drm: Hold the mutex when dropping the last GEM reference (v2) drm/gem: handlecount isn't really a kref so don't make it one. drm: i810/i830: fix locked ioctl variant drm/radeon/kms: add quirk for MSI K9A2GM motherboard drm/radeon/kms: fix potential segfault in r600_ioctl_wait_idle drm: Prune GEM vma entries drm/radeon/kms: fix up encoder info messages for DFP6 drm/radeon: fix PCI ID 5657 to be an RV410
2 parents b10c4d4 + abb295f commit 18ffe4b

24 files changed

+246
-120
lines changed

drivers/gpu/drm/drm_gem.c

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ int drm_gem_object_init(struct drm_device *dev,
148148
return -ENOMEM;
149149

150150
kref_init(&obj->refcount);
151-
kref_init(&obj->handlecount);
151+
atomic_set(&obj->handle_count, 0);
152152
obj->size = size;
153153

154154
atomic_inc(&dev->object_count);
@@ -462,28 +462,6 @@ drm_gem_object_free(struct kref *kref)
462462
}
463463
EXPORT_SYMBOL(drm_gem_object_free);
464464

465-
/**
466-
* Called after the last reference to the object has been lost.
467-
* Must be called without holding struct_mutex
468-
*
469-
* Frees the object
470-
*/
471-
void
472-
drm_gem_object_free_unlocked(struct kref *kref)
473-
{
474-
struct drm_gem_object *obj = (struct drm_gem_object *) kref;
475-
struct drm_device *dev = obj->dev;
476-
477-
if (dev->driver->gem_free_object_unlocked != NULL)
478-
dev->driver->gem_free_object_unlocked(obj);
479-
else if (dev->driver->gem_free_object != NULL) {
480-
mutex_lock(&dev->struct_mutex);
481-
dev->driver->gem_free_object(obj);
482-
mutex_unlock(&dev->struct_mutex);
483-
}
484-
}
485-
EXPORT_SYMBOL(drm_gem_object_free_unlocked);
486-
487465
static void drm_gem_object_ref_bug(struct kref *list_kref)
488466
{
489467
BUG();
@@ -496,12 +474,8 @@ static void drm_gem_object_ref_bug(struct kref *list_kref)
496474
* called before drm_gem_object_free or we'll be touching
497475
* freed memory
498476
*/
499-
void
500-
drm_gem_object_handle_free(struct kref *kref)
477+
void drm_gem_object_handle_free(struct drm_gem_object *obj)
501478
{
502-
struct drm_gem_object *obj = container_of(kref,
503-
struct drm_gem_object,
504-
handlecount);
505479
struct drm_device *dev = obj->dev;
506480

507481
/* Remove any name for this object */
@@ -528,14 +502,21 @@ void drm_gem_vm_open(struct vm_area_struct *vma)
528502
struct drm_gem_object *obj = vma->vm_private_data;
529503

530504
drm_gem_object_reference(obj);
505+
506+
mutex_lock(&obj->dev->struct_mutex);
507+
drm_vm_open_locked(vma);
508+
mutex_unlock(&obj->dev->struct_mutex);
531509
}
532510
EXPORT_SYMBOL(drm_gem_vm_open);
533511

534512
void drm_gem_vm_close(struct vm_area_struct *vma)
535513
{
536514
struct drm_gem_object *obj = vma->vm_private_data;
537515

538-
drm_gem_object_unreference_unlocked(obj);
516+
mutex_lock(&obj->dev->struct_mutex);
517+
drm_vm_close_locked(vma);
518+
drm_gem_object_unreference(obj);
519+
mutex_unlock(&obj->dev->struct_mutex);
539520
}
540521
EXPORT_SYMBOL(drm_gem_vm_close);
541522

drivers/gpu/drm/drm_info.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ int drm_gem_one_name_info(int id, void *ptr, void *data)
255255

256256
seq_printf(m, "%6d %8zd %7d %8d\n",
257257
obj->name, obj->size,
258-
atomic_read(&obj->handlecount.refcount),
258+
atomic_read(&obj->handle_count),
259259
atomic_read(&obj->refcount.refcount));
260260
return 0;
261261
}

drivers/gpu/drm/drm_vm.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -433,15 +433,7 @@ static void drm_vm_open(struct vm_area_struct *vma)
433433
mutex_unlock(&dev->struct_mutex);
434434
}
435435

436-
/**
437-
* \c close method for all virtual memory types.
438-
*
439-
* \param vma virtual memory area.
440-
*
441-
* Search the \p vma private data entry in drm_device::vmalist, unlink it, and
442-
* free it.
443-
*/
444-
static void drm_vm_close(struct vm_area_struct *vma)
436+
void drm_vm_close_locked(struct vm_area_struct *vma)
445437
{
446438
struct drm_file *priv = vma->vm_file->private_data;
447439
struct drm_device *dev = priv->minor->dev;
@@ -451,14 +443,30 @@ static void drm_vm_close(struct vm_area_struct *vma)
451443
vma->vm_start, vma->vm_end - vma->vm_start);
452444
atomic_dec(&dev->vma_count);
453445

454-
mutex_lock(&dev->struct_mutex);
455446
list_for_each_entry_safe(pt, temp, &dev->vmalist, head) {
456447
if (pt->vma == vma) {
457448
list_del(&pt->head);
458449
kfree(pt);
459450
break;
460451
}
461452
}
453+
}
454+
455+
/**
456+
* \c close method for all virtual memory types.
457+
*
458+
* \param vma virtual memory area.
459+
*
460+
* Search the \p vma private data entry in drm_device::vmalist, unlink it, and
461+
* free it.
462+
*/
463+
static void drm_vm_close(struct vm_area_struct *vma)
464+
{
465+
struct drm_file *priv = vma->vm_file->private_data;
466+
struct drm_device *dev = priv->minor->dev;
467+
468+
mutex_lock(&dev->struct_mutex);
469+
drm_vm_close_locked(vma);
462470
mutex_unlock(&dev->struct_mutex);
463471
}
464472

drivers/gpu/drm/i810/i810_dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
116116
static const struct file_operations i810_buffer_fops = {
117117
.open = drm_open,
118118
.release = drm_release,
119-
.unlocked_ioctl = drm_ioctl,
119+
.unlocked_ioctl = i810_ioctl,
120120
.mmap = i810_mmap_buffers,
121121
.fasync = drm_fasync,
122122
};

drivers/gpu/drm/i830/i830_dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ static int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
118118
static const struct file_operations i830_buffer_fops = {
119119
.open = drm_open,
120120
.release = drm_release,
121-
.unlocked_ioctl = drm_ioctl,
121+
.unlocked_ioctl = i830_ioctl,
122122
.mmap = i830_mmap_buffers,
123123
.fasync = drm_fasync,
124124
};

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,12 @@ i915_gem_create_ioctl(struct drm_device *dev, void *data,
136136
return -ENOMEM;
137137

138138
ret = drm_gem_handle_create(file_priv, obj, &handle);
139+
/* drop reference from allocate - handle holds it now */
140+
drm_gem_object_unreference_unlocked(obj);
139141
if (ret) {
140-
drm_gem_object_unreference_unlocked(obj);
141142
return ret;
142143
}
143144

144-
/* Sink the floating reference from kref_init(handlecount) */
145-
drm_gem_object_handle_unreference_unlocked(obj);
146-
147145
args->handle = handle;
148146
return 0;
149147
}

drivers/gpu/drm/i915/intel_fb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,10 @@ int intel_fbdev_destroy(struct drm_device *dev,
237237
drm_fb_helper_fini(&ifbdev->helper);
238238

239239
drm_framebuffer_cleanup(&ifb->base);
240-
if (ifb->obj)
240+
if (ifb->obj) {
241+
drm_gem_object_handle_unreference(ifb->obj);
241242
drm_gem_object_unreference(ifb->obj);
243+
}
242244

243245
return 0;
244246
}

drivers/gpu/drm/nouveau/nouveau_fbcon.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *nfbdev)
352352

353353
if (nouveau_fb->nvbo) {
354354
nouveau_bo_unmap(nouveau_fb->nvbo);
355+
drm_gem_object_handle_unreference_unlocked(nouveau_fb->nvbo->gem);
355356
drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
356357
nouveau_fb->nvbo = NULL;
357358
}

drivers/gpu/drm/nouveau/nouveau_gem.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,9 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
167167
goto out;
168168

169169
ret = drm_gem_handle_create(file_priv, nvbo->gem, &req->info.handle);
170+
/* drop reference from allocate - handle holds it now */
171+
drm_gem_object_unreference_unlocked(nvbo->gem);
170172
out:
171-
drm_gem_object_handle_unreference_unlocked(nvbo->gem);
172-
173-
if (ret)
174-
drm_gem_object_unreference_unlocked(nvbo->gem);
175173
return ret;
176174
}
177175

drivers/gpu/drm/nouveau/nouveau_notifier.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ nouveau_notifier_takedown_channel(struct nouveau_channel *chan)
7979
mutex_lock(&dev->struct_mutex);
8080
nouveau_bo_unpin(chan->notifier_bo);
8181
mutex_unlock(&dev->struct_mutex);
82+
drm_gem_object_handle_unreference_unlocked(chan->notifier_bo->gem);
8283
drm_gem_object_unreference_unlocked(chan->notifier_bo->gem);
8384
drm_mm_takedown(&chan->notifier_heap);
8485
}

0 commit comments

Comments
 (0)