FROM: Sergey Smitienko DATE: 03/06/2001 02:01:57 SUBJECT: http://cvs.openbsd.org/cgi-bin/wwwgnats.pl/full/1656 >From that bug report: >Description: > Under heavy load, e. g. "make build" while apache is serving (10 >Gigs/day), machine simetimes stop working. It is pingable, kernel seems to >work, userland is gone. I had same troube on one of my heavy loaded OpenBSD boxes to. As far as I see this may be caused by bug in networking code. udp_usrreq.c: ( I removed all IPv6 code for more clearense) /* $OpenBSD: udp_usrreq.c,v 1.51 2000/10/13 17:58:37 itojun Exp $ */ /* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */ int #if __STDC__ udp_output(struct mbuf *m, ...) #else udp_output(m, va_alist) struct mbuf *m; va_dcl #endif { register struct inpcb *inp; struct mbuf *addr, *control; register struct udpiphdr *ui; register int len = m->m_pkthdr.len; struct in_addr laddr; int s = 0, error = 0; va_list ap; int pcbflags = 0; va_start(ap, m); inp = va_arg(ap, struct inpcb *); addr = va_arg(ap, struct mbuf *); control = va_arg(ap, struct mbuf *); va_end(ap); if (addr) { /* * Save current PCB flags because they may change during * temporary connection. */ pcbflags = inp->inp_flags; laddr = inp->inp_laddr; if (inp->inp_faddr.s_addr != INADDR_ANY) { error = EISCONN; goto release; } /* * Must block input while temporarily connected. */ s = splsoftnet(); //Here - lock networking code. error = in_pcbconnect(inp, addr); if (error) { splx(s); goto release; } } else { if (inp->inp_faddr.s_addr == INADDR_ANY) { error = ENOTCONN; goto release; } } //At this point code my be locked, may be not. M_PREPEND(m, sizeof(struct udpiphdr), M_DONTWAIT); if (m == 0) { error = ENOBUFS; goto bail; //Goto bail, it will splx(s) under same conditions - if (addr) { blah blah blah splx(s)} } if ((len + sizeof(struct udpiphdr)) > IP_MAXPACKET) { error = EMSGSIZE; //Goto release, release does not call splx(s), but at this point code my be locked, may be not ??? goto release; } ... blah blah blah... bail: if (addr) { in_pcbdisconnect(inp); inp->inp_flags = pcbflags; inp->inp_laddr = laddr; splx(s); } if (control) { m_freem(control); } return (error); release: m_freem(m); if (control) { m_freem(control); } return (error); } Here is my patch. It is very ugly, but my box stoped freezing. Uptime is about a week. udp_usrreq.c: 755c755 < int s = 0, error = 0, is_locked = 0; --- > int s = 0, error = 0; 818d817 < is_locked = 1; 822d820 < is_locked = 0; 993d990 < is_locked = 0; 1002,1004d998 < < if ( is_locked ) splx(s); < 1016,1018d1009 < < if ( is_locked ) splx(s); < Hope this will help. PS. Does some one works on locale support/localisation ? PSS. How can I became OpenBSD kernel developer, because i have some time and I'm interested in unix system programming. PSSS. Sorry for my bad english.