ath9k: Fix SW-IOMMU bounce buffer starvation
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: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
3dd3b79aea
Коммит
ca0c7e5101
|
@ -170,7 +170,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
|||
skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
if (skb) {
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
}
|
||||
|
||||
|
@ -193,7 +193,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
|
|||
|
||||
bf->bf_buf_addr = bf->bf_dmacontext =
|
||||
pci_map_single(sc->pdev, skb->data,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
skb = ieee80211_get_buffered_bc(sc->hw, avp->av_if_data);
|
||||
|
@ -352,7 +352,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
|||
if (bf->bf_mpdu != NULL) {
|
||||
skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
|
@ -412,7 +412,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
|
|||
|
||||
bf->bf_buf_addr = bf->bf_dmacontext =
|
||||
pci_map_single(sc->pdev, skb->data,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
bf->bf_mpdu = skb;
|
||||
|
||||
|
@ -439,7 +439,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp)
|
|||
if (bf->bf_mpdu != NULL) {
|
||||
struct sk_buff *skb = (struct sk_buff *)bf->bf_mpdu;
|
||||
pci_unmap_single(sc->pdev, bf->bf_dmacontext,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
dev_kfree_skb_any(skb);
|
||||
bf->bf_mpdu = NULL;
|
||||
|
|
|
@ -456,7 +456,7 @@ static int ath_rx_indicate(struct ath_softc *sc,
|
|||
if (nskb != NULL) {
|
||||
bf->bf_mpdu = nskb;
|
||||
bf->bf_buf_addr = pci_map_single(sc->pdev, nskb->data,
|
||||
skb_end_pointer(nskb) - nskb->head,
|
||||
sc->sc_rxbufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
bf->bf_dmacontext = bf->bf_buf_addr;
|
||||
ATH_RX_CONTEXT(nskb)->ctx_rxbuf = bf;
|
||||
|
@ -542,7 +542,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
|
|||
|
||||
bf->bf_mpdu = skb;
|
||||
bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data,
|
||||
skb_end_pointer(skb) - skb->head,
|
||||
sc->sc_rxbufsize,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
bf->bf_dmacontext = bf->bf_buf_addr;
|
||||
ATH_RX_CONTEXT(skb)->ctx_rxbuf = bf;
|
||||
|
@ -1007,7 +1007,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
|
|||
|
||||
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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче