Hello, On Thu, Aug 11, 2022 at 11:42:54AM +0200, Marc Kleine-Budde wrote: > The following happened on an i.MX25 using flexcan with many packets on > the bus: > > The rx-offload queue reached a length more than skb_queue_len_max. In > can_rx_offload_offload_one() the drop variable was set to true which > made the call to .mailbox_read() (here: flexcan_mailbox_read()) to > _always_ return ERR_PTR(-ENOBUFS) and drop the rx'ed CAN frame. So > can_rx_offload_offload_one() returned ERR_PTR(-ENOBUFS), too. > > can_rx_offload_irq_offload_fifo() looks as follows: > > | while (1) { > | skb = can_rx_offload_offload_one(offload, 0); > | if (IS_ERR(skb)) > | continue; > | if (!skb) > | break; > | ... > | } > > The flexcan driver wrongly always returns ERR_PTR(-ENOBUFS) if drop is > requested, even if there is no CAN frame pending. As the i.MX25 is a > single core CPU, while the rx-offload processing is active, there is > no thread to process packets from the offload queue. So the queue > doesn't get any shorter and this results is a tight loop. > > Instead of always returning ERR_PTR(-ENOBUFS) if drop is requested, > return NULL if no CAN frame is pending. > > Fixes: 4e9c9484b085 ("can: rx-offload: Prepare for CAN FD support") > Suggested-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> That change fixes the problem I saw. Reviewed-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> Thanks for your followup! Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |
Attachment:
signature.asc
Description: PGP signature