make sure if_transmit returns 0 if the mbuf is enqueued.

ixgbe/ixv.c still needs a similar fix but it takes a little
more restructuring of the code.

MFC after:	3 days
This commit is contained in:
Luigi Rizzo 2014-06-06 20:49:56 +00:00
parent a618ae937e
commit c7156fe92f
3 changed files with 5 additions and 6 deletions

View File

@ -989,12 +989,12 @@ igb_mq_start(struct ifnet *ifp, struct mbuf *m)
if (err) if (err)
return (err); return (err);
if (IGB_TX_TRYLOCK(txr)) { if (IGB_TX_TRYLOCK(txr)) {
err = igb_mq_start_locked(ifp, txr); igb_mq_start_locked(ifp, txr);
IGB_TX_UNLOCK(txr); IGB_TX_UNLOCK(txr);
} else } else
taskqueue_enqueue(que->tq, &txr->txq_task); taskqueue_enqueue(que->tq, &txr->txq_task);
return (err); return (0);
} }
static int static int

View File

@ -831,12 +831,12 @@ ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
if (err) if (err)
return (err); return (err);
if (IXGBE_TX_TRYLOCK(txr)) { if (IXGBE_TX_TRYLOCK(txr)) {
err = ixgbe_mq_start_locked(ifp, txr); ixgbe_mq_start_locked(ifp, txr);
IXGBE_TX_UNLOCK(txr); IXGBE_TX_UNLOCK(txr);
} else } else
taskqueue_enqueue(que->tq, &txr->txq_task); taskqueue_enqueue(que->tq, &txr->txq_task);
return (err); return (0);
} }
static int static int

View File

@ -2935,7 +2935,6 @@ vmxnet3_txq_mq_start_locked(struct vmxnet3_txqueue *txq, struct mbuf *m)
/* Assume worse case if this mbuf is the head of a chain. */ /* Assume worse case if this mbuf is the head of a chain. */
if (m->m_next != NULL && avail < VMXNET3_TX_MAXSEGS) { if (m->m_next != NULL && avail < VMXNET3_TX_MAXSEGS) {
drbr_putback(ifp, br, m); drbr_putback(ifp, br, m);
error = ENOBUFS;
break; break;
} }
@ -2958,7 +2957,7 @@ vmxnet3_txq_mq_start_locked(struct vmxnet3_txqueue *txq, struct mbuf *m)
txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT; txq->vxtxq_watchdog = VMXNET3_WATCHDOG_TIMEOUT;
} }
return (error); return (0);
} }
static int static int