Re: [PATCH net] bna: check for dma mapping errors
From: Ivan VeceraDate: 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
> 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 ModyThanks! 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
Check for DMA mapping errors, recover from them and register them in ethtool stats like other errors. Cc: Rasesh ModySigned-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); +