> > @@ -961,7 +961,15 @@ igb_mq_start(struct ifnet *ifp, struct m > que = &adapter->queues[i]; > if (((txr->queue_status & IGB_QUEUE_DEPLETED) == 0) && > IGB_TX_TRYLOCK(txr)) { > - err = igb_mq_start_locked(ifp, txr, m); > + struct mbuf *pm = NULL; > + /* > + ** Try to queue first to avoid > + ** out-of-order delivery, but > + ** settle for it if that fails > + */ > + if (m && drbr_enqueue(ifp, txr->br, m)) > + pm = m; > + err = igb_mq_start_locked(ifp, txr, pm); > IGB_TX_UNLOCK(txr); > } else {
Why not just enqueue / start with NULL ? err = drbr_enqueue(ifp, txr->br, m); igb_mq_start_locked(ifp, txr, NULL); It seems that in case the queue is full you will send out of order with the current patch. > err = drbr_enqueue(ifp, txr->br, m); > @@ -981,7 +989,7 @@ igb_mq_start_locked(struct ifnet *ifp, s > IGB_TX_LOCK_ASSERT(txr); > > if (((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) || > - (txr->queue_status == IGB_QUEUE_DEPLETED) || > + (txr->queue_status & IGB_QUEUE_DEPLETED) || > adapter->link_active == 0) { > if (m != NULL) > err = drbr_enqueue(ifp, txr->br, m);