Module Name:    src
Committed By:   yamaguchi
Date:           Tue Feb 25 07:50:25 UTC 2020

Modified Files:
        src/sys/dev/pci: if_ixl.c

Log Message:
Disable all queues before waiting for the completion
on each queue to reduce the number of delays

pointed out and reviewed by knakahara@n.o., thanks


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/dev/pci/if_ixl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_ixl.c
diff -u src/sys/dev/pci/if_ixl.c:1.51 src/sys/dev/pci/if_ixl.c:1.52
--- src/sys/dev/pci/if_ixl.c:1.51	Tue Feb 25 07:45:28 2020
+++ src/sys/dev/pci/if_ixl.c	Tue Feb 25 07:50:25 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ixl.c,v 1.51 2020/02/25 07:45:28 yamaguchi Exp $	*/
+/*	$NetBSD: if_ixl.c,v 1.52 2020/02/25 07:50:25 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ixl.c,v 1.51 2020/02/25 07:45:28 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ixl.c,v 1.52 2020/02/25 07:50:25 yamaguchi Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -2257,17 +2257,39 @@ ixl_stop_locked(struct ixl_softc *sc)
 
 		mutex_enter(&txr->txr_lock);
 		ixl_txr_qdis(sc, txr, 0);
-		/* XXX wait at least 400 usec for all tx queues in one go */
-		ixl_flush(sc);
-		DELAY(500);
+		mutex_exit(&txr->txr_lock);
+	}
+
+	/* XXX wait at least 400 usec for all tx queues in one go */
+	ixl_flush(sc);
+	DELAY(500);
+
+	for (i = 0; i < sc->sc_nqueue_pairs; i++) {
+		txr = sc->sc_qps[i].qp_txr;
+		rxr = sc->sc_qps[i].qp_rxr;
 
+		mutex_enter(&txr->txr_lock);
 		reg = ixl_rd(sc, I40E_QTX_ENA(i));
 		CLR(reg, I40E_QTX_ENA_QENA_REQ_MASK);
 		ixl_wr(sc, I40E_QTX_ENA(i), reg);
-		/* XXX wait 50ms from completaion of the TX queue disable*/
-		ixl_flush(sc);
-		DELAY(50);
+		mutex_exit(&txr->txr_lock);
+
+		mutex_enter(&rxr->rxr_lock);
+		reg = ixl_rd(sc, I40E_QRX_ENA(i));
+		CLR(reg, I40E_QRX_ENA_QENA_REQ_MASK);
+		ixl_wr(sc, I40E_QRX_ENA(i), reg);
+		mutex_exit(&rxr->rxr_lock);
+	}
+
+	/* XXX short wait for all queue disables to settle */
+	ixl_flush(sc);
+	DELAY(50);
+
+	for (i = 0; i < sc->sc_nqueue_pairs; i++) {
+		txr = sc->sc_qps[i].qp_txr;
+		rxr = sc->sc_qps[i].qp_rxr;
 
+		mutex_enter(&txr->txr_lock);
 		if (ixl_txr_disabled(sc, txr) != 0) {
 			mutex_exit(&txr->txr_lock);
 			goto die;
@@ -2275,13 +2297,6 @@ ixl_stop_locked(struct ixl_softc *sc)
 		mutex_exit(&txr->txr_lock);
 
 		mutex_enter(&rxr->rxr_lock);
-		reg = ixl_rd(sc, I40E_QRX_ENA(i));
-		CLR(reg, I40E_QRX_ENA_QENA_REQ_MASK);
-		ixl_wr(sc, I40E_QRX_ENA(i), reg);
-		/* XXX wait 50ms from completion of the RX queue disable */
-		ixl_flush(sc);
-		DELAY(50);
-
 		if (ixl_rxr_disabled(sc, rxr) != 0) {
 			mutex_exit(&rxr->rxr_lock);
 			goto die;

Reply via email to