diff options
Diffstat (limited to 'linux-core/drm_drv.c')
| -rw-r--r-- | linux-core/drm_drv.c | 57 | 
1 files changed, 27 insertions, 30 deletions
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 3c2794d0..1daa8653 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -416,35 +416,35 @@ static void drm_cleanup(struct drm_device * dev)  	drm_mm_takedown(&dev->offset_manager);  	drm_ht_remove(&dev->object_hash); -	drm_put_head(&dev->primary); +	drm_put_minor(&dev->primary);  	if (drm_put_dev(dev))  		DRM_ERROR("Cannot unload module\n");  } -void drm_exit(struct drm_driver *driver) +int drm_minors_cleanup(int id, void *ptr, void *data)  { -	int i; -	struct drm_device *dev = NULL; -	struct drm_head *head; +	struct drm_minor *minor = ptr; +	struct drm_device *dev; +	struct drm_driver *driver = data; + +	dev = minor->dev; +	if (minor->dev->driver != driver) +		return 0; + +	if (minor->type != DRM_MINOR_LEGACY) +		return 0; +	if (dev) +		pci_dev_put(dev->pdev); +	drm_cleanup(dev); +	return 1; +} + +void drm_exit(struct drm_driver *driver) +{  	DRM_DEBUG("\n");  	if (drm_fb_loaded) { -		for (i = 0; i < drm_cards_limit; i++) { -			head = drm_heads[i]; -			if (!head) -				continue; -			if (!head->dev) -				continue; -			if (head->dev->driver != driver) -				continue; -			dev = head->dev; -			if (dev) { -				/* release the pci driver */ -				if (dev->pdev) -					pci_dev_put(dev->pdev); -				drm_cleanup(dev); -			} -		} +		idr_for_each(&drm_minors_idr, &drm_minors_cleanup, driver);  	} else  		pci_unregister_driver(&driver->pci_driver);  #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)) @@ -467,6 +467,7 @@ static int __init drm_core_init(void)  	unsigned long avail_memctl_mem;  	unsigned long max_memctl_mem; +	idr_init(&drm_minors_idr);  	si_meminfo(&si);  	/* @@ -488,11 +489,6 @@ static int __init drm_core_init(void)  	drm_init_memctl(avail_memctl_mem/2, avail_memctl_mem*3/4, si.mem_unit);  	ret = -ENOMEM; -	drm_cards_limit = -	    (drm_cards_limit < DRM_MAX_MINOR + 1 ? drm_cards_limit : DRM_MAX_MINOR + 1); -	drm_heads = drm_calloc(drm_cards_limit, sizeof(*drm_heads), DRM_MEM_STUB); -	if (!drm_heads) -		goto err_p1;  	if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))  		goto err_p1; @@ -521,7 +517,8 @@ err_p3:  	drm_sysfs_destroy();  err_p2:  	unregister_chrdev(DRM_MAJOR, "drm"); -	drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB); + +	idr_destroy(&drm_minors_idr);  err_p1:  	return ret;  } @@ -533,7 +530,7 @@ static void __exit drm_core_exit(void)  	unregister_chrdev(DRM_MAJOR, "drm"); -	drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB); +	idr_destroy(&drm_minors_idr);  }  module_init(drm_core_init); @@ -593,7 +590,7 @@ EXPORT_SYMBOL(drm_ioctl);  long drm_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  {  	struct drm_file *file_priv = filp->private_data; -	struct drm_device *dev = file_priv->head->dev; +	struct drm_device *dev = file_priv->minor->dev;  	struct drm_ioctl_desc *ioctl;  	drm_ioctl_t *func;  	unsigned int nr = DRM_IOCTL_NR(cmd); @@ -605,7 +602,7 @@ long drm_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  	++file_priv->ioctl_count;  	DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n", -		  current->pid, cmd, nr, (long)old_encode_dev(file_priv->head->device), +		  current->pid, cmd, nr, (long)old_encode_dev(file_priv->minor->device),  		  file_priv->authenticated);  	if ((nr >= DRM_CORE_IOCTL_COUNT) &&  | 
