Re: [PATCH net] bna: check for dma mapping errors

2015-09-20 Thread David Miller
From: Ivan Vecera 
Date: Wed, 16 Sep 2015 15:27:43 +0200

> Check for DMA mapping errors, recover from them and register them in
> ethtool stats like other errors.
> 
> Cc: Rasesh Mody 
> Signed-off-by: Ivan Vecera 

Applied, thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH net] bna: check for dma mapping errors

2015-09-18 Thread Rasesh Mody
> From: Ivan Vecera [mailto:ivec...@redhat.com]
> Sent: Wednesday, September 16, 2015 6:28 AM
> 
> Check for DMA mapping errors, recover from them and register them in
> ethtool stats like other errors.

Acked-by: Rasesh Mody 

Thanks!
Rasesh
 
> Cc: Rasesh Mody 
> Signed-off-by: Ivan Vecera 
> ---
>  drivers/net/ethernet/brocade/bna/bna_tx_rx.c|  2 ++
>  drivers/net/ethernet/brocade/bna/bna_types.h|  1 +
>  drivers/net/ethernet/brocade/bna/bnad.c | 29
> -
>  drivers/net/ethernet/brocade/bna/bnad.h |  2 ++
>  drivers/net/ethernet/brocade/bna/bnad_ethtool.c |  4 
>  5 files changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> index 5d0753c..04b0d16 100644
> --- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> +++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
> @@ -2400,6 +2400,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
>   q0->rcb->id = 0;
>   q0->rx_packets = q0->rx_bytes = 0;
>   q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0;
> + q0->rxbuf_map_failed = 0;
> 
>   bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE,
>   _mem[i], _mem[i], _mem[i]);
> @@ -2428,6 +2429,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
>   : rx_cfg->q1_buf_size;
>   q1->rx_packets = q1->rx_bytes = 0;
>   q1->rx_packets_with_error = q1->rxbuf_alloc_failed
> = 0;
> + q1->rxbuf_map_failed = 0;
> 
>   bna_rxq_qpt_setup(q1, rxp, hpage_count,
> PAGE_SIZE,
>   _mem[i], _mem[i],
> diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h
> b/drivers/net/ethernet/brocade/bna/bna_types.h
> index e0e797f..c438d03 100644
> --- a/drivers/net/ethernet/brocade/bna/bna_types.h
> +++ b/drivers/net/ethernet/brocade/bna/bna_types.h
> @@ -587,6 +587,7 @@ struct bna_rxq {
>   u64 rx_bytes;
>   u64 rx_packets_with_error;
>   u64 rxbuf_alloc_failed;
> + u64 rxbuf_map_failed;
>  };
> 
>  /* RxQ pair */
> diff --git a/drivers/net/ethernet/brocade/bna/bnad.c
> b/drivers/net/ethernet/brocade/bna/bnad.c
> index 506047c..21a0cfc 100644
> --- a/drivers/net/ethernet/brocade/bna/bnad.c
> +++ b/drivers/net/ethernet/brocade/bna/bnad.c
> @@ -399,7 +399,13 @@ bnad_rxq_refill_page(struct bnad *bnad, struct
> bna_rcb *rcb, u32 nalloc)
>   }
> 
>   dma_addr = dma_map_page(>pcidev->dev, page,
> page_offset,
> - unmap_q->map_size, DMA_FROM_DEVICE);
> + unmap_q->map_size,
> DMA_FROM_DEVICE);
> + if (dma_mapping_error(>pcidev->dev, dma_addr)) {
> + put_page(page);
> + BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
> + rcb->rxq->rxbuf_map_failed++;
> + goto finishing;
> + }
> 
>   unmap->page = page;
>   unmap->page_offset = page_offset;
> @@ -454,8 +460,15 @@ bnad_rxq_refill_skb(struct bnad *bnad, struct
> bna_rcb *rcb, u32 nalloc)
>   rcb->rxq->rxbuf_alloc_failed++;
>   goto finishing;
>   }
> +
>   dma_addr = dma_map_single(>pcidev->dev, skb-
> >data,
> buff_sz, DMA_FROM_DEVICE);
> + if (dma_mapping_error(>pcidev->dev, dma_addr)) {
> + dev_kfree_skb_any(skb);
> + BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
> + rcb->rxq->rxbuf_map_failed++;
> + goto finishing;
> + }
> 
>   unmap->skb = skb;
>   dma_unmap_addr_set(>vector, dma_addr,
> dma_addr); @@ -3025,6 +3038,11 @@ bnad_start_xmit(struct sk_buff *skb,
> struct net_device *netdev)
>   unmap = head_unmap;
>   dma_addr = dma_map_single(>pcidev->dev, skb->data,
> len, DMA_TO_DEVICE);
> + if (dma_mapping_error(>pcidev->dev, dma_addr)) {
> + dev_kfree_skb_any(skb);
> + BNAD_UPDATE_CTR(bnad, tx_skb_map_failed);
> + return NETDEV_TX_OK;
> + }
>   BNA_SET_DMA_ADDR(dma_addr, >vector[0].host_addr);
>   txqent->vector[0].length = htons(len);
>   dma_unmap_addr_set(>vectors[0], dma_addr,
> dma_addr); @@ -3056,6 +3074,15 @@ bnad_start_xmit(struct sk_buff *skb,
> struct net_device *netdev)
> 
>   dma_addr = skb_frag_dma_map(>pcidev->dev, frag,
>   0, size, DMA_TO_DEVICE);
> + if (dma_mapping_error(>pcidev->dev, dma_addr)) {
> + /* Undo the changes starting at tcb->producer_index
> */
> + 

[PATCH net] bna: check for dma mapping errors

2015-09-16 Thread Ivan Vecera
Check for DMA mapping errors, recover from them and register them in
ethtool stats like other errors.

Cc: Rasesh Mody 
Signed-off-by: Ivan Vecera 
---
 drivers/net/ethernet/brocade/bna/bna_tx_rx.c|  2 ++
 drivers/net/ethernet/brocade/bna/bna_types.h|  1 +
 drivers/net/ethernet/brocade/bna/bnad.c | 29 -
 drivers/net/ethernet/brocade/bna/bnad.h |  2 ++
 drivers/net/ethernet/brocade/bna/bnad_ethtool.c |  4 
 5 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c 
b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
index 5d0753c..04b0d16 100644
--- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
+++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c
@@ -2400,6 +2400,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
q0->rcb->id = 0;
q0->rx_packets = q0->rx_bytes = 0;
q0->rx_packets_with_error = q0->rxbuf_alloc_failed = 0;
+   q0->rxbuf_map_failed = 0;
 
bna_rxq_qpt_setup(q0, rxp, dpage_count, PAGE_SIZE,
_mem[i], _mem[i], _mem[i]);
@@ -2428,6 +2429,7 @@ bna_rx_create(struct bna *bna, struct bnad *bnad,
: rx_cfg->q1_buf_size;
q1->rx_packets = q1->rx_bytes = 0;
q1->rx_packets_with_error = q1->rxbuf_alloc_failed = 0;
+   q1->rxbuf_map_failed = 0;
 
bna_rxq_qpt_setup(q1, rxp, hpage_count, PAGE_SIZE,
_mem[i], _mem[i],
diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h 
b/drivers/net/ethernet/brocade/bna/bna_types.h
index e0e797f..c438d03 100644
--- a/drivers/net/ethernet/brocade/bna/bna_types.h
+++ b/drivers/net/ethernet/brocade/bna/bna_types.h
@@ -587,6 +587,7 @@ struct bna_rxq {
u64 rx_bytes;
u64 rx_packets_with_error;
u64 rxbuf_alloc_failed;
+   u64 rxbuf_map_failed;
 };
 
 /* RxQ pair */
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c 
b/drivers/net/ethernet/brocade/bna/bnad.c
index 506047c..21a0cfc 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -399,7 +399,13 @@ bnad_rxq_refill_page(struct bnad *bnad, struct bna_rcb 
*rcb, u32 nalloc)
}
 
dma_addr = dma_map_page(>pcidev->dev, page, page_offset,
-   unmap_q->map_size, DMA_FROM_DEVICE);
+   unmap_q->map_size, DMA_FROM_DEVICE);
+   if (dma_mapping_error(>pcidev->dev, dma_addr)) {
+   put_page(page);
+   BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
+   rcb->rxq->rxbuf_map_failed++;
+   goto finishing;
+   }
 
unmap->page = page;
unmap->page_offset = page_offset;
@@ -454,8 +460,15 @@ bnad_rxq_refill_skb(struct bnad *bnad, struct bna_rcb 
*rcb, u32 nalloc)
rcb->rxq->rxbuf_alloc_failed++;
goto finishing;
}
+
dma_addr = dma_map_single(>pcidev->dev, skb->data,
  buff_sz, DMA_FROM_DEVICE);
