drm: simplify drm_put_minor()
authorDavid Herrmann <dh.herrmann@gmail.com>
Sun, 20 Oct 2013 16:55:41 +0000 (18:55 +0200)
committerDave Airlie <airlied@redhat.com>
Wed, 6 Nov 2013 04:53:23 +0000 (14:53 +1000)
Allow passing NULL as minor to simplify DRM destruction paths. Also remove
the double-pointer reset as it is no longer needed. drm_put_minor() is
only called when the underlying object is destroyed. Hence, resetting
minors to NULL is not necessary.

As drm_put_minor() is no longer used by other DRM files, we can make it
static, too.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_stub.c
include/drm/drmP.h

index ae3f293229aef23b8175bb5ef049d858dc548a44..dd0cb02830f43bf820033688a37514fca84a5866 100644 (file)
@@ -343,15 +343,17 @@ static void drm_unplug_minor(struct drm_minor *minor)
 
 /**
  * drm_put_minor - Destroy DRM minor
- * @minor_p: Double pointer to DRM minor
+ * @minor: Minor to destroy
  *
- * This calls drm_unplug_minor() on the given minor and then frees it. The minor
- * pointer is reset to NULL before this returns.
+ * This calls drm_unplug_minor() on the given minor and then frees it. Nothing
+ * is done if @minor is NULL. It is fine to call this on already unplugged
+ * minors.
  * The global DRM mutex must be held by the caller.
  */
-int drm_put_minor(struct drm_minor **minor_p)
+static void drm_put_minor(struct drm_minor *minor)
 {
-       struct drm_minor *minor = *minor_p;
+       if (!minor)
+               return;
 
        DRM_DEBUG("release secondary minor %d\n", minor->index);
 
@@ -364,10 +366,7 @@ int drm_put_minor(struct drm_minor **minor_p)
        idr_remove(&drm_minors_idr, minor->index);
 
        kfree(minor);
-       *minor_p = NULL;
-       return 0;
 }
-EXPORT_SYMBOL(drm_put_minor);
 
 /**
  * Called via drm_exit() at module unload time or when pci device is
@@ -562,13 +561,11 @@ err_unload:
        if (dev->driver->unload)
                dev->driver->unload(dev);
 err_primary_node:
-       drm_put_minor(&dev->primary);
+       drm_put_minor(dev->primary);
 err_render_node:
-       if (dev->render)
-               drm_put_minor(&dev->render);
+       drm_put_minor(dev->render);
 err_control_node:
-       if (dev->control)
-               drm_put_minor(&dev->control);
+       drm_put_minor(dev->control);
 err_agp:
        if (dev->driver->bus->agp_destroy)
                dev->driver->bus->agp_destroy(dev);
@@ -603,11 +600,9 @@ void drm_dev_unregister(struct drm_device *dev)
        list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
                drm_rmmap(dev, r_list->map);
 
-       if (dev->control)
-               drm_put_minor(&dev->control);
-       if (dev->render)
-               drm_put_minor(&dev->render);
-       drm_put_minor(&dev->primary);
+       drm_put_minor(dev->control);
+       drm_put_minor(dev->render);
+       drm_put_minor(dev->primary);
 
        list_del(&dev->driver_item);
 }
index b3e4fa21300008cacbfa92560462ffaef571b59d..62da57e914f8cdd2b95dfe9f7b59b5bde07ae402 100644 (file)
@@ -1436,7 +1436,6 @@ extern struct drm_master *drm_master_get(struct drm_master *master);
 extern void drm_master_put(struct drm_master **master);
 
 extern void drm_put_dev(struct drm_device *dev);
-extern int drm_put_minor(struct drm_minor **minor);
 extern void drm_unplug_dev(struct drm_device *dev);
 extern unsigned int drm_debug;
 extern unsigned int drm_rnodes;