From owner-p4-projects@FreeBSD.ORG Wed Aug 8 08:02:53 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0E38D16A41B; Wed, 8 Aug 2007 08:02:53 +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 C081D16A418 for ; Wed, 8 Aug 2007 08:02:52 +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 AA81413C46A for ; Wed, 8 Aug 2007 08:02:52 +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 l7882qgI007749 for ; Wed, 8 Aug 2007 08:02:52 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7882qrH007746 for perforce@freebsd.org; Wed, 8 Aug 2007 08:02:52 GMT (envelope-from kmacy@freebsd.org) Date: Wed, 8 Aug 2007 08:02:52 GMT Message-Id: <200708080802.l7882qrH007746@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 124882 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: Wed, 08 Aug 2007 08:02:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=124882 Change 124882 by kmacy@kmacy_home:ethng on 2007/08/08 08:01:57 fix build errors for IFNET_MULTIQUEUE case Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#4 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#7 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#3 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#6 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#4 (text+ko) ==== @@ -31,7 +31,6 @@ ***************************************************************************/ - #ifndef _CXGB_ADAPTER_H_ #define _CXGB_ADAPTER_H_ @@ -577,7 +576,13 @@ int cxgb_pcpu_start(struct ifnet *ifp, int32_t cpuid, struct mbuf *m); int32_t cxgb_pcpu_get_cookie(struct ifnet *ifp, struct in6_addr *lip, uint16_t lport, struct in6_addr *rip, uint16_t rport, int ipv6); +void cxgb_pcpu_shutdown_threads(struct adapter *sc); +void cxgb_pcpu_startup_threads(struct adapter *sc); +void cxgb_start(struct ifnet *ifp); +struct mbuf *cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused); +#endif +void t3_free_qset(adapter_t *sc, struct sge_qset *q); +int cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax); #endif -#endif ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#7 (text+ko) ==== @@ -91,7 +91,6 @@ static void cxgb_stop_locked(struct port_info *); static void cxgb_set_rxmode(struct port_info *); static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t); -static void cxgb_start(struct ifnet *); static void cxgb_start_proc(void *, int ncount); static int cxgb_media_change(struct ifnet *); static void cxgb_media_status(struct ifnet *, struct ifmediareq *); @@ -219,22 +218,7 @@ SYSCTL_UINT(_hw_cxgb, OID_AUTO, singleq, CTLFLAG_RDTUN, &singleq, 0, "use a single queue-set per port"); -#ifdef IFNET_MULTIQUEUE -static int cxgb_pcpu_tx_coalesce = 0; -TUNABLE_INT("hw.cxgb.tx_coalesce", &cxgb_pcpu_tx_coalesce); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce, CTLFLAG_RDTUN, &cxgb_pcpu_tx_coalesce, 0, - "coalesce small packets into a single work request"); - -static int sleep_ticks = 1; -TUNABLE_INT("hw.cxgb.sleep_ticks", &sleep_ticks); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, sleep_ticks, CTLFLAG_RDTUN, &sleep_ticks, 0, - "ticks to sleep between checking pcpu queues"); - -int cxgb_txq_mbuf_ring_size = 2048; -TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb_txq_mbuf_ring_size); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_mbuf_ring_size, 0, - "size of per-queue mbuf ring"); -#else +#ifndef IFNET_MULTIQUEUE int cxgb_txq_mbuf_ring_size = 0; #endif @@ -295,7 +279,6 @@ {0, 0, 0, NULL} }; - static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset); static inline char @@ -705,8 +688,6 @@ return; } - - static int alloc_filters(struct adapter *adap) { @@ -1935,34 +1916,18 @@ return (error); } -static int -cxgb_start_tx(struct ifnet *ifp, uint32_t txmax) +int +cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax) { - struct sge_qset *qs; struct sge_txq *txq; - struct port_info *p = ifp->if_softc; struct mbuf *m0, *m = NULL; int err, in_use_init; - if (!p->link_config.link_ok) - return (ENXIO); - - 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; - - if (txq->flags & TXQ_TRANSMITTING) - return (EINPROGRESS); - - mtx_lock(&txq->lock); - txq->flags |= TXQ_TRANSMITTING; in_use_init = txq->in_use; while ((txq->in_use - in_use_init < txmax) && (txq->size > txq->in_use + TX_MAX_DESC)) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + m = cxgb_dequeue_packet(ifp, txq); if (m == NULL) break; /* @@ -1996,9 +1961,7 @@ break; BPF_MTAP(ifp, m); } - txq->flags &= ~TXQ_TRANSMITTING; - mtx_unlock(&txq->lock); - +#ifdef IFNET_MULTIQUEUE if (__predict_false(err)) { if (err == ENOMEM) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -2014,6 +1977,37 @@ ifp->if_drv_flags |= IFF_DRV_OACTIVE; err = ENOSPC; } +#endif + return (err); +} + +static int +cxgb_start_tx(struct ifnet *ifp, uint32_t txmax) +{ + struct sge_qset *qs; + struct sge_txq *txq; + struct port_info *p = ifp->if_softc; + int err; + + if (!p->link_config.link_ok) + return (ENXIO); + + 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; + + if (txq->flags & TXQ_TRANSMITTING) + return (EINPROGRESS); + + mtx_lock(&txq->lock); + txq->flags |= TXQ_TRANSMITTING; + cxgb_tx_common(ifp, qs, txmax); + txq->flags &= ~TXQ_TRANSMITTING; + mtx_unlock(&txq->lock); + return (err); } ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#3 (text+ko) ==== @@ -88,6 +88,23 @@ #include #endif +extern struct sysctl_oid_list sysctl__hw_cxgb_children; +static int cxgb_pcpu_tx_coalesce = 0; +TUNABLE_INT("hw.cxgb.tx_coalesce", &cxgb_pcpu_tx_coalesce); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce, CTLFLAG_RDTUN, &cxgb_pcpu_tx_coalesce, 0, + "coalesce small packets into a single work request"); + +static int sleep_ticks = 1; +TUNABLE_INT("hw.cxgb.sleep_ticks", &sleep_ticks); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, sleep_ticks, CTLFLAG_RDTUN, &sleep_ticks, 0, + "ticks to sleep between checking pcpu queues"); + +int cxgb_txq_mbuf_ring_size = 2048; +TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb_txq_mbuf_ring_size); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_mbuf_ring_size, 0, + "size of per-queue mbuf ring"); + + static inline int32_t cxgb_pcpu_calc_cookie(struct ifnet *ifp, struct mbuf *immpkt); static void cxgb_pcpu_start_proc(void *arg); static int cxgb_pcpu_cookie_to_qidx(struct port_info *, int32_t cookie); @@ -100,17 +117,17 @@ struct mbuf_head *mbq; int dropped = 0; - if (qs->flags & QS_EXITING) { + if (qs->qs_flags & QS_EXITING) { m_freem(m); return (0); } txq = &qs->txq[TXQ_ETH]; - DPRINTF("enqueueing packet to cpuid=%d\n", qs->cpuid); + DPRINTF("enqueueing packet to cpuid=%d\n", qs->qs_cpuid); mbq = &txq->sendq; - if (curcpu == qs->cpuid) { + if (curcpu == qs->qs_cpuid) { critical_enter(); mbufq_tail(mbq, m); critical_exit(); @@ -139,7 +156,7 @@ return (0); } -static int +int cxgb_pcpu_enqueue_packet(struct ifnet *ifp, int32_t cookie, struct mbuf *m) { struct port_info *pi; @@ -159,7 +176,7 @@ return (err); } -static struct mbuf * +struct mbuf * cxgb_dequeue_packet(struct ifnet *unused, struct sge_txq *txq) { struct mbuf *m, *tail, *head; @@ -172,7 +189,7 @@ tail = NULL; qs = txq_to_qset(txq, TXQ_ETH); - if (qs->flags & QS_EXITING) + if (qs->qs_flags & QS_EXITING) return (NULL); critical_enter(); @@ -196,7 +213,7 @@ return (head); } -static int32_t +int32_t cxgb_pcpu_get_cookie(struct ifnet *ifp, struct in6_addr *lip, uint16_t lport, struct in6_addr *rip, uint16_t rport, int ipv6) { uint32_t base; @@ -408,7 +425,7 @@ immqs = &pi->adapter->sge.qs[qidx]; curqs = (curcpu < SGE_QSETS) ? &pi->adapter->sge.qs[curcpu] : NULL; - if (immqs->flags & QS_EXITING) { + if (immqs->qs_flags & QS_EXITING) { printf("exting\n"); if (immpkt) m_freem(immpkt); @@ -432,7 +449,7 @@ txq = &curqs->txq[TXQ_ETH]; - if (curqs->flags & QS_EXITING) + if (curqs->qs_flags & QS_EXITING) return (0); /* @@ -459,7 +476,7 @@ flush = (!mbufq_empty(&txq->sendq)) && ((cxgb_pcpu_tx_coalesce == 0) || complete || tx_flush); max_desc = tx_flush ? 0xffffff : TX_START_MAX_DESC; - err = flush ? cxgb_tx_common(curqs->port->ifp, txq, max_desc) : 0; + err = flush ? cxgb_tx_common(curqs->port->ifp, curqs, max_desc) : 0; if (desc_reclaimable(txq) > 0) { if (cxgb_debug) { @@ -484,7 +501,7 @@ return (err); } -static int +int cxgb_pcpu_start(struct ifnet *ifp, int32_t cookie, struct mbuf *immpkt) { int err; @@ -498,7 +515,7 @@ return (err); } -static void +void cxgb_start(struct ifnet *ifp) { struct port_info *pi = ifp->if_softc; @@ -525,7 +542,7 @@ qidx = cxgb_pcpu_cookie_to_qidx(pi, calc_cookie); qs = &pi->adapter->sge.qs[qidx]; critical_enter(); - if (qs->cpuid == curcpu) { + if (qs->qs_cpuid == curcpu) { if (lhead == NULL) lhead = m; else @@ -559,17 +576,16 @@ td = curthread; - qs->flags |= QS_RUNNING; - + qs->qs_flags |= QS_RUNNING; thread_lock(td); - sched_bind(td, qs->cpuid); + sched_bind(td, qs->qs_cpuid); thread_unlock(td); for (;;) { - if (qs->flags & QS_EXITING) + if (qs->qs_flags & QS_EXITING) break; - cxgb_pcpu_start_(qs->port, qs->cpuid, NULL, TRUE); + cxgb_pcpu_start_(qs->port, qs->qs_cpuid, NULL, TRUE); refill_fl_service(qs->port->adapter, &qs->fl[0]); refill_fl_service(qs->port->adapter, &qs->fl[1]); @@ -580,10 +596,10 @@ thread_unlock(td); if (bootverbose) - device_printf(qs->port->adapter->dev, "exiting thread for cpu%d\n", qs->cpuid); + device_printf(qs->port->adapter->dev, "exiting thread for cpu%d\n", qs->qs_cpuid); t3_free_qset(qs->port->adapter, qs); - qs->flags &= ~QS_RUNNING; + qs->qs_flags &= ~QS_RUNNING; kthread_exit(0); } @@ -616,8 +632,8 @@ qs = &sc->sge.qs[pi->first_qset + j]; qs->port = pi; - qs->cpuid = ((pi->first_qset + j) % mp_ncpus); - device_printf(sc->dev, "starting thread for %d\n", qs->cpuid); + qs->qs_cpuid = ((pi->first_qset + j) % mp_ncpus); + device_printf(sc->dev, "starting thread for %d\n", qs->qs_cpuid); kthread_create(cxgb_pcpu_start_proc, qs, &p, RFNOWAIT, 0, "cxgbsp"); @@ -637,11 +653,11 @@ for (j = 0; j < pi->nqsets; j++) { struct sge_qset *qs = &sc->sge.qs[first + j]; - qs->flags |= QS_EXITING; + qs->qs_flags |= QS_EXITING; wakeup(qs); tsleep(&sc, 0, "cxgb unload 0", hz>>2); - while (qs->flags & QS_RUNNING) { - qs->flags |= QS_EXITING; + while (qs->qs_flags & QS_RUNNING) { + qs->qs_flags |= QS_EXITING; device_printf(sc->dev, "qset thread %d still running - sleeping\n", first + j); tsleep(&sc, 0, "cxgb unload 1", 2*hz); } ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#6 (text+ko) ==== @@ -185,7 +185,6 @@ static int lro_default = 0; int cxgb_debug = 0; -static void t3_free_qset(adapter_t *sc, struct sge_qset *q); 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); @@ -1526,7 +1525,7 @@ * as HW contexts, packet buffers, and descriptor rings. Traffic to the * queue set must be quiesced prior to calling this. */ -static void +void t3_free_qset(adapter_t *sc, struct sge_qset *q) { int i;