diff mbox series

[1/1,SRU,Bionic] net: qcom/emac: Use proper free methods during TX

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

Commit Message

AceLan Kao Aug. 24, 2018, 8:53 a.m. UTC
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>
---
 drivers/net/ethernet/qualcomm/emac/emac-mac.c | 23 +++++++++++--------
 1 file changed, 14 insertions(+), 9 deletions(-)

Comments

Stefan Bader Aug. 27, 2018, 1:05 p.m. UTC | #1
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)
>
AceLan Kao Aug. 30, 2018, 6:44 a.m. UTC | #2
The commit has been included in 4.15.0-34.37
diff mbox series

Patch

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)