aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/drm/drm_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/drm/drm_drv.c')
-rw-r--r--drivers/char/drm/drm_drv.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/drivers/char/drm/drm_drv.c b/drivers/char/drm/drm_drv.c
index 44a46268b02b..0e7af53c87de 100644
--- a/drivers/char/drm/drm_drv.c
+++ b/drivers/char/drm/drm_drv.c
@@ -200,8 +200,10 @@ int drm_lastclose(struct drm_device * dev)
200 } 200 }
201 201
202 list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) { 202 list_for_each_entry_safe(r_list, list_t, &dev->maplist, head) {
203 drm_rmmap_locked(dev, r_list->map); 203 if (!(r_list->map->flags & _DRM_DRIVER)) {
204 r_list = NULL; 204 drm_rmmap_locked(dev, r_list->map);
205 r_list = NULL;
206 }
205 } 207 }
206 208
207 if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) { 209 if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) {
@@ -255,8 +257,6 @@ int drm_init(struct drm_driver *driver)
255 257
256 DRM_DEBUG("\n"); 258 DRM_DEBUG("\n");
257 259
258 drm_mem_init();
259
260 for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) { 260 for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
261 pid = (struct pci_device_id *)&driver->pci_driver.id_table[i]; 261 pid = (struct pci_device_id *)&driver->pci_driver.id_table[i];
262 262
@@ -293,10 +293,6 @@ static void drm_cleanup(struct drm_device * dev)
293 293
294 drm_lastclose(dev); 294 drm_lastclose(dev);
295 295
296 drm_ht_remove(&dev->map_hash);
297
298 drm_ctxbitmap_cleanup(dev);
299
300 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && 296 if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
301 dev->agp && dev->agp->agp_mtrr >= 0) { 297 dev->agp && dev->agp->agp_mtrr >= 0) {
302 int retval; 298 int retval;
@@ -314,6 +310,9 @@ static void drm_cleanup(struct drm_device * dev)
314 if (dev->driver->unload) 310 if (dev->driver->unload)
315 dev->driver->unload(dev); 311 dev->driver->unload(dev);
316 312
313 drm_ht_remove(&dev->map_hash);
314 drm_ctxbitmap_cleanup(dev);
315
317 drm_put_head(&dev->primary); 316 drm_put_head(&dev->primary);
318 if (drm_put_dev(dev)) 317 if (drm_put_dev(dev))
319 DRM_ERROR("Cannot unload module\n"); 318 DRM_ERROR("Cannot unload module\n");
@@ -383,22 +382,24 @@ static int __init drm_core_init(void)
383 goto err_p3; 382 goto err_p3;
384 } 383 }
385 384
385 drm_mem_init();
386
386 DRM_INFO("Initialized %s %d.%d.%d %s\n", 387 DRM_INFO("Initialized %s %d.%d.%d %s\n",
387 CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE); 388 CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
388 return 0; 389 return 0;
389 err_p3: 390err_p3:
390 drm_sysfs_destroy(drm_class); 391 drm_sysfs_destroy();
391 err_p2: 392err_p2:
392 unregister_chrdev(DRM_MAJOR, "drm"); 393 unregister_chrdev(DRM_MAJOR, "drm");
393 drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB); 394 drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB);
394 err_p1: 395err_p1:
395 return ret; 396 return ret;
396} 397}
397 398
398static void __exit drm_core_exit(void) 399static void __exit drm_core_exit(void)
399{ 400{
400 remove_proc_entry("dri", NULL); 401 remove_proc_entry("dri", NULL);
401 drm_sysfs_destroy(drm_class); 402 drm_sysfs_destroy();
402 403
403 unregister_chrdev(DRM_MAJOR, "drm"); 404 unregister_chrdev(DRM_MAJOR, "drm");
404 405
@@ -494,23 +495,25 @@ int drm_ioctl(struct inode *inode, struct file *filp,
494 } else { 495 } else {
495 if (cmd & (IOC_IN | IOC_OUT)) { 496 if (cmd & (IOC_IN | IOC_OUT)) {
496 kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL); 497 kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
497 if (!kdata) 498 if (!kdata) {
498 return -ENOMEM; 499 retcode = -ENOMEM;
500 goto err_i1;
501 }
499 } 502 }
500 503
501 if (cmd & IOC_IN) { 504 if (cmd & IOC_IN) {
502 if (copy_from_user(kdata, (void __user *)arg, 505 if (copy_from_user(kdata, (void __user *)arg,
503 _IOC_SIZE(cmd)) != 0) { 506 _IOC_SIZE(cmd)) != 0) {
504 retcode = -EACCES; 507 retcode = -EFAULT;
505 goto err_i1; 508 goto err_i1;
506 } 509 }
507 } 510 }
508 retcode = func(dev, kdata, file_priv); 511 retcode = func(dev, kdata, file_priv);
509 512
510 if (cmd & IOC_OUT) { 513 if ((retcode == 0) && (cmd & IOC_OUT)) {
511 if (copy_to_user((void __user *)arg, kdata, 514 if (copy_to_user((void __user *)arg, kdata,
512 _IOC_SIZE(cmd)) != 0) 515 _IOC_SIZE(cmd)) != 0)
513 retcode = -EACCES; 516 retcode = -EFAULT;
514 } 517 }
515 } 518 }
516 519