> --- On Fri, 2/18/11, Kirill Yelizarov > > > On Fri, Feb 18, 2011 at 05:27:00AM > > > -0800, Kirill Yelizarov wrote: > > > > I have a reproducible memory leak when using nfs > > > client with an old > > > > nfs server > > and mbufs used > 8193/1722/9915 mbufs in use (current/cache/total) > 8192/1264/9456/25600 mbuf clusters in use (current/cache/total/max) > 8192/605 mbuf+clusters out of packet secondary zone in use > (current/cache) > 0/768/768/12800 4k (page size) jumbo clusters in use > (current/cache/total/max) > 0/0/0/6400 9k jumbo clusters in use (current/cache/total/max) > 0/0/0/3200 16k jumbo clusters in use (current/cache/total/max) > 18432K/6030K/24462K bytes allocated to network (current/cache/total) > 0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters) > 0/0/0 requests for jumbo clusters denied (4k/9k/16k) > 0/0/0 sfbufs in use (current/peak/max) > 0 requests for sfbufs denied > 0 requests for sfbufs delayed > 0 requests for I/O initiated by sendfile > 0 calls to protocol drain routines > > Kirill > You could try the attached patch. It fixes the only places in the client side krpc over udp that seems mights cause a leak. I have no idea if it will help, since these cases should rarely, if ever, happen in practice.
Please let us know if you have the chance to try the patch and whether or not it helped. rick
--- rpc/clnt_dg.c.sav 2011-02-19 19:52:41.000000000 -0500 +++ rpc/clnt_dg.c 2011-02-20 10:43:11.000000000 -0500 @@ -704,9 +704,9 @@ got_reply: (reply_msg.acpted_rply.ar_stat == SUCCESS)) errp->re_status = stat = RPC_SUCCESS; else - stat = _seterr_reply(&reply_msg, &(cu->cu_error)); + stat = _seterr_reply(&reply_msg, errp); - if (errp->re_status == RPC_SUCCESS) { + if (stat == RPC_SUCCESS) { results = xdrmbuf_getall(&xdrs); if (! AUTH_VALIDATE(auth, xid, &reply_msg.acpted_rply.ar_verf, @@ -1089,11 +1089,14 @@ clnt_dg_soupcall(struct socket *so, void /* * The XID is in the first uint32_t of the reply. */ - if (m->m_len < sizeof(xid) && m_length(m, NULL) < sizeof(xid)) + if (m->m_len < sizeof(xid) && m_length(m, NULL) < sizeof(xid)) { /* * Should never happen. */ + printf("clnt_dg_soupcall: received garbage\n"); + m_freem(m); continue; + } m_copydata(m, 0, sizeof(xid), (char *)&xid); xid = ntohl(xid);
_______________________________________________ freebsd-stable@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-stable To unsubscribe, send any mail to "freebsd-stable-unsubscr...@freebsd.org"