Message ID | 20180824085303.11167-2-acelan.kao@canonical.com |
---|---|
State | New |
Headers | show |
Series | System takes long time to read device via Thunderbolt 3 port | expand |
On 24.08.2018 10:53, AceLan Kao wrote: > From: Hemanth Puranik <hpuranik@codeaurora.org> > > BugLink: https://bugs.launchpad.net/bugs/1788567 > > This patch fixes the warning messages/call traces seen if DMA debug is > enabled, In case of fragmented skb's memory was allocated using > dma_map_page but freed using dma_unmap_single. This patch modifies buffer > allocations in TX path to use dma_map_page in all the places and > dma_unmap_page while freeing the buffers. > > Signed-off-by: Hemanth Puranik <hpuranik@codeaurora.org> > Acked-by: Timur Tabi <timur@codeaurora.org> > Signed-off-by: David S. Miller <davem@davemloft.net> > (cherry picked from commit cc5db3150e87fe7f7e947bf333b6c1c97f848ecb) > Signed-off-by: AceLan Kao <acelan.kao@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- > drivers/net/ethernet/qualcomm/emac/emac-mac.c | 23 +++++++++++-------- > 1 file changed, 14 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c > index 9cbb27263742..d5a32b7c7dc5 100644 > --- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c > +++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c > @@ -1194,9 +1194,9 @@ void emac_mac_tx_process(struct emac_adapter *adpt, struct emac_tx_queue *tx_q) > while (tx_q->tpd.consume_idx != hw_consume_idx) { > tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.consume_idx); > if (tpbuf->dma_addr) { > - dma_unmap_single(adpt->netdev->dev.parent, > - tpbuf->dma_addr, tpbuf->length, > - DMA_TO_DEVICE); > + dma_unmap_page(adpt->netdev->dev.parent, > + tpbuf->dma_addr, tpbuf->length, > + DMA_TO_DEVICE); > tpbuf->dma_addr = 0; > } > > @@ -1353,9 +1353,11 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt, > > tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.produce_idx); > tpbuf->length = mapped_len; > - tpbuf->dma_addr = dma_map_single(adpt->netdev->dev.parent, > - skb->data, tpbuf->length, > - DMA_TO_DEVICE); > + tpbuf->dma_addr = dma_map_page(adpt->netdev->dev.parent, > + virt_to_page(skb->data), > + offset_in_page(skb->data), > + tpbuf->length, > + DMA_TO_DEVICE); > ret = dma_mapping_error(adpt->netdev->dev.parent, > tpbuf->dma_addr); > if (ret) > @@ -1371,9 +1373,12 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt, > if (mapped_len < len) { > tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.produce_idx); > tpbuf->length = len - mapped_len; > - tpbuf->dma_addr = dma_map_single(adpt->netdev->dev.parent, > - skb->data + mapped_len, > - tpbuf->length, DMA_TO_DEVICE); > + tpbuf->dma_addr = dma_map_page(adpt->netdev->dev.parent, > + virt_to_page(skb->data + > + mapped_len), > + offset_in_page(skb->data + > + mapped_len), > + tpbuf->length, DMA_TO_DEVICE); > ret = dma_mapping_error(adpt->netdev->dev.parent, > tpbuf->dma_addr); > if (ret) >
The commit has been included in 4.15.0-34.37
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c index 9cbb27263742..d5a32b7c7dc5 100644 --- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c +++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c @@ -1194,9 +1194,9 @@ void emac_mac_tx_process(struct emac_adapter *adpt, struct emac_tx_queue *tx_q) while (tx_q->tpd.consume_idx != hw_consume_idx) { tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.consume_idx); if (tpbuf->dma_addr) { - dma_unmap_single(adpt->netdev->dev.parent, - tpbuf->dma_addr, tpbuf->length, - DMA_TO_DEVICE); + dma_unmap_page(adpt->netdev->dev.parent, + tpbuf->dma_addr, tpbuf->length, + DMA_TO_DEVICE); tpbuf->dma_addr = 0; } @@ -1353,9 +1353,11 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt, tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.produce_idx); tpbuf->length = mapped_len; - tpbuf->dma_addr = dma_map_single(adpt->netdev->dev.parent, - skb->data, tpbuf->length, - DMA_TO_DEVICE); + tpbuf->dma_addr = dma_map_page(adpt->netdev->dev.parent, + virt_to_page(skb->data), + offset_in_page(skb->data), + tpbuf->length, + DMA_TO_DEVICE); ret = dma_mapping_error(adpt->netdev->dev.parent, tpbuf->dma_addr); if (ret) @@ -1371,9 +1373,12 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt, if (mapped_len < len) { tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.produce_idx); tpbuf->length = len - mapped_len; - tpbuf->dma_addr = dma_map_single(adpt->netdev->dev.parent, - skb->data + mapped_len, - tpbuf->length, DMA_TO_DEVICE); + tpbuf->dma_addr = dma_map_page(adpt->netdev->dev.parent, + virt_to_page(skb->data + + mapped_len), + offset_in_page(skb->data + + mapped_len), + tpbuf->length, DMA_TO_DEVICE); ret = dma_mapping_error(adpt->netdev->dev.parent, tpbuf->dma_addr); if (ret)