Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Nov 2019 23:29:58 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r354496 - head/sys/dev/iwm
Message-ID:  <201911072329.xA7NTw4f067901@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Thu Nov  7 23:29:57 2019
New Revision: 354496
URL: https://svnweb.freebsd.org/changeset/base/354496

Log:
  iwm: Avoid calling iwm_start() each time a descriptor is reclaimed.
  
  Only perform the call when a qfull bit transitions.  While here, avoid
  assignments in declarations in iwm_mvm_rx_tx_cmd().
  
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/dev/iwm/if_iwm.c

Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c	Thu Nov  7 23:29:43 2019	(r354495)
+++ head/sys/dev/iwm/if_iwm.c	Thu Nov  7 23:29:57 2019	(r354496)
@@ -3337,15 +3337,22 @@ iwm_mvm_rx_tx_cmd_single(struct iwm_softc *sc, struct 
 static void
 iwm_mvm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_packet *pkt)
 {
-	struct iwm_cmd_header *cmd_hdr = &pkt->hdr;
-	int idx = cmd_hdr->idx;
-	int qid = cmd_hdr->qid;
-	struct iwm_tx_ring *ring = &sc->txq[qid];
-	struct iwm_tx_data *txd = &ring->data[idx];
-	struct iwm_node *in = txd->in;
-	struct mbuf *m = txd->m;
-	int status;
+	struct iwm_cmd_header *cmd_hdr;
+	struct iwm_tx_ring *ring;
+	struct iwm_tx_data *txd;
+	struct iwm_node *in;
+	struct mbuf *m;
+	int idx, qid, qmsk, status;
 
+	cmd_hdr = &pkt->hdr;
+	idx = cmd_hdr->idx;
+	qid = cmd_hdr->qid;
+
+	ring = &sc->txq[qid];
+	txd = &ring->data[idx];
+	in = txd->in;
+	m = txd->m;
+
 	KASSERT(txd->done == 0, ("txd not done"));
 	KASSERT(txd->in != NULL, ("txd without node"));
 	KASSERT(txd->m != NULL, ("txd without mbuf"));
@@ -3366,11 +3373,11 @@ iwm_mvm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_rx_
 
 	ieee80211_tx_complete(&in->in_ni, m, status);
 
-	if (--ring->queued < IWM_TX_RING_LOMARK) {
-		sc->qfullmsk &= ~(1 << ring->qid);
-		if (sc->qfullmsk == 0) {
+	qmsk = 1 << qid;
+	if (--ring->queued < IWM_TX_RING_LOMARK && (sc->qfullmsk & qmsk) != 0) {
+		sc->qfullmsk &= ~qmsk;
+		if (sc->qfullmsk == 0)
 			iwm_start(sc);
-		}
 	}
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201911072329.xA7NTw4f067901>