lkml.org 
[lkml]   [2008]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 025/104] ath9k: Fix SW-IOMMU bounce buffer starvation
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Luis R. Rodriguez <lrodriguez@Atheros.com>

    commit ca0c7e5101fd4f37fed8e851709f08580b92fbb3 upstream.

    This should fix the SW-IOMMU bounce buffer starvation
    seen ok kernel.org bugzilla 11811:

    http://bugzilla.kernel.org/show_bug.cgi?id=11811

    Users on MacBook Pro 3.1/MacBook v2 would see something like:

    DMA: Out of SW-IOMMU space for 4224 bytes at device 0000:0b:00.0

    Unfortunately its only easy to trigger on MacBook Pro 3.1/MacBook v2
    so far so its difficult to debug (even with swiotlb=force).

    We were pci_unmap_single()'ing less bytes than what we called
    for with pci_map_single() and as such we were starving
    the swiotlb from its 64MB amount of bounce buffers. We remain
    consistent and now always use sc->rxbufsize for RX. While at
    it we update the beacon DMA maps as well to only use the data
    portion of the skb, previous to this we were pci_map_single()'ing
    more data for beaconing than what we tell the hardware it can use,
    therefore pushing more iotlb abuse.

    Still not sure why this is so easily triggerable on
    MacBook Pro 3.1, it may be the hardware configuration
    tends to use more memory > 3GB mark for DMA.

    Signed-off-by: Maciej Zenczykowski <zenczykowski@gmail.com>
    Signed-off-by: Bennyam Malavazi <Bennyam.Malavazi@atheros.com>
    Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/net/wireless/ath9k/recv.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    --- a/drivers/net/wireless/ath9k/recv.c
    +++ b/drivers/net/wireless/ath9k/recv.c
    @@ -1011,7 +1011,7 @@ int ath_rx_tasklet(struct ath_softc *sc,

    pci_dma_sync_single_for_cpu(sc->pdev,
    bf->bf_buf_addr,
    - skb_tailroom(skb),
    + sc->sc_rxbufsize,
    PCI_DMA_FROMDEVICE);
    pci_unmap_single(sc->pdev,
    bf->bf_buf_addr,
    @@ -1303,8 +1303,7 @@ dma_addr_t ath_skb_map_single(struct ath
    * NB: do NOT use skb->len, which is 0 on initialization.
    * Use skb's entire data area instead.
    */
    - *pa = pci_map_single(sc->pdev, skb->data,
    - skb_end_pointer(skb) - skb->head, direction);
    + *pa = pci_map_single(sc->pdev, skb->data, sc->sc_rxbufsize, direction);
    return *pa;
    }

    @@ -1314,6 +1313,5 @@ void ath_skb_unmap_single(struct ath_sof
    dma_addr_t *pa)
    {
    /* Unmap skb's entire data area */
    - pci_unmap_single(sc->pdev, *pa,
    - skb_end_pointer(skb) - skb->head, direction);
    + pci_unmap_single(sc->pdev, *pa, sc->sc_rxbufsize, direction);
    }


    \
     
     \ /
      Last update: 2008-12-03 21:03    [W:4.379 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site