Skip to content

Commit

Permalink
e1000: Fix DMA mapping error handling on RX
Browse files Browse the repository at this point in the history
Check for error return from pci_map_single/pci_map_page and clean up.

With this and the previous patch the driver was able to handle a significant
percentage of errors (I set the fault injection rate to 10% and could still
download large files at a reasonable speed).

Signed-off-by: Anton Blanchard <[email protected]>
Signed-off-by: Jeff Kirsher <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
antonblanchard authored and davem330 committed Feb 23, 2010
1 parent 242cc05 commit b5abb02
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion drivers/net/e1000/e1000_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -4006,11 +4006,21 @@ e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
}
}

if (!buffer_info->dma)
if (!buffer_info->dma) {
buffer_info->dma = pci_map_page(pdev,
buffer_info->page, 0,
buffer_info->length,
PCI_DMA_FROMDEVICE);
if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
put_page(buffer_info->page);
dev_kfree_skb(skb);
buffer_info->page = NULL;
buffer_info->skb = NULL;
buffer_info->dma = 0;
adapter->alloc_rx_buff_failed++;
break; /* while !buffer_info->skb */
}
}

rx_desc = E1000_RX_DESC(*rx_ring, i);
rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
Expand Down Expand Up @@ -4101,6 +4111,13 @@ static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
skb->data,
buffer_info->length,
PCI_DMA_FROMDEVICE);
if (pci_dma_mapping_error(pdev, buffer_info->dma)) {
dev_kfree_skb(skb);
buffer_info->skb = NULL;
buffer_info->dma = 0;
adapter->alloc_rx_buff_failed++;
break; /* while !buffer_info->skb */
}

/*
* XXX if it was allocated cleanly it will never map to a
Expand Down

0 comments on commit b5abb02

Please sign in to comment.