netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net PATCH] atl1e: unmap partially mapped skb on dma error and free skb
@ 2013-07-16 14:49 Neil Horman
  2013-07-16 19:11 ` David Miller
  0 siblings, 1 reply; 3+ messages in thread
From: Neil Horman @ 2013-07-16 14:49 UTC (permalink / raw)
  To: netdev
  Cc: Neil Horman, Ben Hutchings, Jay Cliburn, Chris Snook, David S. Miller

Ben Hutchings pointed out that my recent update to atl1e:

commit 352900b583b2852152a1e05ea0e8b579292e731e
Author: Neil Horman <nhorman@tuxdriver.com>
Date:   Fri Jul 12 10:58:48 2013 -0400

    atl1e: fix dma mapping warnings

Was missing a bit of code.  Specifically it reset the hardware tx ring to its
origional state when we hit a dma error, but didn't unmap any exiting mappings
from the operation.  This patch fixes that up.  It also remembers to free the
skb in the event that an error occurs, so we don't leak.  Untested, as I don't
have hardware.  I think its pretty straightforward, but please review closely.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Ben Hutchings <bhutchings@solarflare.com>
CC: Jay Cliburn <jcliburn@gmail.com>
CC: Chris Snook <chris.snook@gmail.com>
CC: "David S. Miller" <davem@davemloft.net>
---
 drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
index 6d1a62a..1966444 100644
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
@@ -1678,6 +1678,7 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter,
 	u16 f;
 	int segment;
 	int ring_start = adapter->tx_ring.next_to_use;
+	int ring_end;
 
 	nr_frags = skb_shinfo(skb)->nr_frags;
 	segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK;
@@ -1721,6 +1722,15 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter,
 					map_len, PCI_DMA_TODEVICE);
 
 		if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
+			/* We need to unwind the mappings we've done */
+			ring_end = adapter->tx_ring.next_to_use;
+			adapter->tx_ring.next_to_use = ring_start;
+			while (adapter->tx_ring.next_to_use != ring_end) {
+				tpd = atl1e_get_tpd(adapter);
+				tx_buffer = atl1e_get_tx_buffer(adapter, tpd);
+				pci_unmap_single(adapter->pdev, tx_buffer->dma,
+						 tx_buffer->length, PCI_DMA_TODEVICE);
+			}
 			/* Reset the tx rings next pointer */
 			adapter->tx_ring.next_to_use = ring_start;
 			return -ENOSPC;
@@ -1763,6 +1773,16 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter,
 							  DMA_TO_DEVICE);
 
 			if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
+				/* We need to unwind the mappings we've done */
+				ring_end = adapter->tx_ring.next_to_use;
+				adapter->tx_ring.next_to_use = ring_start;
+				while (adapter->tx_ring.next_to_use != ring_end) {
+					tpd = atl1e_get_tpd(adapter);
+					tx_buffer = atl1e_get_tx_buffer(adapter, tpd);
+					dma_unmap_page(&adapter->pdev->dev, tx_buffer->dma,
+						       tx_buffer->length, DMA_TO_DEVICE);
+				}
+
 				/* Reset the ring next to use pointer */
 				adapter->tx_ring.next_to_use = ring_start;
 				return -ENOSPC;
@@ -1853,8 +1873,10 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb,
 		return NETDEV_TX_OK;
 	}
 
-	if (atl1e_tx_map(adapter, skb, tpd))
+	if (atl1e_tx_map(adapter, skb, tpd)) {
+		dev_kfree_skb_any(skb);
 		goto out;
+	}
 
 	atl1e_tx_queue(adapter, tpd_req, tpd);
 
-- 
1.8.1.4

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

* Re: [net PATCH] atl1e: unmap partially mapped skb on dma error and free skb
  2013-07-16 14:49 [net PATCH] atl1e: unmap partially mapped skb on dma error and free skb Neil Horman
@ 2013-07-16 19:11 ` David Miller
  2013-07-16 20:48   ` Neil Horman
  0 siblings, 1 reply; 3+ messages in thread
From: David Miller @ 2013-07-16 19:11 UTC (permalink / raw)
  To: nhorman; +Cc: netdev, bhutchings, jcliburn, chris.snook

From: Neil Horman <nhorman@tuxdriver.com>
Date: Tue, 16 Jul 2013 10:49:41 -0400

> Ben Hutchings pointed out that my recent update to atl1e:
> 
> commit 352900b583b2852152a1e05ea0e8b579292e731e
> Author: Neil Horman <nhorman@tuxdriver.com>
> Date:   Fri Jul 12 10:58:48 2013 -0400
> 
>     atl1e: fix dma mapping warnings
> 
> Was missing a bit of code.  Specifically it reset the hardware tx ring to its
> origional state when we hit a dma error, but didn't unmap any exiting mappings
> from the operation.  This patch fixes that up.  It also remembers to free the
> skb in the event that an error occurs, so we don't leak.  Untested, as I don't
> have hardware.  I think its pretty straightforward, but please review closely.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Applied, but please refer to commits in the form "$SHA1ID ("Commit message
header line")", I fixed it up for you this time.

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

* Re: [net PATCH] atl1e: unmap partially mapped skb on dma error and free skb
  2013-07-16 19:11 ` David Miller
@ 2013-07-16 20:48   ` Neil Horman
  0 siblings, 0 replies; 3+ messages in thread
From: Neil Horman @ 2013-07-16 20:48 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, bhutchings, jcliburn, chris.snook

On Tue, Jul 16, 2013 at 12:11:25PM -0700, David Miller wrote:
> From: Neil Horman <nhorman@tuxdriver.com>
> Date: Tue, 16 Jul 2013 10:49:41 -0400
> 
> > Ben Hutchings pointed out that my recent update to atl1e:
> > 
> > commit 352900b583b2852152a1e05ea0e8b579292e731e
> > Author: Neil Horman <nhorman@tuxdriver.com>
> > Date:   Fri Jul 12 10:58:48 2013 -0400
> > 
> >     atl1e: fix dma mapping warnings
> > 
> > Was missing a bit of code.  Specifically it reset the hardware tx ring to its
> > origional state when we hit a dma error, but didn't unmap any exiting mappings
> > from the operation.  This patch fixes that up.  It also remembers to free the
> > skb in the event that an error occurs, so we don't leak.  Untested, as I don't
> > have hardware.  I think its pretty straightforward, but please review closely.
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> 
> Applied, but please refer to commits in the form "$SHA1ID ("Commit message
> header line")", I fixed it up for you this time.
> 
copy, thanks dave
Neil

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

end of thread, other threads:[~2013-07-16 20:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-16 14:49 [net PATCH] atl1e: unmap partially mapped skb on dma error and free skb Neil Horman
2013-07-16 19:11 ` David Miller
2013-07-16 20:48   ` Neil Horman

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).