tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: rfc: fix double locking in the pool cache subroutines
On Fri, Jul 11, 2008 at 11:13:04AM +0300, Andy Shevchenko wrote:
> Hello.
>
> I'm using the NetBSD-current (yesterday snapshot) on OMAP/H4.
> When I try to start one of the libMicro (0.4.0) test called close_tcp
> I've got the locking panic (I've switched on the LOCKDEBUG option).
>
> # tcc -p -e $PWD close_tcp
> tcc: journal file is /root/micro/results/0010e/journal
> 07:50:48 Execute /ts/close_tcp/close_tcp-tc
> Mutex error: lockdebug_wantlock: locking against myself
>
> lock address : 0x0000000081ca9a00 type : sleep/adaptive
> initialized : 0x0000000080410264
> shared holds : 0 exclusive: 1
> shares wanted: 0 exclusive: 1
> current cpu : 0 last held: 0
> current lwp : 0x0000000081cad4c0 last held: 0x0000000081cad4c0
> last locked : 0x000000008040f660 unlocked : 0x000000008040f704
> owner field : 0x0000000081cad4c0 wait/spin: 0/0
That does not make sense. What do the 'last locked', 'last unlocked'
and 'initialized' addresses resolve to? Can you post the backtrace
from the panic?
Andrew
> Turnstile chain at 0x80550f20.
> => No active turnstile for this lock.
>
> panic: LOCKDEBUG
> Stopped in pid 0.5 (system) at netbsd:cpu_Debugger+0x4: bx r14
>
>
> Some investigations lead to following quick fix:
>
> diff --git a/sys/kern/subr_pool.c b/sys/kern/subr_pool.c
> index 32547e7..6ad1a09 100644
> --- a/sys/kern/subr_pool.c
> +++ b/sys/kern/subr_pool.c
> @@ -2541,7 +2541,9 @@ pool_cache_put_slow(pool_cache_cpu_t *cc, int s,
> void *object)
> /* If there are no empty groups in the cache then allocate one. */
> if (__predict_false((pcg = pc->pc_emptygroups) == NULL)) {
> if (__predict_true(!pool_cache_disable)) {
> + mutex_exit(&pc->pc_lock);
> pcg = pool_get(pc->pc_pcgpool, PR_NOWAIT);
> + mutex_enter(&pc->pc_lock);
> }
> if (__predict_true(pcg != NULL)) {
> pcg->pcg_avail = 0;
>
>
>
> --
> With Best Regards,
> Andy Shevchenko
Home |
Main Index |
Thread Index |
Old Index