Module Name: src
Committed By: dyoung
Date: Wed Nov 2 01:17:59 UTC 2011
Modified Files:
src/sys/net: if_gre.c if_gre.h
Log Message:
For simplicity's sake, use pcq(9) instead of my own circular-queue
implementation. Saves 45 lines of code.
To generate a diff of this commit:
cvs rdiff -u -r1.148 -r1.149 src/sys/net/if_gre.c
cvs rdiff -u -r1.40 -r1.41 src/sys/net/if_gre.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.148 src/sys/net/if_gre.c:1.149
--- src/sys/net/if_gre.c:1.148 Fri Oct 28 16:42:52 2011
+++ src/sys/net/if_gre.c Wed Nov 2 01:17:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: if_gre.c,v 1.148 2011/10/28 16:42:52 dyoung Exp $ */
+/* $NetBSD: if_gre.c,v 1.149 2011/11/02 01:17:59 dyoung Exp $ */
/*
* Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.148 2011/10/28 16:42:52 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.149 2011/11/02 01:17:59 dyoung Exp $");
#include "opt_atalk.h"
#include "opt_gre.h"
@@ -136,7 +136,6 @@ int gre_debug = 0;
#endif /* GRE_DEBUG */
int ip_gre_ttl = GRE_TTL;
-MALLOC_DEFINE(M_GRE_BUFQ, "gre_bufq", "gre mbuf queue");
static int gre_clone_create(struct if_clone *, int);
static int gre_clone_destroy(struct ifnet *);
@@ -163,60 +162,18 @@ static bool gre_fp_send(struct gre_softc
static bool gre_fp_recv(struct gre_softc *);
static void gre_fp_recvloop(void *);
-static int
-nearest_pow2(size_t len0)
-{
- size_t len, mid;
-
- if (len0 == 0)
- return 1;
-
- for (len = len0; (len & (len - 1)) != 0; len &= len - 1)
- ;
-
- mid = len | (len >> 1);
-
- /* avoid overflow */
- if ((len << 1) < len)
- return len;
- if (len0 >= mid)
- return len << 1;
- return len;
-}
-
-static struct gre_bufq *
+static void
gre_bufq_init(struct gre_bufq *bq, size_t len0)
{
- size_t len;
-
- len = nearest_pow2(len0);
-
memset(bq, 0, sizeof(*bq));
- bq->bq_buf = malloc(len * sizeof(struct mbuf *), M_GRE_BUFQ, M_WAITOK);
- bq->bq_len = len;
- bq->bq_lenmask = len - 1;
-
- return bq;
-}
-
-static bool
-gre_bufq_empty(struct gre_bufq *bq)
-{
- return bq->bq_prodidx == bq->bq_considx;
+ bq->bq_q = pcq_create(len0, KM_SLEEP);
+ KASSERT(bq->bq_q != NULL);
}
static struct mbuf *
gre_bufq_dequeue(struct gre_bufq *bq)
{
- struct mbuf *m;
-
- if (gre_bufq_empty(bq))
- return NULL;
-
- m = bq->bq_buf[bq->bq_considx];
- bq->bq_considx = (bq->bq_considx + 1) & bq->bq_lenmask;
-
- return m;
+ return pcq_get(bq->bq_q);
}
static void
@@ -228,20 +185,22 @@ gre_bufq_purge(struct gre_bufq *bq)
m_freem(m);
}
+static void
+gre_bufq_destroy(struct gre_bufq *bq)
+{
+ gre_bufq_purge(bq);
+ pcq_destroy(bq->bq_q);
+}
+
static int
gre_bufq_enqueue(struct gre_bufq *bq, struct mbuf *m)
{
- int next;
-
- next = (bq->bq_prodidx + 1) & bq->bq_lenmask;
+ KASSERT(bq->bq_q != NULL);
- if (next == bq->bq_considx) {
+ if (!pcq_put(bq->bq_q, m)) {
bq->bq_drops++;
return ENOBUFS;
}
-
- bq->bq_buf[bq->bq_prodidx] = m;
- bq->bq_prodidx = next;
return 0;
}
@@ -385,6 +344,7 @@ gre_clone_destroy(struct ifnet *ifp)
cv_destroy(&sc->sc_condvar);
cv_destroy(&sc->sc_fp_condvar);
mutex_destroy(&sc->sc_mtx);
+ gre_bufq_destroy(&sc->sc_snd);
gre_evcnt_detach(sc);
free(sc, M_DEVBUF);
Index: src/sys/net/if_gre.h
diff -u src/sys/net/if_gre.h:1.40 src/sys/net/if_gre.h:1.41
--- src/sys/net/if_gre.h:1.40 Tue Jun 1 22:13:30 2010
+++ src/sys/net/if_gre.h Wed Nov 2 01:17:59 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: if_gre.h,v 1.40 2010/06/01 22:13:30 mjf Exp $ */
+/* $NetBSD: if_gre.h,v 1.41 2011/11/02 01:17:59 dyoung Exp $ */
/*
* Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -44,6 +44,7 @@
#include <sys/condvar.h>
#include <sys/malloc.h>
#include <sys/mallocvar.h>
+#include <sys/pcq.h>
#ifdef _KERNEL
struct gre_soparm {
@@ -64,16 +65,10 @@ enum gre_state {
};
struct gre_bufq {
- volatile int bq_prodidx;
- volatile int bq_considx;
- size_t bq_len __aligned(CACHE_LINE_SIZE);
- size_t bq_lenmask;
+ pcq_t *bq_q;
volatile int bq_drops;
- struct mbuf **bq_buf;
};
-MALLOC_DECLARE(M_GRE_BUFQ);
-
enum gre_msg {
GRE_M_NONE = 0
, GRE_M_SETFP