From owner-svn-src-all@FreeBSD.ORG Sun Mar 28 23:03:40 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B88431065670 for ; Sun, 28 Mar 2010 23:03:40 +0000 (UTC) (envelope-from max@love2party.net) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.171]) by mx1.freebsd.org (Postfix) with ESMTP id 641118FC13 for ; Sun, 28 Mar 2010 23:03:40 +0000 (UTC) Received: from vampire.homelinux.org (dslb-088-066-054-138.pools.arcor-ip.net [88.66.54.138]) by mrelayeu.kundenserver.de (node=mreu0) with ESMTP (Nemesis) id 0M9tPw-1Nkzy62ysq-00BZzs; Mon, 29 Mar 2010 01:03:38 +0200 Received: (qmail 72763 invoked from network); 28 Mar 2010 23:03:38 -0000 Received: from f8x64.laiers.local (192.168.4.188) by mx.laiers.local with SMTP; 28 Mar 2010 23:03:38 -0000 From: Max Laier Organization: FreeBSD To: Jack F Vogel Date: Mon, 29 Mar 2010 01:03:37 +0200 User-Agent: KMail/1.12.4 (FreeBSD/8.0-RELEASE-p2; KDE/4.3.5; amd64; ; ) References: <201003270021.o2R0LebO003969@svn.freebsd.org> In-Reply-To: <201003270021.o2R0LebO003969@svn.freebsd.org> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <201003290103.37621.max@love2party.net> X-Provags-ID: V01U2FsdGVkX18cZ7O/XibI94erlaGpzJTbgCn4RKwmPHRu5VJ 9plFLK/JwQ4nDKONnzwU2zGdK5rKH5bTB70tT+BEu8HCvQzjr0 h9LJHxgq11sfrVk/40jgg== Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r205720 - in head/sys: dev/ixgbe modules/ixgbe X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Mar 2010 23:03:40 -0000 On Saturday 27 March 2010 01:21:40 Jack F Vogel wrote: > Author: jfv > Date: Sat Mar 27 00:21:40 2010 > New Revision: 205720 > URL: http://svn.freebsd.org/changeset/base/205720 > > Log: > Update the driver to Intel version 2.1.6 > - add some new hardware support for 82599 > - Big change to interrupt architecture, it now > uses a queue which contains an RX/TX pair as > the recipient of the interrupt. This will reduce > overall system interrupts/msix usage. > - Improved RX mbuf handling: the old get_buf routine > is no longer synchronized with rxeof, this allows > the elimination of packet discards due to mbuf > allocation failure. > - Much simplified and improved AIM code, it now > happens in the queue interrupt context and takes > into account both the traffic on the RX AND TX > side. > - variety of small tweaks, like ring size, that have > been seen as performance improvements. > - Thanks to those that provided feedback or suggested > changes, I hope I've caught all of them. This seems to introduce the same error in drbr handling that I just fixed for e1000 & friend - c.f. r203834. This results in ALTQ not working on these interfaces. Let me know if you have any questions, more details in-line. > Modified: head/sys/dev/ixgbe/ixgbe.c > =========================================================================== > === --- head/sys/dev/ixgbe/ixgbe.c Fri Mar 26 23:44:51 2010 (r205719) > +++ head/sys/dev/ixgbe/ixgbe.c Sat Mar 27 00:21:40 2010 (r205720) ... > @@ -849,59 +817,43 @@ ixgbe_mq_start_locked(struct ifnet *ifp, > { > struct adapter *adapter = txr->adapter; > struct mbuf *next; > - int err = 0; > + int enqueued, err = 0; > > - if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) || > - (!adapter->link_active)) { > - err = drbr_enqueue(ifp, txr->br, m); > + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != > + IFF_DRV_RUNNING || adapter->link_active == 0) { > + if (m != NULL) > + err = drbr_enqueue(ifp, txr->br, m); > return (err); > } > > - if (m == NULL) /* Called by tasklet */ > - goto process; > - > - /* If nothing queued go right to xmit */ > - if (!drbr_needs_enqueue(ifp, txr->br)) { > - if ((err = ixgbe_xmit(txr, &m)) != 0) { > - if (m != NULL) > - err = drbr_enqueue(ifp, txr->br, m); > - return (err); > - } else { > - /* Success, update stats */ > - drbr_stats_update(ifp, m->m_pkthdr.len, m->m_flags); > - /* Send a copy of the frame to the BPF listener */ > - ETHER_BPF_MTAP(ifp, m); > - /* Set the watchdog */ > - txr->watchdog_check = TRUE; > - } > - > - } else if ((err = drbr_enqueue(ifp, txr->br, m)) != 0) > - return (err); > - > -process: > - if (drbr_empty(ifp, txr->br)) > - return (err); > + enqueued = 0; > + if (m == NULL) > + next = drbr_dequeue(ifp, txr->br); > + else > + next = m; The new start_locked logic looks like the old igb. An adaption of my diff: http://svn.freebsd.org/viewvc/base/head/sys/dev/e1000/if_igb.c?r1=203834&r2=203833&pathrev=203834 should make things work. > /* Process the queue */ > - while (TRUE) { > - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) > - break; > - next = drbr_dequeue(ifp, txr->br); > - if (next == NULL) > - break; > + while (next != NULL) { > if ((err = ixgbe_xmit(txr, &next)) != 0) { > if (next != NULL) > err = drbr_enqueue(ifp, txr->br, next); > break; > } > + enqueued++; > drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); > + /* Send a copy of the frame to the BPF listener */ > ETHER_BPF_MTAP(ifp, next); > - /* Set the watchdog */ > - txr->watchdog_check = TRUE; > + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) > + break; > + if (txr->tx_avail <= IXGBE_TX_OP_THRESHOLD) { > + ifp->if_drv_flags |= IFF_DRV_OACTIVE; > + break; > + } > + next = drbr_dequeue(ifp, txr->br); > } > - > - if (txr->tx_avail <= IXGBE_TX_OP_THRESHOLD) > - ifp->if_drv_flags |= IFF_DRV_OACTIVE; > + > + if (enqueued > 0) > + txr->watchdog_check = TRUE; > > return (err); > } Regards, Max