A small fix for if_em.c, if_igb.c, if_ixgbe.c
Michael Tuexen
Michael.Tuexen at lurchi.franken.de
Mon Dec 2 21:44:49 UTC 2013
On Dec 2, 2013, at 10:06 PM, Randall Stewart <rrs at lakerest.net> wrote:
> Michael:
>
>
> Looking at this patch (as I apply it to my world), I think
> you can just take the
>
>> - if ((err = igb_xmit(txr, &next)) != 0) {
>> + if (igb_xmit(txr, &next) != 0) {
>
> Type lines
>
> and leave the
>
> return(err)
>
> since err will get set to 0 by the drbr_enqueue() and return the proper response to the
> transport above sending the packet.
True. Just thought this is clearer... But the patch is not minimal, you are right.
Best regards
Michael
>
> R
> On Nov 29, 2013, at 12:24 PM, Michael Tuexen wrote:
>
>> Dear all,
>>
>> ifnet(9) says regarding if_transmit():
>>
>> Transmit a packet on an interface or queue it if the interface is
>> in use. This function will return ENOBUFS if the devices software
>> and hardware queues are both full.
>>
>> The drivers for em, igb and ixgbe might also return an error even
>> in the case the packet was enqueued. The attached patches fix this
>> issue.
>>
>> Any comments?
>>
>> Jack: What do you think? Would you prefer to commit the fix if
>> you think it is acceptable?
>>
>> Best regards
>> Michael
>>
>>
>> [bsd5:~/head/sys/dev] tuexen% svn diff -x -p
>> Index: e1000/if_em.c
>> ===================================================================
>> --- e1000/if_em.c (revision 258746)
>> +++ e1000/if_em.c (working copy)
>> @@ -930,7 +930,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri
>>
>> /* Process the queue */
>> while ((next = drbr_peek(ifp, txr->br)) != NULL) {
>> - if ((err = em_xmit(txr, &next)) != 0) {
>> + if (em_xmit(txr, &next) != 0) {
>> if (next == NULL)
>> drbr_advance(ifp, txr->br);
>> else
>> @@ -957,7 +957,7 @@ em_mq_start_locked(struct ifnet *ifp, struct tx_ri
>> em_txeof(txr);
>> if (txr->tx_avail < EM_MAX_SCATTER)
>> ifp->if_drv_flags |= IFF_DRV_OACTIVE;
>> - return (err);
>> + return (0);
>> }
>>
>> /*
>> Index: e1000/if_igb.c
>> ===================================================================
>> --- e1000/if_igb.c (revision 258746)
>> +++ e1000/if_igb.c (working copy)
>> @@ -192,7 +192,7 @@ static int igb_suspend(device_t);
>> static int igb_resume(device_t);
>> #ifndef IGB_LEGACY_TX
>> static int igb_mq_start(struct ifnet *, struct mbuf *);
>> -static int igb_mq_start_locked(struct ifnet *, struct tx_ring *);
>> +static void igb_mq_start_locked(struct ifnet *, struct tx_ring *);
>> static void igb_qflush(struct ifnet *);
>> static void igb_deferred_mq_start(void *, int);
>> #else
>> @@ -989,31 +989,31 @@ igb_mq_start(struct ifnet *ifp, struct mbuf *m)
>> if (err)
>> return (err);
>> if (IGB_TX_TRYLOCK(txr)) {
>> - err = igb_mq_start_locked(ifp, txr);
>> + igb_mq_start_locked(ifp, txr);
>> IGB_TX_UNLOCK(txr);
>> } else
>> taskqueue_enqueue(que->tq, &txr->txq_task);
>>
>> - return (err);
>> + return (0);
>> }
>>
>> -static int
>> +static void
>> igb_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
>> {
>> struct adapter *adapter = txr->adapter;
>> struct mbuf *next;
>> - int err = 0, enq = 0;
>> + int enq = 0;
>>
>> IGB_TX_LOCK_ASSERT(txr);
>>
>> if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
>> adapter->link_active == 0)
>> - return (ENETDOWN);
>> + return;
>>
>>
>> /* Process the queue */
>> while ((next = drbr_peek(ifp, txr->br)) != NULL) {
>> - if ((err = igb_xmit(txr, &next)) != 0) {
>> + if (igb_xmit(txr, &next) != 0) {
>> if (next == NULL) {
>> /* It was freed, move forward */
>> drbr_advance(ifp, txr->br);
>> @@ -1045,7 +1045,7 @@ igb_mq_start_locked(struct ifnet *ifp, struct tx_r
>> igb_txeof(txr);
>> if (txr->tx_avail <= IGB_MAX_SCATTER)
>> txr->queue_status |= IGB_QUEUE_DEPLETED;
>> - return (err);
>> + return;
>> }
>>
>> /*
>> Index: ixgbe/ixgbe.c
>> ===================================================================
>> --- ixgbe/ixgbe.c (revision 258746)
>> +++ ixgbe/ixgbe.c (working copy)
>> @@ -107,7 +107,7 @@ static void ixgbe_start(struct ifnet *);
>> static void ixgbe_start_locked(struct tx_ring *, struct ifnet *);
>> #else /* ! IXGBE_LEGACY_TX */
>> static int ixgbe_mq_start(struct ifnet *, struct mbuf *);
>> -static int ixgbe_mq_start_locked(struct ifnet *, struct tx_ring *);
>> +static void ixgbe_mq_start_locked(struct ifnet *, struct tx_ring *);
>> static void ixgbe_qflush(struct ifnet *);
>> static void ixgbe_deferred_mq_start(void *, int);
>> #endif /* IXGBE_LEGACY_TX */
>> @@ -831,35 +831,35 @@ ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
>> if (err)
>> return (err);
>> if (IXGBE_TX_TRYLOCK(txr)) {
>> - err = ixgbe_mq_start_locked(ifp, txr);
>> + ixgbe_mq_start_locked(ifp, txr);
>> IXGBE_TX_UNLOCK(txr);
>> } else
>> taskqueue_enqueue(que->tq, &txr->txq_task);
>>
>> - return (err);
>> + return (0);
>> }
>>
>> -static int
>> +static void
>> ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
>> {
>> struct adapter *adapter = txr->adapter;
>> struct mbuf *next;
>> - int enqueued = 0, err = 0;
>> + int enqueued = 0;
>>
>> if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) ||
>> adapter->link_active == 0)
>> - return (ENETDOWN);
>> + return;
>>
>> /* Process the queue */
>> #if __FreeBSD_version < 901504
>> next = drbr_dequeue(ifp, txr->br);
>> while (next != NULL) {
>> - if ((err = ixgbe_xmit(txr, &next)) != 0) {
>> + if (ixgbe_xmit(txr, &next) != 0) {
>> if (next != NULL)
>> - err = drbr_enqueue(ifp, txr->br, next);
>> + drbr_enqueue(ifp, txr->br, next);
>> #else
>> while ((next = drbr_peek(ifp, txr->br)) != NULL) {
>> - if ((err = ixgbe_xmit(txr, &next)) != 0) {
>> + if (ixgbe_xmit(txr, &next) != 0) {
>> if (next == NULL) {
>> drbr_advance(ifp, txr->br);
>> } else {
>> @@ -890,7 +890,7 @@ ixgbe_mq_start_locked(struct ifnet *ifp, struct tx
>> if (txr->tx_avail < IXGBE_TX_CLEANUP_THRESHOLD)
>> ixgbe_txeof(txr);
>>
>> - return (err);
>> + return;
>> }
>>
>> /*
>>
>> _______________________________________________
>> 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"
>>
>
> ------------------------------
> Randall Stewart
> 803-317-4952 (cell)
>
>
More information about the freebsd-net
mailing list