ionic: clean tx queue of unfinished requests
authorShannon Nelson <snelson@pensando.io>
Sat, 28 Mar 2020 03:14:45 +0000 (20:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 18:40:50 +0000 (11:40 -0700)
Clean out tx requests that didn't get finished before
shutting down the queue.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_txrx.c
drivers/net/ethernet/pensando/ionic/ionic_txrx.h

index fb62d78..bab471b 100644 (file)
@@ -1454,6 +1454,7 @@ static void ionic_txrx_deinit(struct ionic_lif *lif)
        for (i = 0; i < lif->nxqs; i++) {
                ionic_lif_qcq_deinit(lif, lif->txqcqs[i].qcq);
                ionic_tx_flush(&lif->txqcqs[i].qcq->cq);
+               ionic_tx_empty(&lif->txqcqs[i].qcq->q);
 
                ionic_lif_qcq_deinit(lif, lif->rxqcqs[i].qcq);
                ionic_rx_flush(&lif->rxqcqs[i].qcq->cq);
index 15ff633..d233b6e 100644 (file)
@@ -593,6 +593,22 @@ void ionic_tx_flush(struct ionic_cq *cq)
                                   work_done, 0);
 }
 
+void ionic_tx_empty(struct ionic_queue *q)
+{
+       struct ionic_desc_info *desc_info;
+       int done = 0;
+
+       /* walk the not completed tx entries, if any */
+       while (q->head != q->tail) {
+               desc_info = q->tail;
+               q->tail = desc_info->next;
+               ionic_tx_clean(q, desc_info, NULL, desc_info->cb_arg);
+               desc_info->cb = NULL;
+               desc_info->cb_arg = NULL;
+               done++;
+       }
+}
+
 static int ionic_tx_tcp_inner_pseudo_csum(struct sk_buff *skb)
 {
        int err;
index 53775c6..71973e3 100644 (file)
@@ -9,6 +9,7 @@ void ionic_tx_flush(struct ionic_cq *cq);
 
 void ionic_rx_fill(struct ionic_queue *q);
 void ionic_rx_empty(struct ionic_queue *q);
+void ionic_tx_empty(struct ionic_queue *q);
 int ionic_rx_napi(struct napi_struct *napi, int budget);
 netdev_tx_t ionic_start_xmit(struct sk_buff *skb, struct net_device *netdev);