[18/29] can: rx-offload: can_rx_offload_irq_offload_fifo(): continue on error
diff mbox series

Message ID 20191010121750.27237-19-mkl@pengutronix.de
State RFC
Delegated to: David Miller
Headers show
  • [01/29] can: dev: add missing of_node_put() after calling of_get_child_by_name()
Related show

Commit Message

Marc Kleine-Budde Oct. 10, 2019, 12:17 p.m. UTC
In case of a resource shortage, i.e. the rx_offload queue will overflow
or a skb fails to be allocated (due to OOM),
can_rx_offload_offload_one() will call mailbox_read() to discard the
mailbox and return an ERR_PTR.

If the hardware FIFO is empty can_rx_offload_offload_one() will return

In case a CAN frame was read from the hardware,
can_rx_offload_offload_one() returns the skb containing it.

Without this patch can_rx_offload_irq_offload_fifo() bails out if no skb
returned, regardless of the reason.

Similar to can_rx_offload_irq_offload_timestamp() in case of a resource
shortage the whole FIFO should be discarded, to avoid an IRQ storm and
give the system some time to recover. However if the FIFO is empty the
loop can be left.

With this patch the loop is left in case of empty FIFO, but not on

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
 drivers/net/can/rx-offload.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff mbox series

diff --git a/drivers/net/can/rx-offload.c b/drivers/net/can/rx-offload.c
index 42a1b7d1c753..f6274dbb292c 100644
--- a/drivers/net/can/rx-offload.c
+++ b/drivers/net/can/rx-offload.c
@@ -230,7 +230,9 @@  int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload)
 	while (1) {
 		skb = can_rx_offload_offload_one(offload, 0);
-		if (IS_ERR_OR_NULL(skb))
+		if (IS_ERR(skb))
+			continue;
+		if (!skb)
 		skb_queue_tail(&offload->skb_queue, skb);