All of lore.kernel.org
 help / color / mirror / Atom feed
* [ath9k-devel] [PATCH 0/2] ath10k: htt fixes
@ 2013-04-24  7:24 Michal Kazior
  2013-04-24  7:24 ` [ath9k-devel] [PATCH 1/2] ath10k: clear pending_tx[] upon tx completion Michal Kazior
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Michal Kazior @ 2013-04-24  7:24 UTC (permalink / raw)
  To: ath9k-devel

This one addresses a rare memory leak when FW
hangs leaving some HTT tx transactions unfinished.

Michal Kazior (2):
  ath10k: clear pending_tx[] upon tx completion
  ath10k: cleanup htt pending tx

 drivers/net/wireless/ath/ath10k/htt_tx.c |   28 ++++++++++++++++++++++++++++
 drivers/net/wireless/ath/ath10k/txrx.c   |    1 +
 2 files changed, 29 insertions(+)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [ath9k-devel] [PATCH 1/2] ath10k: clear pending_tx[] upon tx completion
  2013-04-24  7:24 [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Michal Kazior
@ 2013-04-24  7:24 ` Michal Kazior
  2013-04-24  7:24 ` [ath9k-devel] [PATCH 2/2] ath10k: cleanup htt pending tx Michal Kazior
  2013-04-24 11:23 ` [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Kalle Valo
  2 siblings, 0 replies; 4+ messages in thread
From: Michal Kazior @ 2013-04-24  7:24 UTC (permalink / raw)
  To: ath9k-devel

We validate the pending_tx[] upon tx completion so
it makes sense to clear the items.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/txrx.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index ea99d06..cfe3b52 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -93,6 +93,7 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt, struct sk_buff *txdesc)
 
 exit:
 	spin_lock_bh(&htt->tx_lock);
+	htt->pending_tx[ATH10K_SKB_CB(txdesc)->htt.msdu_id] = NULL;
 	ath10k_htt_tx_free_msdu_id(htt, ATH10K_SKB_CB(txdesc)->htt.msdu_id);
 	if (bitmap_empty(htt->used_msdu_ids, HTT_MAX_NUM_PENDING_TX))
 		wake_up(&htt->empty_tx_wq);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [ath9k-devel] [PATCH 2/2] ath10k: cleanup htt pending tx
  2013-04-24  7:24 [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Michal Kazior
  2013-04-24  7:24 ` [ath9k-devel] [PATCH 1/2] ath10k: clear pending_tx[] upon tx completion Michal Kazior
@ 2013-04-24  7:24 ` Michal Kazior
  2013-04-24 11:23 ` [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Kalle Valo
  2 siblings, 0 replies; 4+ messages in thread
From: Michal Kazior @ 2013-04-24  7:24 UTC (permalink / raw)
  To: ath9k-devel

This fixes memory leak. It could be seen in the
following scenario:

 * submit htt tx frame
 * receive htc tx completion
 * FW hangs
 * rmmod
 * txed frame never freed

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/htt_tx.c |   28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index 2058923..7ac3681 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -53,8 +53,36 @@ void ath10k_htt_tx_attach(struct ath10k_htt *htt)
 	init_waitqueue_head(&htt->empty_tx_wq);
 }
 
+static void ath10k_htt_tx_cleanup_pending(struct ath10k_htt *htt)
+{
+	struct sk_buff *txdesc;
+	int msdu_id;
+
+	/* No locks needed. Called after communication with the device has
+	 * been stopped. */
+
+	for (msdu_id = 0; msdu_id < HTT_MAX_NUM_PENDING_TX; msdu_id++) {
+		if (!test_bit(msdu_id, htt->used_msdu_ids))
+			continue;
+
+		txdesc = htt->pending_tx[msdu_id];
+		if (!txdesc)
+			continue;
+
+		ath10k_dbg(ATH10K_DBG_HTT, "force cleanup msdu_id %hu\n",
+			   msdu_id);
+
+		if (ATH10K_SKB_CB(txdesc)->htt.refcount > 0)
+			ATH10K_SKB_CB(txdesc)->htt.refcount = 1;
+
+		ATH10K_SKB_CB(txdesc)->htt.discard = true;
+		ath10k_txrx_tx_unref(htt, txdesc);
+	}
+}
+
 void ath10k_htt_tx_detach(struct ath10k_htt *htt)
 {
+	ath10k_htt_tx_cleanup_pending(htt);
 	return;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [ath9k-devel] [PATCH 0/2] ath10k: htt fixes
  2013-04-24  7:24 [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Michal Kazior
  2013-04-24  7:24 ` [ath9k-devel] [PATCH 1/2] ath10k: clear pending_tx[] upon tx completion Michal Kazior
  2013-04-24  7:24 ` [ath9k-devel] [PATCH 2/2] ath10k: cleanup htt pending tx Michal Kazior
@ 2013-04-24 11:23 ` Kalle Valo
  2 siblings, 0 replies; 4+ messages in thread
From: Kalle Valo @ 2013-04-24 11:23 UTC (permalink / raw)
  To: ath9k-devel

Michal Kazior <michal.kazior@tieto.com> writes:

> This one addresses a rare memory leak when FW
> hangs leaving some HTT tx transactions unfinished.
>
> Michal Kazior (2):
>   ath10k: clear pending_tx[] upon tx completion
>   ath10k: cleanup htt pending tx

Thanks, applied.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-04-24 11:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-24  7:24 [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Michal Kazior
2013-04-24  7:24 ` [ath9k-devel] [PATCH 1/2] ath10k: clear pending_tx[] upon tx completion Michal Kazior
2013-04-24  7:24 ` [ath9k-devel] [PATCH 2/2] ath10k: cleanup htt pending tx Michal Kazior
2013-04-24 11:23 ` [ath9k-devel] [PATCH 0/2] ath10k: htt fixes Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.