• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

linux-3.0.x for AP-SH4A-0A Board


コミットメタ情報

リビジョン468e4e387026f558ae1f1ac0fcc2f8985d4518b8 (tree)
日時2011-08-05 13:58:34
作者Guo-Fu Tseng <cooldavid@cool...>
コミッターGreg Kroah-Hartman

ログメッセージ

jme: Fix unmap error (Causing system freeze)

commit 94c5b41b327e08de0ddf563237855f55080652a1 upstream.

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. :)

Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Acked-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

変更サマリ

差分

--- 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)
753753 struct jme_ring *rxring = &(jme->rxring[0]);
754754 struct jme_buffer_info *rxbi = rxring->bufinf + i;
755755 struct sk_buff *skb;
756+ dma_addr_t mapping;
756757
757758 skb = netdev_alloc_skb(jme->dev,
758759 jme->dev->mtu + RX_EXTRA_LEN);
759760 if (unlikely(!skb))
760761 return -ENOMEM;
761762
763+ mapping = pci_map_page(jme->pdev, virt_to_page(skb->data),
764+ offset_in_page(skb->data), skb_tailroom(skb),
765+ PCI_DMA_FROMDEVICE);
766+ if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) {
767+ dev_kfree_skb(skb);
768+ return -ENOMEM;
769+ }
770+
771+ if (likely(rxbi->mapping))
772+ pci_unmap_page(jme->pdev, rxbi->mapping,
773+ rxbi->len, PCI_DMA_FROMDEVICE);
774+
762775 rxbi->skb = skb;
763776 rxbi->len = skb_tailroom(skb);
764- rxbi->mapping = pci_map_page(jme->pdev,
765- virt_to_page(skb->data),
766- offset_in_page(skb->data),
767- rxbi->len,
768- PCI_DMA_FROMDEVICE);
769-
777+ rxbi->mapping = mapping;
770778 return 0;
771779 }
772780