From: jonas.jensen@gmail.com (Jonas Jensen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 2/2] net: moxa: replace build_skb() with netdev_alloc_skb_ip_align() / memcpy()
Date: Tue, 19 Aug 2014 16:49:44 +0200 [thread overview]
Message-ID: <1408459784-9385-2-git-send-email-jonas.jensen@gmail.com> (raw)
In-Reply-To: <1408459784-9385-1-git-send-email-jonas.jensen@gmail.com>
build_skb() is used to make skbs out of existing RX ring memory
which is bad because the RX ring is allocated only once, on probe.
Memory corruption occur because said memory is reclaimed, i.e.
__kfree_skb() (and eventually put_page()).
Replace build_skb() with netdev_alloc_skb_ip_align() and use memcpy().
Also, synchronize DMA memory before passing skb to napi_gro_receive().
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=69041
Signed-off-by: Jonas Jensen <jonas.jensen@gmail.com>
---
Notes:
The original motivation was to avoid memcpy(), since the memory is
already allocated, why make a copy.
Maybe the copy can be avoided updating RX ring descriptor addresses;
new memory must be allocated just the same, the only difference that
the controller could write directly to it.
This fixes errors due to memory corruption, such as the following,
seen on wget download (or ncftp):
"read error: Bad address"
On receiving error, wget exits without resuming (busybox default).
Changes since v3:
1. commit message reworded
Applies to next-20140818
drivers/net/ethernet/moxa/moxart_ether.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/moxa/moxart_ether.c b/drivers/net/ethernet/moxa/moxart_ether.c
index aa45607..17c9f0e 100644
--- a/drivers/net/ethernet/moxa/moxart_ether.c
+++ b/drivers/net/ethernet/moxa/moxart_ether.c
@@ -226,14 +226,21 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
if (len > RX_BUF_SIZE)
len = RX_BUF_SIZE;
- skb = build_skb(priv->rx_buf[rx_head], priv->rx_buf_size);
+ dma_sync_single_for_cpu(&ndev->dev,
+ priv->rx_mapping[rx_head],
+ priv->rx_buf_size, DMA_FROM_DEVICE);
+ skb = netdev_alloc_skb_ip_align(ndev, len);
if (unlikely(!skb)) {
- net_dbg_ratelimited("build_skb failed\n");
+ net_dbg_ratelimited("netdev_alloc_skb_ip_align failed\n");
priv->stats.rx_dropped++;
priv->stats.rx_errors++;
}
-
+ memcpy(skb->data, priv->rx_buf[rx_head], len);
skb_put(skb, len);
+ dma_sync_single_for_device(&ndev->dev,
+ priv->rx_mapping[rx_head],
+ priv->rx_buf_size, DMA_FROM_DEVICE);
+
skb->protocol = eth_type_trans(skb, ndev);
napi_gro_receive(&priv->napi, skb);
rx++;
--
1.8.2.1
next prev parent reply other threads:[~2014-08-19 14:49 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-19 14:49 [PATCH v4 1/2] net: moxa: clear TX descriptor length bits Jonas Jensen
2014-08-19 14:49 ` Jonas Jensen [this message]
2014-08-19 18:31 ` [PATCH v4 2/2] net: moxa: replace build_skb() with netdev_alloc_skb_ip_align() / memcpy() Eric Dumazet
2014-08-20 14:24 ` Jonas Jensen
2014-08-20 14:19 ` [PATCH v5 " Jonas Jensen
2014-08-25 14:22 ` [PATCH v6 2/4] " Jonas Jensen
2014-08-26 0:26 ` David Miller
2014-08-26 9:04 ` Arnd Bergmann
2014-08-26 9:10 ` David Laight
2014-08-26 10:55 ` Eric Dumazet
2014-08-21 21:43 ` [PATCH v4 2/2] " Michał Mirosław
2014-08-25 14:23 ` Jonas Jensen
2014-08-20 14:18 ` [PATCH v5 1/2] net: moxa: clear TX descriptor length bits Jonas Jensen
2014-08-20 17:10 ` Eric Dumazet
2014-08-25 14:23 ` Jonas Jensen
2014-08-22 4:39 ` David Miller
2014-08-25 14:22 ` [PATCH v6 1/4] net: moxa: clear DESC1 on ndo_start_xmit() Jonas Jensen
2014-08-26 0:25 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1408459784-9385-2-git-send-email-jonas.jensen@gmail.com \
--to=jonas.jensen@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).