Skip to content

Commit f4b943b

Browse files
Mohammed Shafi ShajakhanIgor
authored andcommitted
ath9k: Fix a dma warning/memory leak
proper dma_unmapping and freeing of skb's has to be done in the rx cleanup for EDMA chipsets when the device is unloaded and this also seems to address the following warning which shows up occasionally when the device is unloaded Call Trace: [<c0148cd2>] warn_slowpath_common+0x72/0xa0 [<c03b669c>] ? dma_debug_device_change+0x19c/0x200 [<c03b669c>] ? dma_debug_device_change+0x19c/0x200 [<c0148da3>] warn_slowpath_fmt+0x33/0x40 [<c03b669c>] dma_debug_device_change+0x19c/0x200 [<c0657f12>] notifier_call_chain+0x82/0xb0 [<c0171370>] __blocking_notifier_call_chain+0x60/0x90 [<c01713bf>] blocking_notifier_call_chain+0x1f/0x30 [<c044f594>] __device_release_driver+0xa4/0xc0 [<c044f647>] driver_detach+0x97/0xa0 [<c044e65c>] bus_remove_driver+0x6c/0xe0 [<c029af0b>] ? sysfs_addrm_finish+0x4b/0x60 [<c0450109>] driver_unregister+0x49/0x80 [<c0299f54>] ? sysfs_remove_file+0x14/0x20 [<c03c3ab2>] pci_unregister_driver+0x32/0x80 [<f92c2162>] ath_pci_exit+0x12/0x20 [ath9k] [<f92c8467>] ath9k_exit+0x17/0x36 [ath9k] [<c06523cd>] ? mutex_unlock+0xd/0x10 [<c018e27f>] sys_delete_module+0x13f/0x200 [<c02139bb>] ? sys_munmap+0x4b/0x60 [<c06547c5>] ? restore_all+0xf/0xf [<c0657a20>] ? spurious_fault+0xe0/0xe0 [<c01832f4>] ? trace_hardirqs_on_caller+0xf4/0x180 [<c065b863>] sysenter_do_call+0x12/0x38 ---[ end trace 16e1c1521c06bcf9 ]--- Mapped at: [<c03b7938>] debug_dma_map_page+0x48/0x120 [<f92ba3e8>] ath_rx_init+0x3f8/0x4b0 [ath9k] [<f92b5ae4>] ath9k_init_device+0x4c4/0x7b0 [ath9k] [<f92c2813>] ath_pci_probe+0x263/0x330 [ath9k] Signed-off-by: Mohammed Shafi Shajakhan <mohammed@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
1 parent 4458f39 commit f4b943b

File tree

1 file changed

+9
-1
lines changed
  • drivers/net/wireless/ath/ath9k

1 file changed

+9
-1
lines changed

drivers/net/wireless/ath/ath9k/recv.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,22 @@ static void ath_rx_remove_buffer(struct ath_softc *sc,
205205

206206
static void ath_rx_edma_cleanup(struct ath_softc *sc)
207207
{
208+
struct ath_hw *ah = sc->sc_ah;
209+
struct ath_common *common = ath9k_hw_common(ah);
208210
struct ath_buf *bf;
209211

210212
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);
211213
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);
212214

213215
list_for_each_entry(bf, &sc->rx.rxbuf, list) {
214-
if (bf->bf_mpdu)
216+
if (bf->bf_mpdu) {
217+
dma_unmap_single(sc->dev, bf->bf_buf_addr,
218+
common->rx_bufsize,
219+
DMA_BIDIRECTIONAL);
215220
dev_kfree_skb_any(bf->bf_mpdu);
221+
bf->bf_buf_addr = 0;
222+
bf->bf_mpdu = NULL;
223+
}
216224
}
217225

218226
INIT_LIST_HEAD(&sc->rx.rxbuf);

0 commit comments

Comments
 (0)