A small fix for if_em.c, if_igb.c, if_ixgbe.c

Michael Tuexen Michael.Tuexen at lurchi.franken.de
Fri Nov 29 17:24:16 UTC 2013


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;
 }
 
 /*



More information about the freebsd-net mailing list