em driver, 82574L chip, and possibly ASPM

Sean Bruno seanbru at yahoo-inc.com
Fri Feb 4 19:22:09 UTC 2011


meh, patience is not one of my character traits.  :-)

Sean

On Fri, 2011-02-04 at 10:12 -0800, Jack Vogel wrote:
> Was curious too, but being more patient than you :)
> 
> Jack
> 
> 
> On Fri, Feb 4, 2011 at 10:09 AM, Sean Bruno <seanbru at yahoo-inc.com>
> wrote:
>         Any more data on this problem or do we have to wait a while?
>         
>         Sean
>         
>         
>         
>         On Wed, 2011-02-02 at 10:28 -0800, Mike Tancsa wrote:
>         > On 2/2/2011 12:37 PM, Jack Vogel wrote:
>         > > So has everyone that wanted to get something  testing been
>         able to do so?
>         >
>         > I have been testing in the back and will deploy to my
>         production box
>         > this afternoon.  As I am not able to reproduce it easily, it
>         will be a
>         > bit before I can say the issue is gone.  Jan however, was
>         able to
>         > trigger it with greater ease ?
>         >
>         >         ---Mike
>         >
>         > >
>         > > Jack
>         > >
>         > >
>         > > On Tue, Feb 1, 2011 at 7:03 PM, Mike Tancsa
>         <mike at sentex.net> wrote:
>         > >
>         > >> On 2/1/2011 5:03 PM, Sean Bruno wrote:
>         > >>> On Tue, 2011-02-01 at 13:43 -0800, Jack Vogel wrote:
>         > >>>> To those who are going to test, here is the if_em.c,
>         based on head,
>         > >>>> with my
>         > >>>> changes, I have to leave for the afternoon, and have
>         not had a chance
>         > >>>> to build
>         > >>>> this, but it should work. I will check back in the
>         later evening.
>         > >>>>
>         > >>>> Any blatant problems Sean, feel free to fix them :)
>         > >>>>
>         > >>>> Jack
>         > >>>>
>         > >>>
>         > >>>
>         > >>> I suspect that line 1490 should be:
>         > >>>               if (more_rx || (ifp->if_drv_flags &
>         IFF_DRV_OACTIVE)) {
>         > >>>
>         > >>
>         > >>
>         > >> I have hacked up a RELENG_8 version which I think is
>         correct including
>         > >> the above change
>         > >>
>         > >> http://www.tancsa.com/if_em-8.c
>         > >>
>         > >>
>         > >>
>         > >> --- if_em.c.orig        2011-02-01 21:47:14.000000000
>         -0500
>         > >> +++ if_em.c     2011-02-01 21:47:19.000000000 -0500
>         > >> @@ -30,7 +30,7 @@
>         > >>   POSSIBILITY OF SUCH DAMAGE.
>         > >>
>         > >>
>         > >>
>          ******************************************************************************/
>         > >> -/*$FreeBSD: src/sys/dev/e1000/if_em.c,v 1.21.2.20
>         2011/01/22 01:37:53
>         > >> jfv Exp $*/
>         > >> +/*$FreeBSD$*/
>         > >>
>         > >>  #ifdef HAVE_KERNEL_OPTION_HEADERS
>         > >>  #include "opt_device_polling.h"
>         > >> @@ -93,7 +93,7 @@
>         > >>
>          /*********************************************************************
>         > >>  *  Driver version:
>         > >>
>          *********************************************************************/
>         > >> -char em_driver_version[] = "7.1.9";
>         > >> +char em_driver_version[] = "7.1.9-test";
>         > >>
>         > >>
>          /*********************************************************************
>         > >>  *  PCI Device ID Table
>         > >> @@ -927,11 +927,10 @@
>         > >>        if (!adapter->link_active)
>         > >>                return;
>         > >>
>         > >> -        /* Call cleanup if number of TX descriptors low
>         */
>         > >> -       if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD)
>         > >> -               em_txeof(txr);
>         > >> -
>         > >>        while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
>         > >> +               /* First cleanup if TX descriptors low */
>         > >> +               if (txr->tx_avail <=
>         EM_TX_CLEANUP_THRESHOLD)
>         > >> +                       em_txeof(txr);
>         > >>                if (txr->tx_avail < EM_MAX_SCATTER) {
>         > >>                        ifp->if_drv_flags |=
>         IFF_DRV_OACTIVE;
>         > >>                        break;
>         > >> @@ -1411,8 +1410,7 @@
>         > >>        if (!drbr_empty(ifp, txr->br))
>         > >>                em_mq_start_locked(ifp, txr, NULL);
>         > >>  #else
>         > >> -       if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>         > >> -               em_start_locked(ifp, txr);
>         > >> +       em_start_locked(ifp, txr);
>         > >>  #endif
>         > >>        EM_TX_UNLOCK(txr);
>         > >>
>         > >> @@ -1475,11 +1473,10 @@
>         > >>        struct ifnet    *ifp = adapter->ifp;
>         > >>        struct tx_ring  *txr = adapter->tx_rings;
>         > >>        struct rx_ring  *rxr = adapter->rx_rings;
>         > >> -       bool            more;
>         > >> -
>         > >>
>         > >>        if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
>         > >> -               more = em_rxeof(rxr,
>         adapter->rx_process_limit, NULL);
>         > >> +               bool    more_rx;
>         > >> +               more_rx = em_rxeof(rxr,
>         adapter->rx_process_limit, NULL);
>         > >>
>         > >>                EM_TX_LOCK(txr);
>         > >>                em_txeof(txr);
>         > >> @@ -1487,12 +1484,10 @@
>         > >>                if (!drbr_empty(ifp, txr->br))
>         > >>                        em_mq_start_locked(ifp, txr,
>         NULL);
>         > >>  #else
>         > >> -               if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>         > >> -                       em_start_locked(ifp, txr);
>         > >> +               em_start_locked(ifp, txr);
>         > >>  #endif
>         > >> -               em_txeof(txr);
>         > >>                EM_TX_UNLOCK(txr);
>         > >> -               if (more) {
>         > >> +               if (more_rx || (ifp->if_drv_flags &
>         IFF_DRV_OACTIVE)) {
>         > >>                        taskqueue_enqueue(adapter->tq,
>         &adapter->que_task);
>         > >>                        return;
>         > >>                }
>         > >> @@ -1604,7 +1599,6 @@
>         > >>        if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>         > >>                em_start_locked(ifp, txr);
>         > >>  #endif
>         > >> -       em_txeof(txr);
>         > >>        E1000_WRITE_REG(&adapter->hw, E1000_IMS,
>         txr->ims);
>         > >>        EM_TX_UNLOCK(txr);
>         > >>  }
>         > >> @@ -3730,17 +3724,17 @@
>         > >>                txr->queue_status = EM_QUEUE_HUNG;
>         > >>
>         > >>         /*
>         > >> -         * If we have enough room, clear IFF_DRV_OACTIVE
>         > >> +         * If we have a minimum free, clear
>         IFF_DRV_OACTIVE
>         > >>          * to tell the stack that it is OK to send
>         packets.
>         > >>          */
>         > >> -        if (txr->tx_avail > EM_TX_CLEANUP_THRESHOLD) {
>         > >> +        if (txr->tx_avail > EM_MAX_SCATTER)
>         > >>                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
>         > >> -               /* Disable watchdog if all clean */
>         > >> -                if (txr->tx_avail ==
>         adapter->num_tx_desc) {
>         > >> -                       txr->queue_status =
>         EM_QUEUE_IDLE;
>         > >> -                       return (FALSE);
>         > >> -               }
>         > >> -        }
>         > >> +
>         > >> +       /* Disable watchdog if all clean */
>         > >> +       if (txr->tx_avail == adapter->num_tx_desc) {
>         > >> +               txr->queue_status = EM_QUEUE_IDLE;
>         > >> +               return (FALSE);
>         > >> +       }
>         > >>
>         > >>        return (TRUE);
>         > >>  }
>         > >> @@ -5064,8 +5058,8 @@
>         > >>        char namebuf[QUEUE_NAME_LEN];
>         > >>
>         > >>        /* Driver Statistics */
>         > >> -       SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "link_irq",
>         > >> -                       CTLFLAG_RD, &adapter->link_irq,
>         0,
>         > >> +       SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "link_irq",
>         > >> +                       CTLFLAG_RD, &adapter->link_irq,0,
>         > >>                        "Link MSIX IRQ Handled");
>         > >>        SYSCTL_ADD_ULONG(ctx, child, OID_AUTO,
>         "mbuf_alloc_fail",
>         > >>                         CTLFLAG_RD,
>         &adapter->mbuf_alloc_failed,
>         > >> @@ -5108,11 +5102,13 @@
>         > >>                queue_list = SYSCTL_CHILDREN(queue_node);
>         > >>
>         > >>                SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO,
>         "txd_head",
>         > >> -                               CTLFLAG_RD, adapter,
>         E1000_TDH(txr->me),
>         > >> +                               CTLFLAG_RD, adapter,
>         > >> +                               E1000_TDH(txr->me),
>         > >>                                em_sysctl_reg_handler,
>         "IU",
>         > >>                                "Transmit Descriptor
>         Head");
>         > >>                SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO,
>         "txd_tail",
>         > >> -                               CTLFLAG_RD, adapter,
>         E1000_TDT(txr->me),
>         > >> +                               CTLFLAG_RD, adapter,
>         > >> +                               E1000_TDT(txr->me),
>         > >>                                em_sysctl_reg_handler,
>         "IU",
>         > >>                                "Transmit Descriptor
>         Tail");
>         > >>                SYSCTL_ADD_ULONG(ctx, queue_list,
>         OID_AUTO, "tx_irq",
>         > >> @@ -5123,11 +5119,13 @@
>         > >>                                "Queue No Descriptor
>         Available");
>         > >>
>         > >>                SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO,
>         "rxd_head",
>         > >> -                               CTLFLAG_RD, adapter,
>         E1000_RDH(rxr->me),
>         > >> +                               CTLFLAG_RD, adapter,
>         > >> +                               E1000_RDH(rxr->me),
>         > >>                                em_sysctl_reg_handler,
>         "IU",
>         > >>                                "Receive Descriptor
>         Head");
>         > >>                SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO,
>         "rxd_tail",
>         > >> -                               CTLFLAG_RD, adapter,
>         E1000_RDT(rxr->me),
>         > >> +                               CTLFLAG_RD, adapter,
>         > >> +                               E1000_RDT(rxr->me),
>         > >>                                em_sysctl_reg_handler,
>         "IU",
>         > >>                                "Receive Descriptor
>         Tail");
>         > >>                SYSCTL_ADD_ULONG(ctx, queue_list,
>         OID_AUTO, "rx_irq",
>         > >> @@ -5141,19 +5139,19 @@
>         > >>                                    CTLFLAG_RD, NULL,
>         "Statistics");
>         > >>        stat_list = SYSCTL_CHILDREN(stat_node);
>         > >>
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "excess_coll",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "excess_coll",
>         > >>                        CTLFLAG_RD, &stats->ecol,
>         > >>                        "Excessive collisions");
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "single_coll",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "single_coll",
>         > >>                        CTLFLAG_RD, &stats->scc,
>         > >>                        "Single collisions");
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "multiple_coll",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "multiple_coll",
>         > >>                        CTLFLAG_RD, &stats->mcc,
>         > >>                        "Multiple collisions");
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "late_coll",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "late_coll",
>         > >>                        CTLFLAG_RD, &stats->latecol,
>         > >>                        "Late collisions");
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "collision_count",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "collision_count",
>         > >>                        CTLFLAG_RD, &stats->colc,
>         > >>                        "Collision Count");
>         > >>        SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "symbol_errors",
>         > >> @@ -5240,12 +5238,12 @@
>         > >>        SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "rx_frames_1024_1522",
>         > >>                        CTLFLAG_RD,
>         &adapter->stats.prc1522,
>         > >>                        "1023-1522 byte frames received");
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "good_octets_recvd",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "good_octets_recvd",
>         > >>                        CTLFLAG_RD, &adapter->stats.gorc,
>         > >>                        "Good Octets Received");
>         > >>
>         > >>        /* Packet Transmission Stats */
>         > >> -       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "good_octets_txd",
>         > >> +       SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "good_octets_txd",
>         > >>                        CTLFLAG_RD, &adapter->stats.gotc,
>         > >>                        "Good Octets Transmitted");
>         > >>        SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO,
>         "total_pkts_txd",
>         > >>
>         > >> --
>         > >> -------------------
>         > >> Mike Tancsa, tel +1 519 651 3400
>         > >> Sentex Communications, mike at sentex.net
>         > >> Providing Internet services since 1994 www.sentex.net
>         > >> Cambridge, Ontario Canada   http://www.tancsa.com/
>         > >>
>         > >
>         >
>         >
>         > --
>         > -------------------
>         > Mike Tancsa, tel +1 519 651 3400
>         > Sentex Communications, mike at sentex.net
>         > Providing Internet services since 1994 www.sentex.net
>         > Cambridge, Ontario Canada   http://www.tancsa.com/
>         
>         
>         > _______________________________________________
>         > freebsd-net at freebsd.org mailing list
>         > http://lists.freebsd.org/mailman/listinfo/freebsd-net
>         > To unsubscribe, send any mail to
>         "freebsd-net-unsubscribe at freebsd.org"
>         
>         
>         
> 




More information about the freebsd-net mailing list