2011/4/11 Mike Tancsa <m...@sentex.net>: > On 4/11/2011 1:49 AM, Gleb Smirnoff wrote: >> On Mon, Apr 11, 2011 at 12:34:56AM +0200, Przemyslaw Frasunek wrote: >> P> > Use command "vmstat -z|egrep 'ITEM|NetGraph'" and check FAILURES column. >> P> > If you see non-zero values there, you need to increase netgraph memory >> limits >> P> > net.graph.maxdata and net.graph.maxalloc using /boot/loader.conf. >> P> >> P> Unfortunately, increasing net.graph.maxdata & net.graph.maxalloc didn't >> P> solved EPERM problems on netgraph control sockets. It is still appearing >> P> every few hours, but failure counters are zero: >> >> IMO, any kind of memory allocation code (malloc, uma, netgraph item >> allocator) never return EPERM, they return ENOMEM or ENOBUFS. >> >> So, there is a bug somewhere else. > > > I am also running with the following patch from mlaier that is not in > RELENG_8. > > > --- rtsock.c 2010-10-30 07:54:55.000000000 -0400 > +++ /tmp/rtsock.c 2011-04-11 09:44:52.000000000 -0400 > @@ -27,7 +27,7 @@ > * SUCH DAMAGE. > * > * @(#)rtsock.c 8.7 (Berkeley) 10/12/95 > - * $FreeBSD: src/sys/net/rtsock.c,v 1.181.2.10 2010/10/30 11:54:55 bz Exp $ > + * $FreeBSD: src/sys/net/rtsock.c,v 1.191 2011/02/10 01:24:09 mlaier Exp $ > */ > #include "opt_compat.h" > #include "opt_sctp.h" > @@ -159,7 +159,7 @@ > struct rt_metrics_lite *out); > static void rt_getmetrics(const struct rt_metrics_lite *in, > struct rt_metrics *out); > -static void rt_dispatch(struct mbuf *, const struct sockaddr *); > +static void rt_dispatch(struct mbuf *, sa_family_t); > > static struct netisr_handler rtsock_nh = { > .nh_name = "rtsock", > @@ -513,6 +513,7 @@ > int len, error = 0; > struct ifnet *ifp = NULL; > union sockaddr_union saun; > + sa_family_t saf = AF_MAX; > > #define senderr(e) { error = e; goto flush;} > if (m == NULL || ((m->m_len < sizeof(long)) && > @@ -549,6 +550,7 @@ > (info.rti_info[RTAX_GATEWAY] != NULL && > info.rti_info[RTAX_GATEWAY]->sa_family >= AF_MAX)) > senderr(EINVAL); > + saf = info.rti_info[RTAX_DST]->sa_family; > /* > * Verify that the caller has the appropriate privilege; RTM_GET > * is the only operation the non-superuser is allowed. > @@ -883,7 +885,6 @@ > m = NULL; > } else if (m->m_pkthdr.len > rtm->rtm_msglen) > m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len); > - Free(rtm); > } > if (m) { > if (rp) { > @@ -893,11 +894,14 @@ > */ > unsigned short family = rp->rcb_proto.sp_family; > rp->rcb_proto.sp_family = 0; > - rt_dispatch(m, info.rti_info[RTAX_DST]); > + rt_dispatch(m, saf); > rp->rcb_proto.sp_family = family; > } else > - rt_dispatch(m, info.rti_info[RTAX_DST]); > + rt_dispatch(m, saf); > } > + /* info.rti_info[RTAX_DST] (used above) can point inside of rtm */ > + if (rtm) > + Free(rtm); > } > return (error); > #undef sa_equal > @@ -1140,7 +1144,7 @@ > rtm->rtm_flags = RTF_DONE | flags; > rtm->rtm_errno = error; > rtm->rtm_addrs = rtinfo->rti_addrs; > - rt_dispatch(m, sa); > + rt_dispatch(m, sa ? sa->sa_family : AF_MAX); > } > > /* > @@ -1165,7 +1169,7 @@ > ifm->ifm_flags = ifp->if_flags | ifp->if_drv_flags; > ifm->ifm_data = ifp->if_data; > ifm->ifm_addrs = 0; > - rt_dispatch(m, NULL); > + rt_dispatch(m, AF_MAX); > } > > /* > @@ -1235,7 +1239,7 @@ > rtm->rtm_errno = error; > rtm->rtm_addrs = info.rti_addrs; > } > - rt_dispatch(m, sa); > + rt_dispatch(m, sa ? sa->sa_family : AF_MAX); > } > } > > @@ -1271,7 +1275,7 @@ > __func__)); > ifmam->ifmam_index = ifp->if_index; > ifmam->ifmam_addrs = info.rti_addrs; > - rt_dispatch(m, ifma->ifma_addr); > + rt_dispatch(m, ifma->ifma_addr ? ifma->ifma_addr->sa_family : > AF_MAX); > } > > static struct mbuf * > @@ -1331,7 +1335,7 @@ > if (m->m_flags & M_PKTHDR) > m->m_pkthdr.len += data_len; > mtod(m, struct if_announcemsghdr *)->ifan_msglen += > data_len; > - rt_dispatch(m, NULL); > + rt_dispatch(m, AF_MAX); > } > } > > @@ -1347,11 +1351,11 @@ > > m = rt_makeifannouncemsg(ifp, RTM_IFANNOUNCE, what, &info); > if (m != NULL) > - rt_dispatch(m, NULL); > + rt_dispatch(m, AF_MAX); > } > > static void > -rt_dispatch(struct mbuf *m, const struct sockaddr *sa) > +rt_dispatch(struct mbuf *m, sa_family_t saf) > { > struct m_tag *tag; > > @@ -1360,14 +1364,14 @@ > * use when injecting the mbuf into the routing socket buffer from > * the netisr. > */ > - if (sa != NULL) { > + if (saf != AF_MAX) { > tag = m_tag_get(PACKET_TAG_RTSOCKFAM, sizeof(unsigned > short), > M_NOWAIT); > if (tag == NULL) { > m_freem(m); > return; > } > - *(unsigned short *)(tag + 1) = sa->sa_family; > + *(unsigned short *)(tag + 1) = saf; > m_tag_prepend(m, tag); > } > #ifdef VIMAGE > > > ---Mike > > > -- > ------------------- > Mike Tancsa, tel +1 519 651 3400 > Sentex Communications, m...@sentex.net > Providing Internet services since 1994 www.sentex.net > Cambridge, Ontario Canada http://www.tancsa.com/
So it's in HEAD? If so, any ideas about a possible MFC? -Brandon _______________________________________________ freebsd-net@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"