Commit d974730c authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-lantiq_xrx200-fix-errors-under-memory-pressure'

Aleksander Jan Bajkowski says:

====================
net: lantiq_xrx200: fix errors under memory pressure

This series fixes issues that can occur in the driver under memory pressure.
Situations when the system cannot allocate memory are rare, so the mentioned
bugs have been fixed recently. The patches have been tested on a BT Home
router with the Lantiq xRX200 chipset.

Changelog:
  v3: - removed netdev_err() log from the first patch
  v2:
   - the second patch has been changed, so that under memory pressure situation
     the driver will not receive packets indefinitely regardless of the NAPI budget,
   - the third patch has been added.
====================

Link: https://lore.kernel.org/r/20220824215408.4695-1-olek2@wp.plSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents a3a57bf0 c9c3b177
...@@ -193,6 +193,7 @@ static int xrx200_alloc_buf(struct xrx200_chan *ch, void *(*alloc)(unsigned int ...@@ -193,6 +193,7 @@ static int xrx200_alloc_buf(struct xrx200_chan *ch, void *(*alloc)(unsigned int
ch->rx_buff[ch->dma.desc] = alloc(priv->rx_skb_size); ch->rx_buff[ch->dma.desc] = alloc(priv->rx_skb_size);
if (!ch->rx_buff[ch->dma.desc]) { if (!ch->rx_buff[ch->dma.desc]) {
ch->rx_buff[ch->dma.desc] = buf;
ret = -ENOMEM; ret = -ENOMEM;
goto skip; goto skip;
} }
...@@ -239,6 +240,12 @@ static int xrx200_hw_receive(struct xrx200_chan *ch) ...@@ -239,6 +240,12 @@ static int xrx200_hw_receive(struct xrx200_chan *ch)
} }
skb = build_skb(buf, priv->rx_skb_size); skb = build_skb(buf, priv->rx_skb_size);
if (!skb) {
skb_free_frag(buf);
net_dev->stats.rx_dropped++;
return -ENOMEM;
}
skb_reserve(skb, NET_SKB_PAD); skb_reserve(skb, NET_SKB_PAD);
skb_put(skb, len); skb_put(skb, len);
...@@ -288,7 +295,7 @@ static int xrx200_poll_rx(struct napi_struct *napi, int budget) ...@@ -288,7 +295,7 @@ static int xrx200_poll_rx(struct napi_struct *napi, int budget)
if (ret == XRX200_DMA_PACKET_IN_PROGRESS) if (ret == XRX200_DMA_PACKET_IN_PROGRESS)
continue; continue;
if (ret != XRX200_DMA_PACKET_COMPLETE) if (ret != XRX200_DMA_PACKET_COMPLETE)
return ret; break;
rx++; rx++;
} else { } else {
break; break;
......
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