Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!columbia!rutgers!ll-xn!mit-eddie!genrad!decvax!ucbvax!MONET!karels From: karels@MONET (Mike Karels) Newsgroups: net.bugs.4bsd Subject: 4.3BSD network bug (#3, MCLGET/mbuf.h) Message-ID: <8610230017.AA04477@monet.Berkeley.EDU> Date: Wed, 22-Oct-86 20:17:48 EDT Article-I.D.: monet.8610230017.AA04477 Posted: Wed Oct 22 20:17:48 1986 Date-Received: Thu, 23-Oct-86 07:19:06 EDT Sender: daemon@ucbvax.BERKELEY.EDU Organization: University of California at Berkeley Lines: 47 Index: sys/h/mbuf.h 4.3BSD FIX This is the last of a set of 3 bug reports with fixes for the network in 4.3BSD. All 4.3 sites should install the modifications described in these reports. Although rare, the bug described in this report may cause unexplained crashes or random failures. Description: The macros for addition of page clusters to mbufs were revised in 4.3BSD. A new macro, MCLGET, is called to add a single page cluster to an mbuf. If there are no free clusters, the macro calls m_clalloc to attempt to create a new cluster. Unfortunately, the MCLGET macro does not run at high priority, but m_clalloc may only be called from splimp to block reentrance of the memory allocation routines. The call to m_clalloc should be made from MCLALLOC, which does run at high priority. Fix: In the file /sys/h/mbuf.h, move the test of mclfree and call to m_clalloc from the MCLGET macro to the MCLALLOC macro, as shown by the following diffs: *** mbuf.h.old Thu Sep 11 06:07:29 1986 --- mbuf.h Thu Sep 11 06:20:07 1986 *************** *** 5,7 **** * ! * @(#)mbuf.h 7.1 (Berkeley) 6/4/86 */ --- 5,7 ---- * ! * @(#)mbuf.h 7.3 (Berkeley) 9/11/86 */ *************** *** 97,98 **** --- 97,100 ---- { int ms = splimp(); \ + if (mclfree == 0) \ + (void)m_clalloc((i), MPG_CLUSTERS, M_DONTWAIT); \ if ((m)=mclfree) \ *************** *** 105,108 **** { struct mbuf *p; \ - if (mclfree == 0) \ - (void)m_clalloc(1, MPG_CLUSTERS, M_DONTWAIT); \ MCLALLOC(p, 1); \ --- 107,108 ----