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, netbsd-bugs%netbsd.org@localhost, 
gnats-admin%netbsd.org@localhost,
 kern-bug-people%netbsd.org@localhost, rmind%netbsd.org@localhost, 
ad%netbsd.org@localhost, yamt%netbsd.org@localhost,
 enami%netbsd.org@localhost
Cc: 
Subject: Re: kern/42455: tstile hang with nfs
Date: Tue, 26 Oct 2010 11:01:58 +0200

 >  >  
 >  >  I added some more debug lines and figured out that the macro
 >  >  nfsm_wcc_data() drops the mbuf chain w/o decreasing
 >  >  ctxt.nwc_mbufcount.
 >  
 >  The nfsm_wcc_data() macro calls the nfsm_postop_attr() macro.
 >  The nfsm_postop_attr() macro calls nfsm_loadattrcache() function.
 >  The nfsm_loadattrcache() function calls nfsm_disct() function.
 >  
 >  nfsm_disct() is the function in error which drops the mbuf chain.
 >  
 >  nfs_subs.c:968 is the line in error:
 >  
 >             do {
 >                      m2 = m_get(M_WAIT, MT_DATA);
 >                      MCLAIM(m2, m1->m_owner);
 >                      if (left >= MINCLSIZE) {
 >                              MCLGET(m2, M_WAIT);
 >                      }
 >                      m2->m_next = *nextp; <-- BUG happens here!!
 >                      *nextp = m2;
 >                      nextp = &m2->m_next;
 >  
 
 This is the code path from entering nfsm_disct() till when
 the bug happens:
 
 897:    m1 = *mdp;
 903:    while (left == 0) {
 921:    if ((m1->m_flags & M_EXT) != 0) {
 922:            if (havebuf && M_TRAILINGSPACE(havebuf) >= siz &&
 923:                nfsm_aligned(mtod(havebuf, char *) + havebuf->m_len)) {
 959:                    struct mbuf **nextp = &m1->m_next;
 961:                    m1->m_len -= left;
 962:                    do {
 963:                            m2 = m_get(M_WAIT, MT_DATA);
 964:                            MCLAIM(m2, m1->m_owner);
 965:                            if (left >= MINCLSIZE) {
 968:                            m2->m_next = *nextp;
 
 
 Christoph
 


Home | Main Index | Thread Index | Old Index