+   if (dma_mapping_error(>pcidev->dev, dma_addr)) {
+   dev_kfree_skb_any(skb);
+   BNAD_UPDATE_CTR(bnad, rxbuf_map_failed);
+   rcb->rxq->rxbuf_map_failed++;
+   goto finishing;
+   }
 
unmap->skb = skb;
dma_unmap_addr_set(>vector, dma_addr, dma_addr);
@@ -3025,6 +3038,11 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device 
*netdev)
unmap = head_unmap;
dma_addr = dma_map_single(>pcidev->dev, skb->data,
  len, DMA_TO_DEVICE);
+   if (dma_mapping_error(>pcidev->dev, dma_addr)) {
+   dev_kfree_skb_any(skb);
+   BNAD_UPDATE_CTR(bnad, tx_skb_map_failed);
+   return NETDEV_TX_OK;
+   }
BNA_SET_DMA_ADDR(dma_addr, >vector[0].host_addr);
txqent->vector[0].length = htons(len);
dma_unmap_addr_set(>vectors[0], dma_addr, dma_addr);
@@ -3056,6 +3074,15 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device 
*netdev)
 
dma_addr = skb_frag_dma_map(>pcidev->dev, frag,
0, size, DMA_TO_DEVICE);
+   if (dma_mapping_error(>pcidev->dev, dma_addr)) {
+   /* Undo the changes starting at tcb->producer_index */
+   bnad_tx_buff_unmap(bnad, unmap_q, q_depth,
+  tcb->producer_index);
+   dev_kfree_skb_any(skb);
+   BNAD_UPDATE_CTR(bnad, tx_skb_map_failed);
+