svn commit: r205720 - in head/sys: dev/ixgbe modules/ixgbe
Max Laier
max at love2party.net
Sun Mar 28 23:03:40 UTC 2010
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
More information about the svn-src-all
mailing list