Author: dumbbell
Date: Sun Aug 25 00:22:34 2013
New Revision: 254821
URL: http://svnweb.freebsd.org/changeset/base/254821

Log:
  drm: Fix cleanup if device initialization fails
  
  This plugs some memory leaks.

Modified:
  head/sys/dev/drm2/drm_drv.c

Modified: head/sys/dev/drm2/drm_drv.c
==============================================================================
--- head/sys/dev/drm2/drm_drv.c Sun Aug 25 00:13:53 2013        (r254820)
+++ head/sys/dev/drm2/drm_drv.c Sun Aug 25 00:22:34 2013        (r254821)
@@ -313,8 +313,22 @@ int drm_attach(device_t kdev, drm_pci_id
        sx_init(&dev->dev_struct_lock, "drmslk");
 
        error = drm_load(dev);
-       if (error == 0)
-               error = drm_create_cdevs(kdev);
+       if (error)
+               goto error;
+
+       error = drm_create_cdevs(kdev);
+       if (error)
+               goto error;
+
+       return (error);
+error:
+       if (dev->irqr) {
+               bus_release_resource(dev->device, SYS_RES_IRQ,
+                   dev->irqrid, dev->irqr);
+       }
+       if (dev->msi_enabled) {
+               pci_release_msi(dev->device);
+       }
        return (error);
 }
 
@@ -572,7 +586,7 @@ static int drm_load(struct drm_device *d
                        DRM_ERROR("Request to enable bus-master failed.\n");
                DRM_UNLOCK(dev);
                if (retcode != 0)
-                       goto error;
+                       goto error1;
        }
 
        DRM_INFO("Initialized %s %d.%d.%d %s\n",
@@ -586,7 +600,9 @@ static int drm_load(struct drm_device *d
 
 error1:
        delete_unrhdr(dev->drw_unrhdr);
+       drm_gem_destroy(dev);
 error:
+       drm_ctxbitmap_cleanup(dev);
        drm_sysctl_cleanup(dev);
        DRM_LOCK(dev);
        drm_lastclose(dev);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to