Commit 05b346b5 authored by Linas Vepstas's avatar Linas Vepstas Committed by Jeff Garzik

Spidernet RX skb mem leak

One of the unlikely error branches has an skb memory leak.
Fix this by handling the error conditions consistently.
Signed-off-by: default avatarLinas Vepstas <linas@austin.ibm.com>
Cc: James K Lewis <jklewis@us.ibm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 1cd173f6
...@@ -913,8 +913,8 @@ spider_net_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) ...@@ -913,8 +913,8 @@ spider_net_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
* *
* returns 1 on success, 0 if no packet was passed to the stack * returns 1 on success, 0 if no packet was passed to the stack
* *
* iommu-unmaps the skb, fills out skb structure and passes the data to the * Fills out skb structure and passes the data to the stack.
* stack. The descriptor state is not changed. * The descriptor state is not changed.
*/ */
static int static int
spider_net_pass_skb_up(struct spider_net_descr *descr, spider_net_pass_skb_up(struct spider_net_descr *descr,
...@@ -929,10 +929,6 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, ...@@ -929,10 +929,6 @@ spider_net_pass_skb_up(struct spider_net_descr *descr,
netdev = card->netdev; netdev = card->netdev;
/* unmap descriptor */
pci_unmap_single(card->pdev, descr->buf_addr, SPIDER_NET_MAX_FRAME,
PCI_DMA_FROMDEVICE);
/* the cases we'll throw away the packet immediately */ /* the cases we'll throw away the packet immediately */
if (data_error & SPIDER_NET_DESTROY_RX_FLAGS) { if (data_error & SPIDER_NET_DESTROY_RX_FLAGS) {
if (netif_msg_rx_err(card)) if (netif_msg_rx_err(card))
...@@ -1015,6 +1011,11 @@ spider_net_decode_one_descr(struct spider_net_card *card) ...@@ -1015,6 +1011,11 @@ spider_net_decode_one_descr(struct spider_net_card *card)
chain->tail = descr->next; chain->tail = descr->next;
result = 0; result = 0;
/* unmap descriptor */
pci_unmap_single(card->pdev, descr->buf_addr,
SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE);
if ( (status == SPIDER_NET_DESCR_RESPONSE_ERROR) || if ( (status == SPIDER_NET_DESCR_RESPONSE_ERROR) ||
(status == SPIDER_NET_DESCR_PROTECTION_ERROR) || (status == SPIDER_NET_DESCR_PROTECTION_ERROR) ||
(status == SPIDER_NET_DESCR_FORCE_END) ) { (status == SPIDER_NET_DESCR_FORCE_END) ) {
...@@ -1022,8 +1023,6 @@ spider_net_decode_one_descr(struct spider_net_card *card) ...@@ -1022,8 +1023,6 @@ spider_net_decode_one_descr(struct spider_net_card *card)
pr_err("%s: dropping RX descriptor with state %d\n", pr_err("%s: dropping RX descriptor with state %d\n",
card->netdev->name, status); card->netdev->name, status);
card->netdev_stats.rx_dropped++; card->netdev_stats.rx_dropped++;
pci_unmap_single(card->pdev, descr->buf_addr,
SPIDER_NET_MAX_FRAME, PCI_DMA_FROMDEVICE);
dev_kfree_skb_irq(descr->skb); dev_kfree_skb_irq(descr->skb);
goto refill; goto refill;
} }
...@@ -1031,9 +1030,10 @@ spider_net_decode_one_descr(struct spider_net_card *card) ...@@ -1031,9 +1030,10 @@ spider_net_decode_one_descr(struct spider_net_card *card)
if ( (status != SPIDER_NET_DESCR_COMPLETE) && if ( (status != SPIDER_NET_DESCR_COMPLETE) &&
(status != SPIDER_NET_DESCR_FRAME_END) ) { (status != SPIDER_NET_DESCR_FRAME_END) ) {
if (netif_msg_rx_err(card)) if (netif_msg_rx_err(card))
pr_err("%s: RX descriptor with state %d\n", pr_err("%s: RX descriptor with unkown state %d\n",
card->netdev->name, status); card->netdev->name, status);
card->spider_stats.rx_desc_unk_state++; card->spider_stats.rx_desc_unk_state++;
dev_kfree_skb_irq(descr->skb);
goto refill; goto refill;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment