diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/drm_pci.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_platform.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_stub.c | 35 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_usb.c | 2 |
4 files changed, 28 insertions, 13 deletions
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index 743589dc47ce..cabe2bd702ae 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c | |||
@@ -354,7 +354,7 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | |||
354 | err_pci: | 354 | err_pci: |
355 | pci_disable_device(pdev); | 355 | pci_disable_device(pdev); |
356 | err_free: | 356 | err_free: |
357 | kfree(dev); | 357 | drm_dev_free(dev); |
358 | return ret; | 358 | return ret; |
359 | } | 359 | } |
360 | EXPORT_SYMBOL(drm_get_pci_dev); | 360 | EXPORT_SYMBOL(drm_get_pci_dev); |
diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c index a0f91f85651f..fc24fee8ec83 100644 --- a/drivers/gpu/drm/drm_platform.c +++ b/drivers/gpu/drm/drm_platform.c | |||
@@ -64,7 +64,7 @@ static int drm_get_platform_dev(struct platform_device *platdev, | |||
64 | return 0; | 64 | return 0; |
65 | 65 | ||
66 | err_free: | 66 | err_free: |
67 | kfree(dev); | 67 | drm_dev_free(dev); |
68 | return ret; | 68 | return ret; |
69 | } | 69 | } |
70 | 70 | ||
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 432994aafc3b..3b5b07482de8 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
@@ -363,7 +363,6 @@ static void drm_unplug_minor(struct drm_minor *minor) | |||
363 | */ | 363 | */ |
364 | void drm_put_dev(struct drm_device *dev) | 364 | void drm_put_dev(struct drm_device *dev) |
365 | { | 365 | { |
366 | struct drm_driver *driver; | ||
367 | struct drm_map_list *r_list, *list_temp; | 366 | struct drm_map_list *r_list, *list_temp; |
368 | 367 | ||
369 | DRM_DEBUG("\n"); | 368 | DRM_DEBUG("\n"); |
@@ -372,7 +371,6 @@ void drm_put_dev(struct drm_device *dev) | |||
372 | DRM_ERROR("cleanup called no dev\n"); | 371 | DRM_ERROR("cleanup called no dev\n"); |
373 | return; | 372 | return; |
374 | } | 373 | } |
375 | driver = dev->driver; | ||
376 | 374 | ||
377 | drm_lastclose(dev); | 375 | drm_lastclose(dev); |
378 | 376 | ||
@@ -386,9 +384,6 @@ void drm_put_dev(struct drm_device *dev) | |||
386 | 384 | ||
387 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) | 385 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) |
388 | drm_rmmap(dev, r_list->map); | 386 | drm_rmmap(dev, r_list->map); |
389 | drm_ht_remove(&dev->map_hash); | ||
390 | |||
391 | drm_ctxbitmap_cleanup(dev); | ||
392 | 387 | ||
393 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 388 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
394 | drm_put_minor(&dev->control); | 389 | drm_put_minor(&dev->control); |
@@ -396,14 +391,11 @@ void drm_put_dev(struct drm_device *dev) | |||
396 | if (dev->render) | 391 | if (dev->render) |
397 | drm_put_minor(&dev->render); | 392 | drm_put_minor(&dev->render); |
398 | 393 | ||
399 | if (driver->driver_features & DRIVER_GEM) | ||
400 | drm_gem_destroy(dev); | ||
401 | |||
402 | drm_put_minor(&dev->primary); | 394 | drm_put_minor(&dev->primary); |
403 | 395 | ||
404 | list_del(&dev->driver_item); | 396 | list_del(&dev->driver_item); |
405 | kfree(dev->devname); | 397 | |
406 | kfree(dev); | 398 | drm_dev_free(dev); |
407 | } | 399 | } |
408 | EXPORT_SYMBOL(drm_put_dev); | 400 | EXPORT_SYMBOL(drm_put_dev); |
409 | 401 | ||
@@ -502,6 +494,29 @@ err_free: | |||
502 | EXPORT_SYMBOL(drm_dev_alloc); | 494 | EXPORT_SYMBOL(drm_dev_alloc); |
503 | 495 | ||
504 | /** | 496 | /** |
497 | * drm_dev_free - Free DRM device | ||
498 | * @dev: DRM device to free | ||
499 | * | ||
500 | * Free a DRM device that has previously been allocated via drm_dev_alloc(). | ||
501 | * You must not use kfree() instead or you will leak memory. | ||
502 | * | ||
503 | * This must not be called once the device got registered. Use drm_put_dev() | ||
504 | * instead, which then calls drm_dev_free(). | ||
505 | */ | ||
506 | void drm_dev_free(struct drm_device *dev) | ||
507 | { | ||
508 | if (dev->driver->driver_features & DRIVER_GEM) | ||
509 | drm_gem_destroy(dev); | ||
510 | |||
511 | drm_ctxbitmap_cleanup(dev); | ||
512 | drm_ht_remove(&dev->map_hash); | ||
513 | |||
514 | kfree(dev->devname); | ||
515 | kfree(dev); | ||
516 | } | ||
517 | EXPORT_SYMBOL(drm_dev_free); | ||
518 | |||
519 | /** | ||
505 | * drm_dev_register - Register DRM device | 520 | * drm_dev_register - Register DRM device |
506 | * @dev: Device to register | 521 | * @dev: Device to register |
507 | * | 522 | * |
diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c index 5ef353f77b5a..b179b70e7853 100644 --- a/drivers/gpu/drm/drm_usb.c +++ b/drivers/gpu/drm/drm_usb.c | |||
@@ -29,7 +29,7 @@ int drm_get_usb_dev(struct usb_interface *interface, | |||
29 | return 0; | 29 | return 0; |
30 | 30 | ||
31 | err_free: | 31 | err_free: |
32 | kfree(dev); | 32 | drm_dev_free(dev); |
33 | return ret; | 33 | return ret; |
34 | 34 | ||
35 | } | 35 | } |