summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/uipc_mbuf.c97
-rw-r--r--sys/net/if.c100
-rw-r--r--sys/net/if.h27
-rw-r--r--sys/sys/mbuf.h3
4 files changed, 114 insertions, 113 deletions
diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c
index bae66752398..7259693222c 100644
--- a/sys/kern/uipc_mbuf.c
+++ b/sys/kern/uipc_mbuf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_mbuf.c,v 1.108 2008/12/04 23:40:44 dlg Exp $ */
+/* $OpenBSD: uipc_mbuf.c,v 1.109 2008/12/11 16:45:45 deraadt Exp $ */
/* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */
/*
@@ -270,6 +270,101 @@ m_getclr(int nowait, int type)
}
void
+m_clinitifp(struct ifnet *ifp)
+{
+ struct mclpool *mclp = ifp->if_data.ifi_mclpool;
+ extern u_int mclsizes[];
+ int i;
+
+ /* Initialize high water marks for use of cluster pools */
+ for (i = 0; i < MCLPOOLS; i++) {
+ mclp[i].mcl_hwm = MAX(4, mclp[i].mcl_lwm);
+ mclp[i].mcl_size = mclsizes[i];
+ }
+}
+
+void
+m_clsetlwm(struct ifnet *ifp, u_int pktlen, u_int lwm)
+{
+ extern u_int mclsizes[];
+ int i;
+
+ for (i = 0; i < MCLPOOLS; i++) {
+ if (pktlen <= mclsizes[i])
+ break;
+ }
+ if (i >= MCLPOOLS)
+ return;
+
+ ifp->if_data.ifi_mclpool[i].mcl_lwm = lwm;
+}
+
+extern int m_clticks;
+int m_livelock;
+
+int
+m_cldrop(struct ifnet *ifp, int pi)
+{
+ static int liveticks;
+ struct mclpool *mclp;
+ extern int ticks;
+ int i;
+
+ if (m_livelock == 0 && ticks - m_clticks > 2) {
+ struct ifnet *aifp;
+
+ /*
+ * Timeout did not run, so we are in some kind of livelock.
+ * Decrease the cluster allocation high water marks on all
+ * interfaces and prevent them from growth for the very near
+ * future.
+ */
+ m_livelock = 1;
+ ifp->if_data.ifi_livelocks++;
+ liveticks = ticks;
+ TAILQ_FOREACH(aifp, &ifnet, if_list) {
+ mclp = aifp->if_data.ifi_mclpool;
+ for (i = 0; i < nitems(mclp); i++)
+ mclp[i].mcl_hwm =
+ max(mclp[i].mcl_hwm / 2,mclp[i].mcl_lwm);
+ }
+ } else if (m_livelock && ticks - liveticks > 5)
+ m_livelock = 0; /* Let the high water marks grow again */
+
+ mclp = ifp->if_data.ifi_mclpool;
+ if (mclp[pi].mcl_alive <= 2 && mclp[pi].mcl_hwm < 32768 &&
+ ISSET(ifp->if_flags, IFF_RUNNING) && m_livelock == 0) {
+ /* About to run out, so increase the watermark */
+ mclp[pi].mcl_hwm++;
+ } else if (mclp[pi].mcl_alive >= mclp[pi].mcl_hwm)
+ return (1); /* No more packets given */
+
+ return (0);
+}
+
+void
+m_clcount(struct ifnet *ifp, int pi)
+{
+ ifp->if_data.ifi_mclpool[pi].mcl_alive++;
+}
+
+void
+m_cluncount(struct mbuf *m, int all)
+{
+ struct mbuf_ext *me;
+
+ do {
+ me = &m->m_ext;
+ if (((m->m_flags & (M_EXT|M_CLUSTER)) != (M_EXT|M_CLUSTER)) ||
+ (me->ext_ifp == NULL))
+ continue;
+
+ me->ext_ifp->if_data.ifi_mclpool[me->ext_backend].mcl_alive--;
+ me->ext_ifp = NULL;
+ } while (all && (m = m->m_next));
+}
+
+void
m_clget(struct mbuf *m, int how, struct ifnet *ifp, u_int pktlen)
{
struct pool *mclp;
diff --git a/sys/net/if.c b/sys/net/if.c
index 62529c17933..ebe573a28fd 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.183 2008/11/26 19:07:33 deraadt Exp $ */
+/* $OpenBSD: if.c,v 1.184 2008/12/11 16:45:45 deraadt Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -147,14 +147,12 @@ struct if_clone *if_clone_lookup(const char *, int *);
void if_congestion_clear(void *);
int if_group_egress_build(void);
-void m_clinitifp(struct ifnet *);
-
TAILQ_HEAD(, ifg_group) ifg_head;
LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners);
int if_cloners_count;
-int m_clticks;
struct timeout m_cltick_tmo;
+int m_clticks;
/*
* Record when the last timeout has been run. If the delta is
@@ -165,6 +163,7 @@ static void
m_cltick(void *arg)
{
extern int ticks;
+ extern void m_cltick(void *);
m_clticks = ticks;
timeout_add(&m_cltick_tmo, 1);
@@ -2035,96 +2034,3 @@ sysctl_ifq(int *name, u_int namelen, void *oldp, size_t *oldlenp,
}
/* NOTREACHED */
}
-
-void
-m_clinitifp(struct ifnet *ifp)
-{
- extern u_int mclsizes[];
- int i;
-
- /* Initialize high water marks for use of cluster pools */
- for (i = 0; i < MCLPOOLS; i++) {
- ifp->if_mclstat.mclpool[i].mcl_hwm = MAX(4,
- ifp->if_mclstat.mclpool[i].mcl_lwm);
- ifp->if_mclstat.mclpool[i].mcl_size = mclsizes[i];
- }
-}
-
-void
-m_clsetlwm(struct ifnet *ifp, u_int pktlen, u_int lwm)
-{
- extern u_int mclsizes[];
- int i;
-
- for (i = 0; i < MCLPOOLS; i++) {
- if (pktlen <= mclsizes[i])
- break;
- }
- if (i >= MCLPOOLS)
- return;
-
- ifp->if_mclstat.mclpool[i].mcl_lwm = lwm;
-}
-
-int
-m_cldrop(struct ifnet *ifp, int pi)
-{
- static int livelock, liveticks;
- struct mclstat *mcls;
- extern int ticks;
- int i;
-
- if (livelock == 0 && ticks - m_clticks > 2) {
- struct ifnet *aifp;
-
- /*
- * Timeout did not run, so we are in some kind of livelock.
- * Decrease the cluster allocation high water marks on all
- * interfaces and prevent them from growth for the very near
- * future.
- */
- livelock = 1;
- liveticks = ticks;
- TAILQ_FOREACH(aifp, &ifnet, if_list) {
- mcls = &aifp->if_mclstat;
- for (i = 0; i < nitems(mcls->mclpool); i++)
- mcls->mclpool[i].mcl_hwm =
- max(mcls->mclpool[i].mcl_hwm / 2,
- mcls->mclpool[i].mcl_lwm);
- }
- } else if (livelock && ticks - liveticks > 5)
- livelock = 0; /* Let the high water marks grow again */
-
- mcls = &ifp->if_mclstat;
- if (mcls->mclpool[pi].mcl_alive <= 2 &&
- mcls->mclpool[pi].mcl_hwm < 32768 &&
- ISSET(ifp->if_flags, IFF_RUNNING) && livelock == 0) {
- /* About to run out, so increase the watermark */
- mcls->mclpool[pi].mcl_hwm++;
- } else if (mcls->mclpool[pi].mcl_alive >= mcls->mclpool[pi].mcl_hwm)
- return (1); /* No more packets given */
-
- return (0);
-}
-
-void
-m_clcount(struct ifnet *ifp, int pi)
-{
- ifp->if_mclstat.mclpool[pi].mcl_alive++;
-}
-
-void
-m_cluncount(struct mbuf *m, int all)
-{
- struct mbuf_ext *me;
-
- do {
- me = &m->m_ext;
- if (((m->m_flags & (M_EXT|M_CLUSTER)) != (M_EXT|M_CLUSTER)) ||
- (me->ext_ifp == NULL))
- continue;
-
- me->ext_ifp->if_mclstat.mclpool[me->ext_backend].mcl_alive--;
- me->ext_ifp = NULL;
- } while (all && (m = m->m_next));
-}
diff --git a/sys/net/if.h b/sys/net/if.h
index 4fe077e2458..74235314a51 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.h,v 1.100 2008/11/30 00:14:42 brad Exp $ */
+/* $OpenBSD: if.h,v 1.101 2008/12/11 16:45:45 deraadt Exp $ */
/* $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $ */
/*
@@ -104,6 +104,15 @@ struct if_clonereq {
char *ifcr_buffer; /* buffer for cloner names */
};
+#define MCLPOOLS 7 /* number of cluster pools */
+
+struct mclpool {
+ u_short mcl_alive;
+ u_short mcl_hwm;
+ u_short mcl_size;
+ u_short mcl_lwm;
+};
+
/*
* Structure defining statistics and other data kept regarding a network
* interface.
@@ -131,6 +140,9 @@ struct if_data {
u_int64_t ifi_iqdrops; /* dropped on input, this interface */
u_int64_t ifi_noproto; /* destined for unsupported protocol */
struct timeval ifi_lastchange; /* last operational state change */
+
+ struct mclpool ifi_mclpool[MCLPOOLS];
+ u_int64_t ifi_livelocks; /* livelocks migitaged */
};
/*
@@ -146,17 +158,6 @@ struct ifqueue {
struct timeout *ifq_congestion;
};
-#define MCLPOOLS 7 /* number of cluster pools */
-
-struct mclstat {
- struct {
- u_short mcl_alive;
- u_short mcl_hwm;
- u_short mcl_size;
- u_short mcl_lwm;
- } mclpool[MCLPOOLS];
-};
-
/*
* Values for if_link_state.
*/
@@ -235,8 +236,6 @@ struct ifnet { /* and the entries */
struct sockaddr_dl *if_sadl; /* pointer to our sockaddr_dl */
void *if_afdata[AF_MAX];
-
- struct mclstat if_mclstat; /* mbuf cluster pool stats */
};
#define if_mtu if_data.ifi_mtu
#define if_type if_data.ifi_type
diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h
index 315ccd85c9a..fc15c7d0813 100644
--- a/sys/sys/mbuf.h
+++ b/sys/sys/mbuf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mbuf.h,v 1.118 2008/11/26 17:36:23 dlg Exp $ */
+/* $OpenBSD: mbuf.h,v 1.119 2008/12/11 16:45:44 deraadt Exp $ */
/* $NetBSD: mbuf.h,v 1.19 1996/02/09 18:25:14 christos Exp $ */
/*
@@ -432,6 +432,7 @@ void m_clsetlwm(struct ifnet *, u_int, u_int);
int m_cldrop(struct ifnet *, int);
void m_clcount(struct ifnet *, int);
void m_cluncount(struct mbuf *, int);
+void m_clinitifp(struct ifnet *);
void m_adj(struct mbuf *, int);
void m_copyback(struct mbuf *, int, int, const void *);
void m_freem(struct mbuf *);