In message <[EMAIL PROTECTED]>, John Baldwin writes: >On Saturday 10 June 2006 13:04, Ian Dowse wrote: >> Keep firmware images on the list until they have been unregistered >> with firmware_unregister(). Previously when the last driver reference >> had been dropped we would clear the list entry under the assumption >> that the firmware module was about to be unloaded, but this was not >> true if the firmware image had been loaded manually with kldload. > >I think you still need to clear the entire entry in unloadentry() and not just >clear fp->file. Otherwise, another thread could gain a reference on this >entry in the table after you drop the firmware mutex and before >firmware_unregister() is ran by the kernel linker.
That would bring back the original issue where a manually kldloaded firmware image would be removed from the list when a driver calls firmware_put(), even though the kld will remain loaded; there is nothing that a driver can do to get the entry back on the list since calling linker_reference_module() will not result in a call to firmware_register() because the module is already (manually) loaded. Shouldn't this race be fixed by your other suggested change of having a firmware_unregister() failure preventing the image module from unloading? (I didn't realise it wasn't already checking) The firmware_unregister() function atomically checks for references and clears the full entry, so with your change there is no way for the module to be unloaded while a reference exists. Ian _______________________________________________ [email protected] mailing list http://lists.freebsd.org/mailman/listinfo/cvs-all To unsubscribe, send any mail to "[EMAIL PROTECTED]"
