lkml.org 
[lkml]   [2011]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[131/244] ibmveth: Fix issue with DMA mapping failure
    3.0-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Anton Blanchard <anton@samba.org>

    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>

    ---
    drivers/net/ibmveth.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    --- a/drivers/net/ibmveth.c
    +++ b/drivers/net/ibmveth.c
    @@ -929,6 +929,7 @@ static netdev_tx_t ibmveth_start_xmit(st
    union ibmveth_buf_desc descs[6];
    int last, i;
    int force_bounce = 0;
    + dma_addr_t dma_addr;

    /*
    * veth handles a maximum of 6 segments including the header, so
    @@ -993,17 +994,16 @@ retry_bounce:
    }

    /* Map the header */
    - descs[0].fields.address = dma_map_single(&adapter->vdev->dev, skb->data,
    - skb_headlen(skb),
    - DMA_TO_DEVICE);
    - if (dma_mapping_error(&adapter->vdev->dev, descs[0].fields.address))
    + dma_addr = dma_map_single(&adapter->vdev->dev, skb->data,
    + skb_headlen(skb), DMA_TO_DEVICE);
    + if (dma_mapping_error(&adapter->vdev->dev, dma_addr))
    goto map_failed;

    descs[0].fields.flags_len = desc_flags | skb_headlen(skb);
    + descs[0].fields.address = dma_addr;

    /* Map the frags */
    for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
    - unsigned long dma_addr;
    skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

    dma_addr = dma_map_page(&adapter->vdev->dev, frag->page,



    \
     
     \ /
      Last update: 2011-09-29 01:11    [W:4.034 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site