Message ID | 1311217056-9073-1-git-send-email-cooldavid@cooldavid.org |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
* cooldavid@cooldavid.org (cooldavid@cooldavid.org) wrote: > From: Guo-Fu Tseng <cooldavid@cooldavid.org> > > This patch add the missing dma_unmap(). > Which solved the critical issue of system freeze on heavy load. > > Michal Miroslaw's rejected patch: > [PATCH v2 10/46] net: jme: convert to generic DMA API > Pointed out the issue also, thank you Michal. > But the fix was incorrect. It would unmap needed address > when low memory. > > Got lots of feedback from End user and Gentoo Bugzilla. > https://bugs.gentoo.org/show_bug.cgi?id=373109 > Thank you all. :) Also referred to in kernel bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=39312 > Cc: stable@kernel.org > Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org> Acked-by: Chris Wright <chrisw@sous-sol.org> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Chris Wright <chrisw@sous-sol.org> Date: Thu, 21 Jul 2011 12:30:08 -0700 > * cooldavid@cooldavid.org (cooldavid@cooldavid.org) wrote: >> From: Guo-Fu Tseng <cooldavid@cooldavid.org> >> >> This patch add the missing dma_unmap(). >> Which solved the critical issue of system freeze on heavy load. >> >> Michal Miroslaw's rejected patch: >> [PATCH v2 10/46] net: jme: convert to generic DMA API >> Pointed out the issue also, thank you Michal. >> But the fix was incorrect. It would unmap needed address >> when low memory. >> >> Got lots of feedback from End user and Gentoo Bugzilla. >> https://bugs.gentoo.org/show_bug.cgi?id=373109 >> Thank you all. :) > > Also referred to in kernel bugzilla: > > https://bugzilla.kernel.org/show_bug.cgi?id=39312 > >> Cc: stable@kernel.org >> Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org> > > Acked-by: Chris Wright <chrisw@sous-sol.org> Applied, but it's too late for 3.0 so I'll just submit it to all the -stable branches after 3.0-final is released. Thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
2011/7/21 <cooldavid@cooldavid.org>: > From: Guo-Fu Tseng <cooldavid@cooldavid.org> > > This patch add the missing dma_unmap(). > Which solved the critical issue of system freeze on heavy load. > > Michal Miroslaw's rejected patch: > [PATCH v2 10/46] net: jme: convert to generic DMA API > Pointed out the issue also, thank you Michal. > But the fix was incorrect. It would unmap needed address > when low memory. My patch also fixed another issue - from correctness point of view, you should not use virt_to_page+dma_map_page here, but dma_map_single. Best Regards, Michał Mirosław -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/jme.c b/drivers/net/jme.c index b5b174a..1973814 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c @@ -753,20 +753,28 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i) struct jme_ring *rxring = &(jme->rxring[0]); struct jme_buffer_info *rxbi = rxring->bufinf + i; struct sk_buff *skb; + dma_addr_t mapping; skb = netdev_alloc_skb(jme->dev, jme->dev->mtu + RX_EXTRA_LEN); if (unlikely(!skb)) return -ENOMEM; + mapping = pci_map_page(jme->pdev, virt_to_page(skb->data), + offset_in_page(skb->data), skb_tailroom(skb), + PCI_DMA_FROMDEVICE); + if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) { + dev_kfree_skb(skb); + return -ENOMEM; + } + + if (likely(rxbi->mapping)) + pci_unmap_page(jme->pdev, rxbi->mapping, + rxbi->len, PCI_DMA_FROMDEVICE); + rxbi->skb = skb; rxbi->len = skb_tailroom(skb); - rxbi->mapping = pci_map_page(jme->pdev, - virt_to_page(skb->data), - offset_in_page(skb->data), - rxbi->len, - PCI_DMA_FROMDEVICE); - + rxbi->mapping = mapping; return 0; }