From owner-p4-projects@FreeBSD.ORG Wed Feb 6 23:36:39 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5057016A420; Wed, 6 Feb 2008 23:36:39 +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 14AAF16A417 for ; Wed, 6 Feb 2008 23:36:39 +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 F367413C461 for ; Wed, 6 Feb 2008 23:36:38 +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 m16Nacne035448 for ; Wed, 6 Feb 2008 23:36:38 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m16NacEd035445 for perforce@freebsd.org; Wed, 6 Feb 2008 23:36:38 GMT (envelope-from kmacy@freebsd.org) Date: Wed, 6 Feb 2008 23:36:38 GMT Message-Id: <200802062336.m16NacEd035445@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 134938 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, 06 Feb 2008 23:36:39 -0000 http://perforce.freebsd.org/chv.cgi?CH=134938 Change 134938 by kmacy@kmacy:entropy:iwarp on 2008/02/06 23:36:20 fix issues caused by integration Affected files ... .. //depot/projects/iwarp/sys/amd64/conf/GENERIC#7 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#7 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_main.c#12 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_multiq.c#6 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#13 edit .. //depot/projects/iwarp/sys/dev/cxgb/cxgb_sge.c#10 edit .. //depot/projects/iwarp/sys/modules/cxgb/cxgb/Makefile#5 edit Differences ... ==== //depot/projects/iwarp/sys/amd64/conf/GENERIC#7 (text+ko) ==== @@ -213,5 +213,4 @@ device dcons_crom # Configuration ROM for dcons options ALT_BREAK_TO_DEBUGGER -options IFNET_MULTIQUEUE #options BIND_ALL ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_l2t.c#7 (text+ko) ==== @@ -223,7 +223,7 @@ else m_freem(m); mtx_unlock(&e->lock); - } + } } return 0; } @@ -541,6 +541,12 @@ void t3_free_l2t(struct l2t_data *d) { + int i; + + rw_destroy(&d->lock); + for (i = 0; i < d->nentries; ++i) + mtx_destroy(&d->l2tab[i].lock); + cxgb_free_mem(d); } ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_main.c#12 (text+ko) ==== @@ -119,6 +119,7 @@ static int offload_open(struct port_info *pi); static void touch_bars(device_t dev); static int offload_close(struct t3cdev *tdev); + static device_method_t cxgb_controller_methods[] = { DEVMETHOD(device_probe, cxgb_controller_probe), DEVMETHOD(device_attach, cxgb_controller_attach), @@ -438,11 +439,11 @@ } sc->udbs_rid = PCIR_BAR(2); if ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &sc->udbs_rid, RF_ACTIVE)) == NULL) { + &sc->udbs_rid, RF_ACTIVE)) == NULL) { device_printf(dev, "Cannot allocate BAR region 1\n"); error = ENXIO; goto out; - } + } snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d", device_get_unit(dev)); @@ -614,6 +615,7 @@ snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d", G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers)); + device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]); t3_add_attach_sysctls(sc); @@ -661,11 +663,7 @@ bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid, sc->msix_regs_res); } - - if (sc->tq != NULL) { - taskqueue_drain(sc->tq, &sc->ext_intr_task); - taskqueue_drain(sc->tq, &sc->tick_task); - } + t3_sge_deinit_sw(sc); /* * Wait for last callout @@ -679,22 +677,26 @@ } bus_generic_detach(sc->dev); - if (sc->tq != NULL) + if (sc->tq != NULL) { taskqueue_free(sc->tq); + sc->tq = NULL; + } + if (is_offload(sc)) { cxgb_adapter_unofld(sc); if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT)) offload_close(&sc->tdev); - } + else + printf("cxgb_free: DEVMAP_BIT not set\n"); + } else + printf("not offloading set\n"); -#ifndef IFNET_MULTIQUEUE - t3_free_sge_resources(sc); -#endif + cxgb_offload_deactivate(sc); free(sc->filters, M_DEVBUF); t3_sge_free(sc); cxgb_offload_exit(); - + if (sc->udbs_res != NULL) bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid, sc->udbs_res); @@ -909,11 +911,12 @@ ifp->if_ioctl = cxgb_ioctl; ifp->if_start = cxgb_start; +#if 0 #ifdef IFNET_MULTIQUEUE ifp->if_flags |= IFF_MULTIQ; ifp->if_mq_start = cxgb_pcpu_start; #endif - +#endif ifp->if_timer = 0; /* Disable ifnet watchdog */ ifp->if_watchdog = NULL; @@ -1131,9 +1134,6 @@ struct port_info *pi = &adapter->port[port_id]; struct cmac *mac = &adapter->port[port_id].mac; - if ((pi->ifp->if_flags & IFF_UP) == 0) - return; - if (link_status) { t3_mac_enable(mac, MAC_DIRECTION_RX); if_link_state_change(pi->ifp, LINK_STATE_UP); @@ -1541,7 +1541,6 @@ static void cxgb_down_locked(struct adapter *sc) { - int i; t3_sge_stop(sc); t3_intr_disable(sc); @@ -1558,20 +1557,24 @@ sc->irq_res = NULL; } - if (sc->flags & USING_MSIX) + if (sc->flags & USING_MSIX) cxgb_teardown_msix(sc); - ADAPTER_UNLOCK(sc); - + callout_stop(&sc->cxgb_tick_ch); callout_stop(&sc->sge_timer_ch); callout_drain(&sc->cxgb_tick_ch); callout_drain(&sc->sge_timer_ch); if (sc->tq != NULL) { + printf("draining slow intr\n"); + taskqueue_drain(sc->tq, &sc->slow_intr_task); - for (i = 0; i < sc->params.nports; i++) - taskqueue_drain(sc->tq, &sc->port[i].timer_reclaim_task); + printf("draining ext intr\n"); + taskqueue_drain(sc->tq, &sc->ext_intr_task); + printf("draining tick task\n"); + taskqueue_drain(sc->tq, &sc->tick_task); } + ADAPTER_UNLOCK(sc); } static int @@ -1650,7 +1653,6 @@ cxgb_down_locked(adapter); else ADAPTER_UNLOCK(adapter); - cxgb_offload_deactivate(adapter); return (0); } @@ -1818,6 +1820,12 @@ break; case SIOCSIFMEDIA: case SIOCGIFMEDIA: + /* + * This is a convenient place to check the link status when + * no interfaces are up and thus the callout is not running + */ + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + cxgb_tick_handler(p->adapter, 0); error = ifmedia_ioctl(ifp, ifr, &p->media, command); break; case SIOCSIFCAP: @@ -1992,20 +2000,21 @@ struct port_info *p = &sc->port[i]; struct ifnet *ifp = p->ifp; - PORT_LOCK(p); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) && + (ifp->if_flags & IFF_UP)) running = 1; - PORT_UNLOCK(p); } if (running == 0) return; - taskqueue_enqueue(sc->tq, &sc->tick_task); + - if (sc->open_device_map != 0) + if (sc->open_device_map != 0) { + taskqueue_enqueue(sc->tq, &sc->tick_task); callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc); + } } static void @@ -2514,7 +2523,7 @@ reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start, unsigned int end) { - uint32_t *p = (uint32_t *)(buf + start); + uint32_t *p = (uint32_t *)buf + start; for ( ; start <= end; start += sizeof(uint32_t)) *p++ = t3_read_reg(ap, start); ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_multiq.c#6 (text+ko) ==== @@ -27,8 +27,10 @@ ***************************************************************************/ +#define DEBUG_BUFRING + #include -__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_main.c,v 1.28 2007/07/17 06:50:33 kmacy Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_multiq.c,v 1.6 2008/01/15 08:08:08 kmacy Exp $"); #include #include @@ -55,7 +57,7 @@ #include #include #include -#include +#include #include #include @@ -92,7 +94,7 @@ #endif extern struct sysctl_oid_list sysctl__hw_cxgb_children; -static int cxgb_pcpu_tx_coalesce = 1; +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"); @@ -110,41 +112,35 @@ static inline int32_t cxgb_pcpu_calc_cookie(struct ifnet *ifp, struct mbuf *immpkt); static void cxgb_pcpu_start_proc(void *arg); +#ifdef IFNET_MULTIQUEUE static int cxgb_pcpu_cookie_to_qidx(struct port_info *, uint32_t cookie); +#endif static int cxgb_tx(struct sge_qset *qs, uint32_t txmax); + static inline int cxgb_pcpu_enqueue_packet_(struct sge_qset *qs, struct mbuf *m) { struct sge_txq *txq; - struct buf_ring *mr; - int prod, cons, mask; int err = 0; - + +#ifndef IFNET_MULTIQUEUE + panic("not expecting enqueue without multiqueue"); +#endif + KASSERT(m != NULL, ("null mbuf")); + KASSERT(m->m_type == MT_DATA, ("bad mbuf type %d", m->m_type)); if (qs->qs_flags & QS_EXITING) { m_freem(m); return (ENXIO); } txq = &qs->txq[TXQ_ETH]; - - mr = &txq->txq_mr; - mtx_lock(&mr->br_lock); - cons = mr->br_cons; - prod = mr->br_prod; - mask = mr->br_size - 1; - if (((prod + 1) & mask) != cons) { - mr->br_ring[prod] = (caddr_t)m; - mb(); - mr->br_prod = (prod + 1) & mask; - } else { + err = buf_ring_enqueue(&txq->txq_mr, m); + if (err) { txq->txq_drops++; - err = ENOBUFS; + m_freem(m); } - mtx_unlock(&mr->br_lock); if ((qs->txq[TXQ_ETH].flags & TXQ_TRANSMITTING) == 0) wakeup(qs); - if (err) - m_freem(m); return (err); } @@ -152,16 +148,17 @@ int cxgb_pcpu_enqueue_packet(struct ifnet *ifp, struct mbuf *m) { - struct port_info *pi; + struct port_info *pi = ifp->if_softc; struct sge_qset *qs; - int err, qidx; + int err = 0, qidx; +#ifdef IFNET_MULTIQUEUE int32_t calc_cookie; - pi = ifp->if_softc; - err = 0; - calc_cookie = m->m_pkthdr.rss_hash; qidx = cxgb_pcpu_cookie_to_qidx(pi, calc_cookie); +#else + qidx = 0; +#endif qs = &pi->adapter->sge.qs[qidx]; err = cxgb_pcpu_enqueue_packet_(qs, m); @@ -176,11 +173,22 @@ struct sge_qset *qs; int count, size, coalesced; struct adapter *sc; - struct buf_ring *mr; +#ifndef IFNET_MULTIQUEUE + struct port_info *pi = txq->port; + + if (txq->immpkt != NULL) + panic("immediate packet set"); + mtx_assert(&txq->lock, MA_OWNED); + + IFQ_DRV_DEQUEUE(&pi->ifp->if_snd, m); + if (m == NULL) + return (0); - mr = &txq->txq_mr; + m_vec[0] = m; + return (1); +#endif + coalesced = count = size = 0; - qs = txq_to_qset(txq, TXQ_ETH); if (qs->qs_flags & QS_EXITING) return (0); @@ -193,28 +201,33 @@ } sc = qs->port->adapter; - m = buf_ring_dequeue(mr); - if (m == NULL) + m = buf_ring_dequeue(&txq->txq_mr); + if (m == NULL) return (0); + count = 1; + KASSERT(m->m_type == MT_DATA, + ("m=%p is bad mbuf type %d from ring cons=%d prod=%d", m, + m->m_type, txq->txq_mr.br_cons, txq->txq_mr.br_prod)); m_vec[0] = m; - if (m->m_pkthdr.tso_segsz > 0 || m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL) { - DPRINTF("returning 1 packet\n"); - return (1); + if (m->m_pkthdr.tso_segsz > 0 || m->m_pkthdr.len > TX_WR_SIZE_MAX || + m->m_next != NULL || (cxgb_pcpu_tx_coalesce == 0)) { + return (count); } - count = 1; + size = m->m_pkthdr.len; - for (m = buf_ring_peek(mr); m != NULL; m = buf_ring_peek(mr)) { + for (m = buf_ring_peek(&txq->txq_mr); m != NULL; + m = buf_ring_peek(&txq->txq_mr)) { - if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL) + if (m->m_pkthdr.tso_segsz > 0 || + size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL) break; - buf_ring_dequeue(mr); + buf_ring_dequeue(&txq->txq_mr); size += m->m_pkthdr.len; m_vec[count++] = m; - - if (count == TX_WR_COUNT_MAX || (cxgb_pcpu_tx_coalesce == 0)) + if (count == TX_WR_COUNT_MAX) break; coalesced++; @@ -357,13 +370,15 @@ { struct mbuf *m; struct sge_txq *txq = &qs->txq[TXQ_ETH]; - + + mtx_lock(&txq->lock); while ((m = mbufq_dequeue(&txq->sendq)) != NULL) m_freem(m); while ((m = buf_ring_dequeue(&txq->txq_mr)) != NULL) m_freem(m); t3_free_tx_desc_all(txq); + mtx_unlock(&txq->lock); } static int @@ -376,6 +391,7 @@ KASSERT(qs->qs_cpuid == curcpu, ("cpu qset mismatch cpuid=%d curcpu=%d", qs->qs_cpuid, curcpu)); #endif + mtx_assert(&txq->lock, MA_OWNED); reclaimable = desc_reclaimable(txq); if (reclaimable == 0) @@ -403,14 +419,20 @@ pi = qs->port; initerr = err = i = reclaimed = 0; sc = pi->adapter; + txq = &qs->txq[TXQ_ETH]; + + mtx_assert(&txq->lock, MA_OWNED); retry: if (!pi->link_config.link_ok) initerr = ENXIO; else if (qs->qs_flags & QS_EXITING) initerr = ENXIO; - else { - txq = &qs->txq[TXQ_ETH]; + else if ((pi->ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + initerr = ENXIO; + else if ((pi->ifp->if_flags & IFF_UP) == 0) + initerr = ENXIO; + else if (immpkt) { if (!buf_ring_empty(&txq->txq_mr)) initerr = cxgb_pcpu_enqueue_packet_(qs, immpkt); @@ -421,13 +443,14 @@ } if (initerr && initerr != ENOBUFS) { if (cxgb_debug) - printf("cxgb link down\n"); + log(LOG_WARNING, "cxgb link down\n"); if (immpkt) m_freem(immpkt); return (initerr); } - if ((tx_flush && (desc_reclaimable(txq) > 0)) || (desc_reclaimable(txq) > (TX_ETH_Q_SIZE>>1))) { + if ((tx_flush && (desc_reclaimable(txq) > 0)) || + (desc_reclaimable(txq) > (TX_ETH_Q_SIZE>>1))) { int reclaimed = 0; if (cxgb_debug) { @@ -442,11 +465,19 @@ } stopped = isset(&qs->txq_stopped, TXQ_ETH); - flush = ((!buf_ring_empty(&txq->txq_mr) && !stopped) || txq->immpkt); + flush = (((!buf_ring_empty(&txq->txq_mr) || (!IFQ_DRV_IS_EMPTY(&pi->ifp->if_snd))) && !stopped) || txq->immpkt); max_desc = tx_flush ? TX_ETH_Q_SIZE : TX_START_MAX_DESC; + + if (cxgb_debug) + DPRINTF("stopped=%d flush=%d max_desc=%d\n", + stopped, flush, max_desc); + err = flush ? cxgb_tx(qs, max_desc) : ENOSPC; - - if ((tx_flush && flush && err == 0) && !buf_ring_empty(&txq->txq_mr)) { + + + if ((tx_flush && flush && err == 0) && + (!buf_ring_empty(&txq->txq_mr) || + !IFQ_DRV_IS_EMPTY(&pi->ifp->if_snd))) { struct thread *td = curthread; if (++i > 1) { @@ -481,26 +512,37 @@ sc = pi->adapter; qs = NULL; qidx = resid = err = cookie = locked = 0; - + +#ifdef IFNET_MULTIQUEUE if (immpkt && (immpkt->m_pkthdr.rss_hash != 0)) { cookie = immpkt->m_pkthdr.rss_hash; qidx = cxgb_pcpu_cookie_to_qidx(pi, cookie); DPRINTF("hash=0x%x qidx=%d cpu=%d\n", immpkt->m_pkthdr.rss_hash, qidx, curcpu); qs = &pi->adapter->sge.qs[qidx]; - } else + } else +#endif qs = &pi->adapter->sge.qs[pi->first_qset]; - + txq = &qs->txq[TXQ_ETH]; - if (((sc->tunq_coalesce == 0) || (buf_ring_count(&txq->txq_mr) > TX_WR_COUNT_MAX)) && mtx_trylock(&txq->lock)) { + if (((sc->tunq_coalesce == 0) || + (buf_ring_count(&txq->txq_mr) >= TX_WR_COUNT_MAX) || + (cxgb_pcpu_tx_coalesce == 0)) && mtx_trylock(&txq->lock)) { + if (cxgb_debug) + printf("doing immediate transmit\n"); + txq->flags |= TXQ_TRANSMITTING; err = cxgb_pcpu_start_(qs, immpkt, FALSE); txq->flags &= ~TXQ_TRANSMITTING; resid = (buf_ring_count(&txq->txq_mr) > 64) || (desc_reclaimable(txq) > 64); mtx_unlock(&txq->lock); - } else if (immpkt) + } else if (immpkt) { + if (cxgb_debug) + printf("deferred coalesce=%jx ring_count=%d mtx_owned=%d\n", + sc->tunq_coalesce, buf_ring_count(&txq->txq_mr), mtx_owned(&txq->lock)); err = cxgb_pcpu_enqueue_packet_(qs, immpkt); - + } + if (resid && (txq->flags & TXQ_TRANSMITTING) == 0) wakeup(qs); @@ -510,53 +552,15 @@ void cxgb_start(struct ifnet *ifp) { - struct port_info *pi = ifp->if_softc; - struct sge_qset *qs; - struct mbuf *m, *head, *tail, *lhead, *ltail; - int calc_cookie, qidx, i; + struct port_info *p = ifp->if_softc; + + if (!p->link_config.link_ok) + return; - IFQ_LOCK(&ifp->if_snd); - IFQ_DEQUEUE_NOLOCK(&ifp->if_snd, m); - head = tail = m; - i = 0; - while (m != NULL) { - IFQ_DEQUEUE_NOLOCK(&ifp->if_snd, m); - tail->m_nextpkt = m; - tail = m; - i++; - } - IFQ_UNLOCK(&ifp->if_snd); - printf("dequeued %d packets\n", i); - lhead = ltail = NULL; - for (m = head; m != NULL; m = head->m_nextpkt) { - calc_cookie = cxgb_pcpu_calc_cookie(ifp, m); - qidx = cxgb_pcpu_cookie_to_qidx(pi, calc_cookie); - qs = &pi->adapter->sge.qs[qidx]; - critical_enter(); - if (qs->qs_cpuid == curcpu) { - if (lhead == NULL) - lhead = m; - else - ltail->m_nextpkt = m; - ltail = m; - critical_exit(); - } else { - critical_exit(); - cxgb_pcpu_enqueue_packet_(qs, m); - } - } - if (curcpu < SGE_QSETS) { - qs = &pi->adapter->sge.qs[curcpu]; - /* - * Assume one-to-one mapping of qset to CPU for now XXX - */ + if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + return; - (void)cxgb_pcpu_start_(qs, NULL, TRUE); - /* - * XXX multiple packets - */ - cxgb_pcpu_enqueue_packet_(qs, lhead); - } + cxgb_pcpu_start(ifp, NULL); } static void @@ -566,11 +570,12 @@ struct thread *td; struct sge_txq *txq = &qs->txq[TXQ_ETH]; int idleticks, err = 0; +#ifdef notyet struct adapter *sc = qs->port->adapter; - +#endif td = curthread; - sleep_ticks = hz/100; + sleep_ticks = max(hz/1000, 1); qs->qs_flags |= QS_RUNNING; thread_lock(td); sched_bind(td, qs->qs_cpuid); @@ -599,7 +604,7 @@ mtx_unlock(&txq->lock); } else err = EINPROGRESS; - +#ifdef notyet if (mtx_trylock(&qs->rspq.lock)) { process_responses(sc, qs, -1); @@ -610,6 +615,7 @@ mtx_unlock(&qs->rspq.lock); } +#endif if ((!buf_ring_empty(&txq->txq_mr)) && err == 0) { if (cxgb_debug) printf("head=%p cons=%d prod=%d\n", @@ -632,36 +638,47 @@ kproc_exit(0); } +#ifdef IFNET_MULTIQUEUE static int cxgb_pcpu_cookie_to_qidx(struct port_info *pi, uint32_t cookie) { int qidx; uint32_t tmp; + /* + * Will probably need to be changed for 4-port XXX + */ tmp = pi->tx_chan ? cookie : cookie & ((RSS_TABLE_SIZE>>1)-1); DPRINTF(" tmp=%d ", tmp); qidx = (tmp & (pi->nqsets -1)) + pi->first_qset; return (qidx); } - +#endif void cxgb_pcpu_startup_threads(struct adapter *sc) { - int i, j; + int i, j, nqsets; struct proc *p; - + + for (i = 0; i < (sc)->params.nports; ++i) { struct port_info *pi = adap2pinfo(sc, i); - - for (j = 0; j < pi->nqsets; ++j) { + +#ifdef IFNET_MULTIQUEUE + nqsets = pi->nqsets; +#else + nqsets = 1; +#endif + for (j = 0; j < nqsets; ++j) { struct sge_qset *qs; qs = &sc->sge.qs[pi->first_qset + j]; qs->port = pi; qs->qs_cpuid = ((pi->first_qset + j) % mp_ncpus); - device_printf(sc->dev, "starting thread for %d\n", qs->qs_cpuid); + device_printf(sc->dev, "starting thread for %d\n", + qs->qs_cpuid); kproc_create(cxgb_pcpu_start_proc, qs, &p, RFNOWAIT, 0, "cxgbsp"); @@ -674,12 +691,20 @@ cxgb_pcpu_shutdown_threads(struct adapter *sc) { int i, j; + int nqsets; + + for (i = 0; i < sc->params.nports; i++) { struct port_info *pi = &sc->port[i]; int first = pi->first_qset; - - for (j = 0; j < pi->nqsets; j++) { + +#ifdef IFNET_MULTIQUEUE + nqsets = pi->nqsets; +#else + nqsets = 1; +#endif + for (j = 0; j < nqsets; j++) { struct sge_qset *qs = &sc->sge.qs[first + j]; qs->qs_flags |= QS_EXITING; @@ -694,7 +719,6 @@ } } - static __inline void check_pkt_coalesce(struct sge_qset *qs) { @@ -774,3 +798,4 @@ #endif return (err); } + ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_offload.c#13 (text+ko) ==== @@ -305,9 +305,7 @@ req->pbl_top = t3_read_reg(adapter, A_ULPTX_PBL_ULIMIT); req->rqt_base = t3_read_reg(adapter, A_ULPRX_RQ_LLIMIT); req->rqt_top = t3_read_reg(adapter, A_ULPRX_RQ_ULIMIT); - req->kdb_addr = (void *)((unsigned long)rman_get_virtual(adapter->regs_res) + A_SG_KDOORBELL); - req->pdev = adapter->dev; - break; + req->kdb_addr = (void *)((unsigned long)rman_get_virtual(adapter->regs_res) + A_SG_KDOORBELL); break; } case RDMA_CQ_OP: { struct rdma_cq_op *req = data; @@ -926,7 +924,6 @@ cxgb_redirect_event(void *unused, int event, struct rtentry *rt0, struct rtentry *rt1, struct sockaddr *sa) { - /* * ignore events on non-offloaded interfaces */ @@ -967,14 +964,15 @@ do_bad_cpl(struct t3cdev *dev, struct mbuf *m) { log(LOG_ERR, "%s: received bad CPL command 0x%x\n", dev->name, - *mtod(m, uint32_t *)); + 0xFF & *mtod(m, uint32_t *)); + kdb_backtrace(); return (CPL_RET_BUF_DONE | CPL_RET_BAD_MSG); } /* * Handlers for each CPL opcode */ -static cpl_handler_func cpl_handlers[NUM_CPL_CMDS]; +static cpl_handler_func cpl_handlers[256]; /* * Add a new handler to the CPL dispatch table. A NULL handler may be supplied @@ -1066,9 +1064,13 @@ void cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa) { - struct t3cdev *tdev = T3CDEV(rt->rt_ifp); - PANIC_IF(!tdev); - t3_l2t_update(tdev, rt, enaddr, sa); + + if (is_offloading(rt->rt_ifp)) { + struct t3cdev *tdev = T3CDEV(rt->rt_ifp); + + PANIC_IF(!tdev); + t3_l2t_update(tdev, rt, enaddr, sa); + } } static void @@ -1110,6 +1112,13 @@ olddev = old->rt_ifp; newdev = new->rt_ifp; + if (!is_offloading(olddev)) + return; + if (!is_offloading(newdev)) { + log(LOG_WARNING, "%s: Redirect to non-offload" + "device ignored.\n", __FUNCTION__); + return; + } tdev = T3CDEV(olddev); PANIC_IF(!tdev); if (tdev != T3CDEV(newdev)) { @@ -1163,7 +1172,6 @@ free(addr, M_CXGB); } - /* * Allocate and initialize the TID tables. Returns 0 on success. */ @@ -1212,6 +1220,8 @@ static void free_tid_maps(struct tid_info *t) { + mtx_destroy(&t->stid_lock); + mtx_destroy(&t->atid_lock); cxgb_free_mem(t->tid_tab); } @@ -1231,11 +1241,6 @@ rw_wunlock(&adapter_list_lock); } -/* - * XXX - */ -#define t3_free_l2t(...) - int cxgb_offload_activate(struct adapter *adapter) { @@ -1269,8 +1274,6 @@ device_printf(adapter->dev, "%s: t3_init_l2t failed\n", __FUNCTION__); goto out_free; } - - natids = min(tid_range.num / 2, MAX_ATIDS); err = init_tid_tabs(&t->tid_maps, tid_range.num, natids, stid_range.num, ATID_BASE, stid_range.base); @@ -1334,6 +1337,7 @@ T3C_DATA(tdev) = NULL; t3_free_l2t(L2DATA(tdev)); L2DATA(tdev) = NULL; + mtx_destroy(&t->tid_release_lock); free(t, M_CXGB); } @@ -1402,7 +1406,7 @@ TAILQ_INIT(&ofld_dev_list); TAILQ_INIT(&adapter_list); - for (i = 0; i < NUM_CPL_CMDS; ++i) + for (i = 0; i < 0x100; ++i) cpl_handlers[i] = do_bad_cpl; t3_register_cpl_handler(CPL_SMT_WRITE_RPL, do_smt_write_rpl); @@ -1429,7 +1433,9 @@ t3_register_cpl_handler(CPL_RX_DATA_DDP, do_hwtid_rpl); t3_register_cpl_handler(CPL_RX_DDP_COMPLETE, do_hwtid_rpl); t3_register_cpl_handler(CPL_ISCSI_HDR, do_hwtid_rpl); - + t3_register_cpl_handler(CPL_GET_TCB_RPL, do_hwtid_rpl); + t3_register_cpl_handler(CPL_SET_TCB_RPL, do_hwtid_rpl); + EVENTHANDLER_REGISTER(route_arp_update_event, cxgb_arp_update_event, NULL, EVENTHANDLER_PRI_ANY); EVENTHANDLER_REGISTER(route_redirect_event, cxgb_redirect_event, @@ -1456,4 +1462,3 @@ } MODULE_VERSION(if_cxgb, 1); - ==== //depot/projects/iwarp/sys/dev/cxgb/cxgb_sge.c#10 (text+ko) ==== @@ -2743,18 +2743,24 @@ rspq->async_notif++; goto skip; } else if (flags & F_RSPD_IMM_DATA_VALID) { - if (cxgb_debug) - printf("IMM DATA VALID opcode=0x%x rspq->cidx=%d\n", r->rss_hdr.opcode, rspq->cidx); - if(get_imm_packet(adap, r, rspq->rspq_mh.mh_head) == 0) { + struct mbuf *m = NULL; + + DPRINTF("IMM DATA VALID opcode=0x%x rspq->cidx=%d\n", + r->rss_hdr.opcode, rspq->cidx); + if (rspq->rspq_mh.mh_head == NULL) + rspq->rspq_mh.mh_head = m_gethdr(M_DONTWAIT, MT_DATA); + else + m = m_gethdr(M_DONTWAIT, MT_DATA); + + if (rspq->rspq_mh.mh_head == NULL && m == NULL) { no_mem: rspq->next_holdoff = NOMEM_INTR_DELAY; budget_left--; break; - } else { - eop = 1; } - goto skip; - + get_imm_packet(adap, r, rspq->rspq_mh.mh_head); + eop = 1; + rspq->imm_data++; } else if (r->len_cq) { int drop_thresh = eth ? SGE_RX_DROP_THRES : 0; ==== //depot/projects/iwarp/sys/modules/cxgb/cxgb/Makefile#5 (text+ko) ==== @@ -13,8 +13,7 @@ CFLAGS+= -DCONFIG_CHELSIO_T3_CORE -g -DCONFIG_DEFINED -DDEFAULT_JUMBO -I${CXGB} -DSMP CFLAGS+= -DDISABLE_MBUF_IOVEC -CFLAGS+= -DIFNET_MULTIQUEUE - +#CFLAGS+= -DIFNET_MULTIQUEUE #CFLAGS+= -DDISABLE_MBUF_IOVEC #CFLAGS+= -DDEBUG -DDEBUG_PRINT #CFLAGS+= -DINVARIANT_SUPPORT -DINVARIANTS