Author: np
Date: Sat Nov 19 00:20:28 2011
New Revision: 227689
URL: http://svn.freebsd.org/changeset/base/227689

Log:
  Do not increment the parent firmware's reference count when any other
  firmware image in the module is registered.  Instead, do it when the
  other image is itself referenced.
  
  This allows a module with multiple firmware images to be automatically
  unloaded when none of the firmware images are in use.
  
  Discussed with:       jhb@ (on -hackers)

Modified:
  head/sys/kern/subr_firmware.c

Modified: head/sys/kern/subr_firmware.c
==============================================================================
--- head/sys/kern/subr_firmware.c       Fri Nov 18 22:58:13 2011        
(r227688)
+++ head/sys/kern/subr_firmware.c       Sat Nov 19 00:20:28 2011        
(r227689)
@@ -198,10 +198,8 @@ firmware_register(const char *imagename,
        frp->fw.data = data;
        frp->fw.datasize = datasize;
        frp->fw.version = version;
-       if (parent != NULL) {
+       if (parent != NULL)
                frp->parent = PRIV_FW(parent);
-               frp->parent->refcnt++;
-       }
        mtx_unlock(&firmware_mtx);
        if (bootverbose)
                printf("firmware: '%s' version %u: %zu bytes loaded at %p\n",
@@ -235,8 +233,6 @@ firmware_unregister(const char *imagenam
        }  else {
                linker_file_t x = fp->file;     /* save value */
 
-               if (fp->parent != NULL) /* release parent reference */
-                       fp->parent->refcnt--;
                /*
                 * Clear the whole entry with bzero to make sure we
                 * do not forget anything. Then restore 'file' which is
@@ -341,6 +337,8 @@ firmware_get(const char *imagename)
                return NULL;
        }
 found:                         /* common exit point on success */
+       if (fp->refcnt == 0 && fp->parent != NULL)
+               fp->parent->refcnt++;
        fp->refcnt++;
        mtx_unlock(&firmware_mtx);
        return &fp->fw;
@@ -363,6 +361,8 @@ firmware_put(const struct firmware *p, i
        mtx_lock(&firmware_mtx);
        fp->refcnt--;
        if (fp->refcnt == 0) {
+               if (fp->parent != NULL)
+                       fp->parent->refcnt--;
                if (flags & FIRMWARE_UNLOAD)
                        fp->flags |= FW_UNLOAD;
                if (fp->file)
_______________________________________________
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