kldstat / kernel linker deadlock
Bryan Drewery
bryan-lists at shatow.net
Thu Jul 10 19:31:10 UTC 2014
On 1/11/2013 3:13 PM, John Baldwin wrote:
> On Thursday, November 22, 2012 08:26:17 PM Bryan Drewery wrote:
>> On 8.3-RELEASE I've hit a deadlock with kldstat.
>>
>> I can't provide much information as procstat(1) locks up and I have
>> already rebooted the servers due to it breaking quite a bit in my setup.
>>
>>> # kldstat
>>> Id Refs Address Size Name
>>> load: 0.91 cmd: kldstat 9936 [kernel linker] 51.21r 0.00u 0.00s 0% 768k
>>> ^C
>>> load: 0.72 cmd: kldstat 9936 [kernel linker] 225.23r 0.00u 0.00s 0% 704k
>>> load: 0.72 cmd: kldstat 9936 [kernel linker] 225.39r 0.00u 0.00s 0% 704k
>>> load: 0.42 cmd: kldstat 9936 [kernel linker] 1837.24r 0.00u 0.00s 0%
>>> 692k
>>
>> Short list of affected processes (74 in all):
>>> root 3685 0.0 0.0 3264 700 ?? D 7:27PM 0:00.00
>>> kldstat root 67061 0.0 0.0 3380 892 ?? D 7:27PM
>>> 0:00.00 /usr/bin/netstat -nrf inet root 5579 0.0 0.0 3380
>>> 892 ?? D 7:37PM 0:00.00 /usr/bin/netstat -nrf inet root
>>> 6393 0.0 0.0 3264 704 ?? D 7:32PM 0:00.00 /sbin/kldstat -v
>>> root 99635 0.0 0.1 3324 1244 13 D+ 7:52PM 0:00.01
>>> procstat -ka
>>
>> [... 69 more removed ...]
>>
>> I had 2 minutely cron entries that were running kldstat(1)/netstat(1).
>>
>> Guessing the kldstat(1) and netstat(1) deadlocked initially.
>
> Next time get a dump if at all possible.
>
Pretty sure this was fixed in r224546 which did not get MFC'd to
releng/8.3 before release.
> r224546 | glebius | 2011-07-31 08:49:15 -0500 (Sun, 31 Jul 2011) | 4 lines
> Changed paths:
> M /head/sys/kern/kern_linker.c
>
> Don't leak kld_sx lock in kldunloadf().
> @@ -1108,12 +1108,13 @@ kern_kldunload(struct thread *td, int fi
> #ifdef HWPMC_HOOKS
> if (error == 0) {
> KLD_DOWNGRADE();
> PMC_CALL_HOOK(td, PMC_FN_KLD_UNLOAD, (void *) &pkm);
> KLD_UNLOCK_READ();
> } else
> + KLD_UNLOCK();
> #else
> KLD_UNLOCK();
> #endif
I reviewed my logs from the day and found that the initial command I ran
was 'kldunload linux' due to SA-12:08.linux.asc. The module was in use
due to running processes using the linuxelf brand so the module had
returned EBUSY. I also had HWPMC_HOOKS since it was in GENERIC. When
EBUSY was returned the kld lock was kept xlocked.
--
Regards,
Bryan Drewery
More information about the freebsd-hackers
mailing list