bostic@OKEEFFE.BERKELEY.EDU (Keith Bostic) (03/23/87)
4.3BSD network bug (#3, MCLGET/mbuf.h) Index: sys/h/mbuf.h 4.3BSD FIX 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. Although rare, the bug described in this report may cause unexplained crashes or random failures. 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 ----