From owner-svn-src-user@FreeBSD.ORG Sun Jun 7 00:27:45 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DA5901065674; Sun, 7 Jun 2009 00:27:45 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C8F7D8FC0A; Sun, 7 Jun 2009 00:27:45 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n570Rj7F076345; Sun, 7 Jun 2009 00:27:45 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n570RjcP076344; Sun, 7 Jun 2009 00:27:45 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906070027.n570RjcP076344@svn.freebsd.org> From: Kip Macy Date: Sun, 7 Jun 2009 00:27:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193599 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Jun 2009 00:27:46 -0000 Author: kmacy Date: Sun Jun 7 00:27:45 2009 New Revision: 193599 URL: http://svn.freebsd.org/changeset/base/193599 Log: don't free mbuf if it is part of a chain Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Sun Jun 7 00:02:52 2009 (r193598) +++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Sun Jun 7 00:27:45 2009 (r193599) @@ -266,6 +266,56 @@ set_wr_hdr(struct work_request_hdr *wrp, } #endif +struct coalesce_info { + int count; + int nbytes; +}; + +static int +coalesce_check(struct mbuf *m, void *arg) +{ + struct coalesce_info *ci = arg; + int *count = &ci->count; + int *nbytes = &ci->nbytes; + + if ((*nbytes + m->m_len <= 10500) && (*count < 7) && + (m->m_next == NULL)){ + *count += 1; + *nbytes += m->m_len; + return (1); + } + return (0); +} + +static struct mbuf * +cxgb_dequeue(struct sge_qset *qs) +{ + struct mbuf *m, *m_head, *m_tail; + struct coalesce_info ci; + + if (qs->port->adapter->tunq_coalesce) { + m = TXQ_RING_DEQUEUE(qs); + if (m != NULL && m->m_nextpkt != NULL) + panic("dequeued regular packet with nextpkt set!"); + } + + m_head = m_tail = NULL; + ci.count = ci.nbytes = 0; + do { + m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &ci); + if (m_head == NULL) { + m_tail = m_head = m; + } else if (m != NULL) { + m_tail->m_nextpkt = m; + m_tail = m; + m->m_nextpkt = NULL; + } + } while (m != NULL); + if (ci.count > 7) + panic("trying to coalesce %d packets in to one WR", ci.count); + return (m_head); +} + /** * reclaim_completed_tx - reclaims completed Tx descriptors * @adapter: the adapter @@ -1502,7 +1552,6 @@ cxgb_tx_watchdog(void *arg) qs, txq->txq_watchdog.c_cpu); } - static void cxgb_tx_timeout(void *arg) { @@ -1516,56 +1565,6 @@ cxgb_tx_timeout(void *arg) } } -struct coalesce_info { - int count; - int nbytes; -}; - -static int -coalesce_check(struct mbuf *m, void *arg) -{ - struct coalesce_info *ci = arg; - int *count = &ci->count; - int *nbytes = &ci->nbytes; - - if ((*nbytes + m->m_len <= 10500) && (*count < 7) && - (m->m_next == NULL)){ - *count += 1; - *nbytes += m->m_len; - return (1); - } - return (0); -} - -static struct mbuf * -cxgb_dequeue(struct sge_qset *qs) -{ - struct mbuf *m, *m_head, *m_tail; - struct coalesce_info ci; - - if (qs->port->adapter->tunq_coalesce) { - m = TXQ_RING_DEQUEUE(qs); - if (m != NULL && m->m_nextpkt != NULL) - panic("dequeued regular packet with nextpkt set!"); - } - - m_head = m_tail = NULL; - ci.count = ci.nbytes = 0; - do { - m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &ci); - if (m_head == NULL) { - m_tail = m_head = m; - } else if (m != NULL) { - m_tail->m_nextpkt = m; - m_tail = m; - m->m_nextpkt = NULL; - } - } while (m != NULL); - if (ci.count > 7) - panic("trying to coalesce %d packets in to one WR", ci.count); - return (m_head); -} - static void cxgb_start_locked(struct sge_qset *qs) { @@ -1596,7 +1595,7 @@ cxgb_start_locked(struct sge_qset *qs) * Encapsulation can modify our pointer, and or make it * NULL on failure. In that event, we can't requeue. */ - if (t3_encap(qs, &m_head)) + if (t3_encap(qs, &m_head) || m_head == NULL) break; /* Send a copy of the frame to the BPF listener */ @@ -1605,7 +1604,8 @@ cxgb_start_locked(struct sge_qset *qs) /* * We sent via PIO, no longer need a copy */ - if (m_head->m_pkthdr.len <= PIO_LEN) + if (m->head->m_nextpkt == NULL && + m_head->m_pkthdr.len <= PIO_LEN) m_freem(m_head); m_head = NULL;