em driver, 82574L chip, and possibly ASPM
Mike Tancsa
mike at sentex.net
Sun Feb 6 23:54:05 UTC 2011
So far so good. I would often get a hang on the level zero dumps to my
backup server Sunday AM, and it made it through! So a good sign, but
not a definitive sign.
I have a PCIe em card that has this chipset as well and was showing the
same sort of problem in a customer's RELENG_7 box. I will see if I can
get the customer to try the card in their box with the patch for
RELENG_7 as it would show this issue at least once a day until I pulled
the card for an older version
---Mike
On 2/4/2011 1:12 PM, 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"
>>
>>
>>
>
--
-------------------
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/
More information about the freebsd-hardware
mailing list