diff options
Diffstat (limited to 'drivers/char/drm/drm_drv.c')
-rw-r--r-- | drivers/char/drm/drm_drv.c | 39 |
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: | 390 | err_p3: |
390 | drm_sysfs_destroy(drm_class); | 391 | drm_sysfs_destroy(); |
391 | err_p2: | 392 | err_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: | 395 | err_p1: |
395 | return ret; | 396 | return ret; |
396 | } | 397 | } |
397 | 398 | ||
398 | static void __exit drm_core_exit(void) | 399 | static 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 | ||