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
}

drivers/gpu/drm/radeon/r600.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3528,7 +3528,8 @@ void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
35283528
/* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
35293529
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
35303530
*/
3531-
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) {
3531+
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
3532+
rdev->vram_scratch.ptr) {
35323533
void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
35333534
u32 tmp;
35343535

drivers/gpu/drm/radeon/radeon_atombios.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
317317
*connector_type = DRM_MODE_CONNECTOR_DVID;
318318
}
319319

320+
/* MSI K9A2GM V2/V3 board has no HDMI or DVI */
321+
if ((dev->pdev->device == 0x796e) &&
322+
(dev->pdev->subsystem_vendor == 0x1462) &&
323+
(dev->pdev->subsystem_device == 0x7302)) {
324+
if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
325+
(supported_device == ATOM_DEVICE_DFP3_SUPPORT))
326+
return false;
327+
}
328+
320329
/* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
321330
if ((dev->pdev->device == 0x7941) &&
322331
(dev->pdev->subsystem_vendor == 0x147b) &&

drivers/gpu/drm/radeon/radeon_display.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,8 @@ static void radeon_print_display_setup(struct drm_device *dev)
349349
DRM_INFO(" DFP4: %s\n", encoder_names[radeon_encoder->encoder_id]);
350350
if (devices & ATOM_DEVICE_DFP5_SUPPORT)
351351
DRM_INFO(" DFP5: %s\n", encoder_names[radeon_encoder->encoder_id]);
352+
if (devices & ATOM_DEVICE_DFP6_SUPPORT)
353+
DRM_INFO(" DFP6: %s\n", encoder_names[radeon_encoder->encoder_id]);
352354
if (devices & ATOM_DEVICE_TV1_SUPPORT)
353355
DRM_INFO(" TV1: %s\n", encoder_names[radeon_encoder->encoder_id]);
354356
if (devices & ATOM_DEVICE_CV_SUPPORT)
@@ -841,8 +843,9 @@ static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
841843
{
842844
struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
843845

844-
if (radeon_fb->obj)
846+
if (radeon_fb->obj) {
845847
drm_gem_object_unreference_unlocked(radeon_fb->obj);
848+
}
846849
drm_framebuffer_cleanup(fb);
847850
kfree(radeon_fb);
848851
}

drivers/gpu/drm/radeon/radeon_fb.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,10 @@ static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj)
9494
ret = radeon_bo_reserve(rbo, false);
9595
if (likely(ret == 0)) {
9696
radeon_bo_kunmap(rbo);
97+
radeon_bo_unpin(rbo);
9798
radeon_bo_unreserve(rbo);
9899
}
100+
drm_gem_object_handle_unreference(gobj);
99101
drm_gem_object_unreference_unlocked(gobj);
100102
}
101103

@@ -325,8 +327,6 @@ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfb
325327
{
326328
struct fb_info *info;
327329
struct radeon_framebuffer *rfb = &rfbdev->rfb;
328-
struct radeon_bo *rbo;
329-
int r;
330330

331331
if (rfbdev->helper.fbdev) {
332332
info = rfbdev->helper.fbdev;
@@ -338,14 +338,8 @@ static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfb
338338
}
339339

340340
if (rfb->obj) {
341-
rbo = rfb->obj->driver_private;
342-
r = radeon_bo_reserve(rbo, false);
343-
if (likely(r == 0)) {
344-
radeon_bo_kunmap(rbo);
345-
radeon_bo_unpin(rbo);
346-
radeon_bo_unreserve(rbo);
347-
}
348-
drm_gem_object_unreference_unlocked(rfb->obj);
341+
radeonfb_destroy_pinned_object(rfb->obj);
342+
rfb->obj = NULL;
349343
}
350344
drm_fb_helper_fini(&rfbdev->helper);
351345
drm_framebuffer_cleanup(&rfb->base);

drivers/gpu/drm/radeon/radeon_gem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,11 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,
201201
return r;
202202
}
203203
r = drm_gem_handle_create(filp, gobj, &handle);
204+
/* drop reference from allocate - handle holds it now */
205+
drm_gem_object_unreference_unlocked(gobj);
204206
if (r) {
205-
drm_gem_object_unreference_unlocked(gobj);
206207
return r;
207208
}
208-
drm_gem_object_handle_unreference_unlocked(gobj);
209209
args->handle = handle;
210210
return 0;
211211
}

0 commit comments

Comments
 (0)