Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Jun 2006 01:50:43 +0100
From:      Ian Dowse <iedowse@iedowse.com>
To:        John Baldwin <john@baldwin.cx>
Cc:        cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org, Ian Dowse <iedowse@freebsd.org>
Subject:   Re: cvs commit: src/sys/sys firmware.h src/sys/kern subr_firmware.c
Message-ID:  <200606130150.aa12882@nowhere.iedowse.com>
In-Reply-To: Your message of "Mon, 12 Jun 2006 16:31:06 EDT." <200606121631.07177.john@baldwin.cx> 

next in thread | previous in thread | raw e-mail | index | archive | help
In message <200606121631.07177.john@baldwin.cx>, 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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606130150.aa12882>