netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: <jie.yang@atheros.com>
To: <davem@davemloft.net>
Cc: <miles.lane@gmail.com>, <chris.snook@gmail.com>,
	<jcliburn@gmail.com>, <netdev@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, Jie Yang <jie.yang@atheros.com>
Subject: [Patch net-next]atl1e:fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA
Date: Wed, 16 Sep 2009 14:21:53 +0800	[thread overview]
Message-ID: <12530821133392-git-send-email-jie.yang@atheros.com> (raw)


[   25.059969] WARNING: at lib/dma-debug.c:816 check_unmap+0x383/0x55c()
[   25.059976] Hardware name: 1000HE
[   25.059984] ATL1E 0000:03:00.0: DMA-API: device driver frees DMA
    memory with wrong function [device address=0x0000000036b92802] 
    [size=90 bytes] [mapped as single] [unmapped as page]

use the wrong API when free dma. So when map dma use a flag to demostrate
whether it is 'pci_map_single' or 'pci_map_page'. When free the dma, check
the flags to select the right APIs('pci_unmap_single' or 'pci_unmap_page').
 
Signed-off-by: Jie Yang <jie.yang@atheros.com>
---
diff --git a/drivers/net/atl1e/atl1e.h b/drivers/net/atl1e/atl1e.h
index ba48220..d63be5c 100644
--- a/drivers/net/atl1e/atl1e.h
+++ b/drivers/net/atl1e/atl1e.h
@@ -377,10 +377,19 @@ struct atl1e_hw {
  */
 struct atl1e_tx_buffer {
    struct sk_buff *skb;
+   unsigned long flags;
+#define ATL1E_TX_PCIMAP_SINGLE     0x0001
+#define ATL1E_TX_PCIMAP_PAGE       0x0002
+#define ATL1E_TX_PCIMAP_TYPE_MASK  0x3
    u16 length;
    dma_addr_t dma;
 };
 
+#define ATL1E_SET_PCIMAP_TYPE(tx_buff, type) do {      \
+   ((tx_buff)->flags) &= ~ATL1E_TX_PCIMAP_TYPE_MASK;   \
+   ((tx_buff)->flags) |= (type);               \
+   } while (0)
+
 struct atl1e_rx_page {
    dma_addr_t  dma;    /* receive rage DMA address */
    u8      *addr;   /* receive rage virtual address */
diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c
index 69b830f..955da73 100644
--- a/drivers/net/atl1e/atl1e_main.c
+++ b/drivers/net/atl1e/atl1e_main.c
@@ -635,7 +635,11 @@ static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
    for (index = 0; index < ring_count; index++) {
        tx_buffer = &tx_ring->tx_buffer[index];
        if (tx_buffer->dma) {
-           pci_unmap_page(pdev, tx_buffer->dma,
+           if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
+               pci_unmap_single(pdev, tx_buffer->dma,
+                   tx_buffer->length, PCI_DMA_TODEVICE);
+           else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
+               pci_unmap_page(pdev, tx_buffer->dma,
                    tx_buffer->length, PCI_DMA_TODEVICE);
            tx_buffer->dma = 0;
        }
@@ -1220,7 +1224,11 @@ static bool atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
    while (next_to_clean != hw_next_to_clean) {
        tx_buffer = &tx_ring->tx_buffer[next_to_clean];
        if (tx_buffer->dma) {
-           pci_unmap_page(adapter->pdev, tx_buffer->dma,
+           if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
+               pci_unmap_single(adapter->pdev, tx_buffer->dma,
+                   tx_buffer->length, PCI_DMA_TODEVICE);
+           else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
+               pci_unmap_page(adapter->pdev, tx_buffer->dma,
                    tx_buffer->length, PCI_DMA_TODEVICE);
            tx_buffer->dma = 0;
        }
@@ -1741,6 +1749,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
        tx_buffer->length = map_len;
        tx_buffer->dma = pci_map_single(adapter->pdev,
                    skb->data, hdr_len, PCI_DMA_TODEVICE);
+       ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
        mapped_len += map_len;
        use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
        use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@@ -1766,6 +1775,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
        tx_buffer->dma =
            pci_map_single(adapter->pdev, skb->data + mapped_len,
                    map_len, PCI_DMA_TODEVICE);
+       ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
        mapped_len  += map_len;
        use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
        use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@@ -1801,6 +1811,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
                        (i * MAX_TX_BUF_LEN),
                        tx_buffer->length,
                        PCI_DMA_TODEVICE);
+           ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
            use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
            use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
                    ((cpu_to_le32(tx_buffer->length) &

             reply	other threads:[~2009-09-16  6:22 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-16  6:21 jie.yang [this message]
2009-09-16  6:57 ` [Patch net-next]atl1e:fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA David Miller
2009-09-16  9:10 ` Daniel Walker
2009-09-16  9:31   ` Jie Yang
2009-09-16  9:47   ` David Miller
2009-09-16  9:51     ` Cyrill Gorcunov
2009-09-16  9:54       ` Jie Yang
  -- strict thread matches above, loose matches on Subject: below --
2009-09-16  7:23 jie.yang
2009-09-16  7:44 ` David Miller
2009-09-16  9:28 jie.yang
2009-09-17 17:27 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=12530821133392-git-send-email-jie.yang@atheros.com \
    --to=jie.yang@atheros.com \
    --cc=chris.snook@gmail.com \
    --cc=davem@davemloft.net \
    --cc=jcliburn@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miles.lane@gmail.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).