NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/42455: tstile hang with nfs



The following reply was made to PR kern/42455; it has been noted by GNATS.

From: "Christoph Egger" <Christoph_Egger%gmx.de@localhost>
To: gnats-bugs%NetBSD.org@localhost, gnats-admin%netbsd.org@localhost, 
netbsd-bugs%netbsd.org@localhost
Cc: 
Subject: Re: kern/42455: tstile hang with nfs
Date: Tue, 03 Aug 2010 11:18:55 +0200

 I tried this patch:
 
 Index: nfs_vnops.c
 ===================================================================
 RCS file: /cvsroot/src/sys/nfs/nfs_vnops.c,v
 retrieving revision 1.284
 diff -u -p -r1.284 nfs_vnops.c
 --- nfs_vnops.c 24 Jun 2010 13:03:17 -0000      1.284
 +++ nfs_vnops.c 3 Aug 2010 09:13:57 -0000
 @@ -1468,7 +1468,12 @@ nfsmout:
                 mutex_enter(&ctx.nwc_lock);
                 ctx.nwc_mbufcount--;
                 while (ctx.nwc_mbufcount > 0) {
 -                       cv_wait(&ctx.nwc_cv, &ctx.nwc_lock);
 +                       error = cv_timedwait(&ctx.nwc_cv, &ctx.nwc_lock,
 +                           mstohz(1000));
 +                       if (error) {
 +                               printf("nfsmblk timeout\n");
 +                               break;
 +                       }
                 }
                 mutex_exit(&ctx.nwc_lock);
         }
 
 The result is this:
 
 nfsmblk timeout
 panic: lockdebug_lookup: uninitialized lock (lock=0xffffa00026111a70, 
from=ffffffff804dd6ad)
 fatal breakpoint trap in supervisor mode
 trap type 1 code 0 rip ffffffff80201d65 cs e030 rflags 246 cr2  
ffffa000221e7064 cpl 8 rsp ffffa00026b93980
 Stopped in pid 750.1 (qemu-dm) at       netbsd:breakpoint+0x5:  leave
 breakpoint() at netbsd:breakpoint+0x5
 panic() at netbsd:panic+0x28f
 lockdebug_abort() at netbsd:lockdebug_abort
 mutex_enter() at netbsd:mutex_enter+0x263
 nfs_writerpc_extfree() at netbsd:nfs_writerpc_extfree+0x35
 m_ext_free() at netbsd:m_ext_free+0xcf
 tap_dev_read() at netbsd:tap_dev_read+0x100
 dofileread() at netbsd:dofileread+0x6f
 sys_read() at netbsd:sys_read+0x73
 syscall() at netbsd:syscall+0xa8
 ds          0x3960
 es          0
 fs          0x7b40
 gs          0x51f8
 rdi         0
 rsi         0xffffffff805c0119  printf+0xbc
 rbp         0xffffa00026b93980
 rbx         0xffffa00026b93990
 rdx         0
 rcx         0
 rax         0x1
 r8          0xffffa00026b938a0
 r9          0x400
 r10         0xffffa00026b938a0
 r11         0x1
 r12         0x104
 r13         0xffffffff80a351f8
 r14         0xffffa00026b67b40
 r15         0
 rip         0xffffffff80201d65  breakpoint+0x5
 cs          0xe030
 rflags      0x246
 rsp         0xffffa00026b93980
 ss          0xe02b
 netbsd:breakpoint+0x5:  leave
 db>
 
 The lockdebug address 0xffffffff804dd6ad is at
 sys/dev/nfs/nfs_vnops.c:1259
 
 /*
  * free mbuf used to refer protected pages while write rpc call.
  * called at splvm.
  */
 static void
 nfs_writerpc_extfree(struct mbuf *m, void *tbuf, size_t size, void *arg)
 {
         struct nfs_writerpc_context *ctx = arg;
 
         KASSERT(m != NULL);
         KASSERT(ctx != NULL);
         pool_cache_put(mb_cache, m);
         mutex_enter(&ctx->nwc_lock);      <-- line 1259
         if (--ctx->nwc_mbufcount == 0) {
                 cv_signal(&ctx->nwc_cv);
         }
         mutex_exit(&ctx->nwc_lock);
 }
 


Home | Main Index | Thread Index | Old Index