From 93ade8aed9969333ee2cde67c1c9122ca1839f55 Mon Sep 17 00:00:00 2001 From: Max Khon Date: Mon, 7 Nov 2011 19:36:01 +0000 Subject: [PATCH] - increase the number of buffers for nethdlc because receiver is now run in a taskqueue - return ENOBUFS when there are not enough output buffers on nethdlc send --- misc/dahdi-kmod/Makefile | 2 +- misc/dahdi-kmod/files/patch-dahdi-iface | 115 ++++++++++++++---------- 2 files changed, 69 insertions(+), 48 deletions(-) diff --git a/misc/dahdi-kmod/Makefile b/misc/dahdi-kmod/Makefile index 9d583cdc642d..f339d6836b18 100644 --- a/misc/dahdi-kmod/Makefile +++ b/misc/dahdi-kmod/Makefile @@ -7,7 +7,7 @@ PORTNAME= dahdi-kmod PORTVERSION= ${DAHDI_VERSION:S/-//g} -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= misc kld MASTER_SITES= ${MASTER_SITE_LOCAL}\ http://downloads.digium.com/pub/telephony/firmware/releases/:firmware diff --git a/misc/dahdi-kmod/files/patch-dahdi-iface b/misc/dahdi-kmod/files/patch-dahdi-iface index 66ed552ebf6f..18fc559d026f 100644 --- a/misc/dahdi-kmod/files/patch-dahdi-iface +++ b/misc/dahdi-kmod/files/patch-dahdi-iface @@ -1,8 +1,29 @@ +Index: freebsd/include/dahdi/kernel.h +=================================================================== +--- freebsd/include/dahdi/kernel.h (revision 10321) ++++ freebsd/include/dahdi/kernel.h (working copy) +@@ -468,6 +468,7 @@ + struct cdev *dev; /*!< Device structure */ + struct cdev *file; /*!< File structure */ + int file_flags; ++ struct dahdi_iface *iface; + #else + struct file *file; /*!< File structure */ + #endif +@@ -1361,4 +1362,8 @@ + + void dahdi_poll_wait(struct file *file, struct pollinfo *sel, struct poll_table_struct *wait_table); + ++int dahdi_net_chan_init(struct dahdi_chan *chan, int numbufs); ++void dahdi_net_chan_destroy(struct dahdi_chan *chan); ++void dahdi_net_chan_xmit(struct dahdi_chan *chan); ++ + #endif /* _DAHDI_KERNEL_H */ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c =================================================================== --- freebsd/freebsd/dahdi/ng_dahdi_iface.c (revision 0) -+++ freebsd/freebsd/dahdi/ng_dahdi_iface.c (revision 10326) -@@ -0,0 +1,584 @@ ++++ freebsd/freebsd/dahdi/ng_dahdi_iface.c (revision 10329) +@@ -0,0 +1,605 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. @@ -302,7 +323,7 @@ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c + NG_NODE_NAME(node)); + + /* setup channel */ -+ if (dahdi_net_chan_init(chan)) { ++ if (dahdi_net_chan_init(chan, DAHDI_DEFAULT_NUM_BUFS * 8)) { + printf("dahdi_iface(%s): Error: Failed to initialize channel\n", + NG_NODE_NAME(node)); + goto error; @@ -360,10 +381,20 @@ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c +dahdi_iface_rx(struct dahdi_chan *chan) +{ + struct dahdi_iface *iface; ++ int oldreadbuf; + + if ((iface = chan->iface) == NULL) + return; + ++ /* switch buffers */ ++ if ((oldreadbuf = chan->inreadbuf) >= 0) { ++ chan->inreadbuf = (chan->inreadbuf + 1) % chan->numbufs; ++ if (chan->inreadbuf == chan->outreadbuf) ++ chan->inreadbuf = -1; /* no more buffers to receive to */ ++ if (chan->outreadbuf < 0) ++ chan->outreadbuf = oldreadbuf; /* new buffer to read from */ ++ } ++ + taskqueue_enqueue_fast(iface->rx_taskqueue, &iface->rx_task); +} + @@ -378,38 +409,49 @@ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c + struct dahdi_chan *chan = context; + struct dahdi_iface *iface; + unsigned long flags; ++ int oldreadbuf; + + if ((iface = chan->iface) == NULL) + return; + -+ /* -+ * Our network receiver logic is MUCH different. -+ * We actually only use a single buffer -+ */ + spin_lock_irqsave(&chan->lock, flags); -+ if (iface->upper != NULL && chan->readn[chan->inreadbuf] > 1) { -+ struct mbuf *m; ++ while ((oldreadbuf = chan->outreadbuf) >= 0) { ++ struct mbuf *m = NULL; + -+ /* Drop the FCS */ -+ chan->readn[chan->inreadbuf] -= 2; ++ /* read frame */ ++ if (iface->upper != NULL && chan->readn[chan->outreadbuf] > 1) { ++ ++ /* Drop the FCS */ ++ chan->readn[chan->outreadbuf] -= 2; ++ ++ MGETHDR(m, M_NOWAIT, MT_DATA); ++ if (m != NULL) { ++ if (chan->readn[chan->outreadbuf] >= MINCLSIZE) { ++ MCLGET(m, M_NOWAIT); ++ } ++ ++ /* copy data */ ++ m_append(m, chan->readn[chan->outreadbuf], chan->readbuf[chan->outreadbuf]); ++ } ++ } ++ ++ /* switch buffers */ ++ chan->readn[chan->outreadbuf] = 0; ++ chan->readidx[chan->outreadbuf] = 0; ++ chan->outreadbuf = (chan->outreadbuf + 1) % chan->numbufs; ++ if (chan->outreadbuf == chan->inreadbuf) ++ chan->outreadbuf = -1; /* no more buffers to read from */ ++ if (chan->inreadbuf < 0) ++ chan->inreadbuf = oldreadbuf; /* new buffer to read to */ + -+ MGETHDR(m, M_NOWAIT, MT_DATA); + if (m != NULL) { + int error; + -+ if (chan->readn[chan->inreadbuf] >= MINCLSIZE) { -+ MCLGET(m, M_NOWAIT); -+ } -+ -+ /* copy data */ -+ m_append(m, chan->readn[chan->inreadbuf], chan->readbuf[chan->inreadbuf]); ++ spin_unlock_irqrestore(&chan->lock, flags); + NG_SEND_DATA_ONLY(error, iface->upper, m); ++ spin_lock_irqsave(&chan->lock, flags); + } + } -+ -+ /* We don't cycle through buffers, just reuse the same one */ -+ chan->readn[chan->inreadbuf] = 0; -+ chan->readidx[chan->inreadbuf] = 0; + spin_unlock_irqrestore(&chan->lock, flags); +} + @@ -570,7 +612,7 @@ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c + } + if (ss->inwritebuf < 0) { + /* no space */ -+ retval = ENXIO; ++ retval = ENOBUFS; + goto out; + } + @@ -591,7 +633,7 @@ Index: freebsd/freebsd/dahdi/ng_dahdi_iface.c Index: freebsd/freebsd/dahdi/ng_dahdi_iface.h =================================================================== --- freebsd/freebsd/dahdi/ng_dahdi_iface.h (revision 0) -+++ freebsd/freebsd/dahdi/ng_dahdi_iface.h (revision 10325) ++++ freebsd/freebsd/dahdi/ng_dahdi_iface.h (revision 10329) @@ -0,0 +1,61 @@ +/*- + * Copyright (c) 2011 The FreeBSD Foundation @@ -668,27 +710,6 @@ Index: freebsd/freebsd/dahdi/Makefile SRCS+= device_if.h bus_if.h pci_if.h CLEANFILES= version.h INCS= user.h wctdm_user.h compat/types.h -Index: freebsd/include/dahdi/kernel.h -=================================================================== ---- freebsd/include/dahdi/kernel.h (revision 10321) -+++ freebsd/include/dahdi/kernel.h (working copy) -@@ -468,6 +468,7 @@ - struct cdev *dev; /*!< Device structure */ - struct cdev *file; /*!< File structure */ - int file_flags; -+ struct dahdi_iface *iface; - #else - struct file *file; /*!< File structure */ - #endif -@@ -1361,4 +1362,8 @@ - - void dahdi_poll_wait(struct file *file, struct pollinfo *sel, struct poll_table_struct *wait_table); - -+int dahdi_net_chan_init(struct dahdi_chan *chan); -+void dahdi_net_chan_destroy(struct dahdi_chan *chan); -+void dahdi_net_chan_xmit(struct dahdi_chan *chan); -+ - #endif /* _DAHDI_KERNEL_H */ Index: freebsd/drivers/dahdi/dahdi-base.c =================================================================== --- freebsd/drivers/dahdi/dahdi-base.c (revision 10321) @@ -706,14 +727,14 @@ Index: freebsd/drivers/dahdi/dahdi-base.c } #endif -+int dahdi_net_chan_init(struct dahdi_chan *ms) ++int dahdi_net_chan_init(struct dahdi_chan *ms, int numbufs) +{ + int res; + + ms->txbufpolicy = DAHDI_POLICY_IMMEDIATE; + ms->rxbufpolicy = DAHDI_POLICY_IMMEDIATE; + -+ res = dahdi_reallocbufs(ms, DAHDI_DEFAULT_MTU_MRU, DAHDI_DEFAULT_NUM_BUFS); ++ res = dahdi_reallocbufs(ms, DAHDI_DEFAULT_MTU_MRU, numbufs); + if (res) + return res; +