Commit 9fe1b3bc authored by Jonas Jensen's avatar Jonas Jensen Committed by David S. Miller

net: moxa: replace build_skb() with netdev_alloc_skb_ip_align() / memcpy()

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

Remove SKB_DATA_ALIGN() from RX buffer size while we're at it.

Addresses https://bugzilla.kernel.org/show_bug.cgi?id=69041Signed-off-by: default avatarJonas Jensen <jonas.jensen@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b853f319
...@@ -226,13 +226,15 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget) ...@@ -226,13 +226,15 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)
if (len > RX_BUF_SIZE) if (len > RX_BUF_SIZE)
len = RX_BUF_SIZE; len = RX_BUF_SIZE;
skb = build_skb(priv->rx_buf[rx_head], priv->rx_buf_size); skb = netdev_alloc_skb_ip_align(ndev, len);
if (unlikely(!skb)) { 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_dropped++;
priv->stats.rx_errors++; priv->stats.rx_errors++;
} }
memcpy(skb->data, priv->rx_buf[rx_head], len);
skb_put(skb, len); skb_put(skb, len);
skb->protocol = eth_type_trans(skb, ndev); skb->protocol = eth_type_trans(skb, ndev);
napi_gro_receive(&priv->napi, skb); napi_gro_receive(&priv->napi, skb);
...@@ -464,8 +466,7 @@ static int moxart_mac_probe(struct platform_device *pdev) ...@@ -464,8 +466,7 @@ static int moxart_mac_probe(struct platform_device *pdev)
spin_lock_init(&priv->txlock); spin_lock_init(&priv->txlock);
priv->tx_buf_size = TX_BUF_SIZE; priv->tx_buf_size = TX_BUF_SIZE;
priv->rx_buf_size = RX_BUF_SIZE + priv->rx_buf_size = RX_BUF_SIZE;
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
priv->tx_desc_base = dma_alloc_coherent(NULL, TX_REG_DESC_SIZE * priv->tx_desc_base = dma_alloc_coherent(NULL, TX_REG_DESC_SIZE *
TX_DESC_NUM, &priv->tx_base, TX_DESC_NUM, &priv->tx_base,
......
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