aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2011-09-07 10:41:04 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-10-03 14:40:32 -0400
commit83bc0ed804595195df6bc8c5773db5594884e2e7 (patch)
treecae6d13547ebb63211e90eb83d97e82728d47a68
parent63bac6629520236226e54128c873871f1ff1f018 (diff)
ibmveth: Fix issue with DMA mapping failure
commit b93da27f5234198433345e40b39ff59797bc6f6e upstream. descs[].fields.address is 32bit which truncates any dma mapping errors so dma_mapping_error() fails to catch it. Use a dma_addr_t to do the comparison. With this patch I was able to transfer many gigabytes of data with IOMMU fault injection set at 10% probability. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/net/ibmveth.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c
index dc9bac0e92f..448d74ddf85 100644
--- a/drivers/net/ibmveth.c
+++ b/drivers/net/ibmveth.c
@@ -929,6 +929,7 @@ static netdev_tx_t ibmveth_start_xmit(struct sk_buff *skb,
929 union ibmveth_buf_desc descs[6]; 929 union ibmveth_buf_desc descs[6];
930 int last, i; 930 int last, i;
931 int force_bounce = 0; 931 int force_bounce = 0;
932 dma_addr_t dma_addr;
932 933
933 /* 934 /*
934 * veth handles a maximum of 6 segments including the header, so 935 * veth handles a maximum of 6 segments including the header, so
@@ -993,17 +994,16 @@ retry_bounce:
993 } 994 }
994 995
995 /* Map the header */ 996 /* Map the header */
996 descs[0].fields.address = dma_map_single(&adapter->vdev->dev, skb->data, 997 dma_addr = dma_map_single(&adapter->vdev->dev, skb->data,
997 skb_headlen(skb), 998 skb_headlen(skb), DMA_TO_DEVICE);
998 DMA_TO_DEVICE); 999 if (dma_mapping_error(&adapter->vdev->dev, dma_addr))
999 if (dma_mapping_error(&adapter->vdev->dev, descs[0].fields.address))
1000 goto map_failed; 1000 goto map_failed;
1001 1001
1002 descs[0].fields.flags_len = desc_flags | skb_headlen(skb); 1002 descs[0].fields.flags_len = desc_flags | skb_headlen(skb);
1003 descs[0].fields.address = dma_addr;
1003 1004
1004 /* Map the frags */ 1005 /* Map the frags */
1005 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 1006 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
1006 unsigned long dma_addr;
1007 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 1007 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1008 1008
1009 dma_addr = dma_map_page(&adapter->vdev->dev, frag->page, 1009 dma_addr = dma_map_page(&adapter->vdev->dev, frag->page,