From owner-p4-projects@FreeBSD.ORG Thu Aug 9 00:54:59 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8FB8C16A420; Thu, 9 Aug 2007 00:54:59 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3AD0A16A41A for ; Thu, 9 Aug 2007 00:54:59 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 2C95313C457 for ; Thu, 9 Aug 2007 00:54:59 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l790sxVq057921 for ; Thu, 9 Aug 2007 00:54:59 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l790swYO057918 for perforce@freebsd.org; Thu, 9 Aug 2007 00:54:58 GMT (envelope-from kmacy@freebsd.org) Date: Thu, 9 Aug 2007 00:54:58 GMT Message-Id: <200708090054.l790swYO057918@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 124928 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Aug 2007 00:54:59 -0000 http://perforce.freebsd.org/chv.cgi?CH=124928 Change 124928 by kmacy@kmacy_home:ethng on 2007/08/09 00:54:45 get cxgb support for IFNET_MULTIQUEUE performance within 10% of default case Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#6 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#9 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#4 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#7 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#6 (text+ko) ==== @@ -51,6 +51,7 @@ #include #include + #include #include #include @@ -584,5 +585,6 @@ int cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax); struct mbuf *cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused); void cxgb_start(struct ifnet *ifp); +void refill_fl_service(adapter_t *adap, struct sge_fl *fl); #endif ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#9 (text+ko) ==== @@ -1961,7 +1961,7 @@ break; BPF_MTAP(ifp, m); } -#ifdef IFNET_MULTIQUEUE +#ifndef IFNET_MULTIQUEUE if (__predict_false(err)) { if (err == ENOMEM) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -1970,8 +1970,9 @@ IFQ_UNLOCK(&ifp->if_snd); } } - if (err == 0 && m == NULL) + if (err == 0 && m == NULL) { err = ENOBUFS; + } else if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) && (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -1992,9 +1993,9 @@ if (!p->link_config.link_ok) return (ENXIO); - if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { return (ENOBUFS); - + } qs = &p->adapter->sge.qs[p->first_qset]; txq = &qs->txq[TXQ_ETH]; err = 0; ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#4 (text+ko) ==== @@ -1,5 +1,3 @@ - - /************************************************************************** Copyright (c) 2007, Chelsio Inc. @@ -149,6 +147,9 @@ } mtx_unlock(&txq->lock); + if ((qs->txq[TXQ_ETH].flags & TXQ_TRANSMITTING) == 0) + wakeup(qs); + if (dropped) m_freem(m); } @@ -566,8 +567,6 @@ sched_unpin(); } -void refill_fl_service(adapter_t *adap, struct sge_fl *fl); - static void cxgb_pcpu_start_proc(void *arg) { @@ -589,7 +588,7 @@ refill_fl_service(qs->port->adapter, &qs->fl[0]); refill_fl_service(qs->port->adapter, &qs->fl[1]); - tsleep(qs, 0, "cxgbidle", sleep_ticks); + tsleep(qs, 1, "cxgbidle", sleep_ticks); } thread_lock(td); sched_unbind(td); ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#7 (text+ko) ==== @@ -188,7 +188,6 @@ static void sge_timer_cb(void *arg); static void sge_timer_reclaim(void *arg, int ncount); static void sge_txq_reclaim_handler(void *arg, int ncount); -static int free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec); /** * reclaim_completed_tx - reclaims completed Tx descriptors @@ -207,7 +206,7 @@ mtx_assert(&q->lock, MA_OWNED); if (reclaim > 0) { - n = free_tx_desc(q, min(reclaim, nbufs), mvec); + n = t3_free_tx_desc(q, min(reclaim, nbufs), mvec); reclaimed = min(reclaim, nbufs); q->cleaned += reclaimed; q->in_use -= reclaimed; @@ -580,6 +579,13 @@ refill_fl(adap, fl, min(16U, fl->size - fl->credits)); } +void +refill_fl_service(adapter_t *adap, struct sge_fl *fl) +{ + return; /* XXX no-op for now */ + __refill_fl(adap, fl); +} + /** * recycle_rx_buf - recycle a receive buffer * @adapter: the adapter @@ -1654,7 +1660,7 @@ /** - * free_tx_desc - reclaims Tx descriptors and their buffers + * t3_free_tx_desc - reclaims Tx descriptors and their buffers * @adapter: the adapter * @q: the Tx queue to reclaim descriptors from * @n: the number of descriptors to reclaim @@ -1663,7 +1669,7 @@ * Tx buffers. Called with the Tx queue lock held. */ int -free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec) +t3_free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec) { struct tx_sw_desc *d; unsigned int cidx = q->cidx; @@ -2226,9 +2232,12 @@ struct ifnet *ifp = pi->ifp; DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, mtod(m, uint8_t *), cpl->iff); - if (&pi->adapter->port[cpl->iff] != pi) - panic("bad port index %d m->m_data=%p\n", cpl->iff, mtod(m, uint8_t *)); - + if (&pi->adapter->port[cpl->iff] != pi) { + struct sge_qset *qs = rspq_to_qset(rq); + + panic("bad port index %d m->m_data=%p cidx=%d pidx=%d\n", cpl->iff, mtod(m, uint8_t *), + qs->fl[0].cidx, qs->fl[0].pidx); + } if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment && cpl->csum_valid && cpl->csum == 0xffff) { m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID);