Re: CM-ITC, pch_can/c_can_pci, sendto() returning ENOBUFS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8/26/22 13:24, Jacob Kroon wrote:
On 8/25/22 15:25, Jacob Kroon wrote:
Hi,

I am using a CM-ITC board (https://www.compulab.com/products/computer-on-modules/cm-itc/) with an application that uses the CAN interface. After a while of successfully sending packets, sendto() starts returning ENOBUFS. I wait a whole second and try to send, several retries, but I get ENOBUFS every time. I'm using kernel 5.15.59, and I've tried both the pch_can and c_can_pci driver, but both show the same error.

In the console I see several of:
can0: can_put_echo_skb: BUG! echo_skb 0 is occupied

I've also tried to increase the txqueuelen to 1000, as suggested here

https://stackoverflow.com/questions/40424433/write-no-buffer-space-available-socket-can-linux-can

but I think that if I increase the queuelen the threads just block forever in sendto() (sockets are opened in blocking mode)

If I bring down the interface with

ifconfig can0 down
ifconfig can0 up

the transmitting does get unblocked.

Is there anything I can do to debug this further ? Any other ideas ?


First I get the print:

can_put_echo_skb: BUG! echo_skb 0 is occupied!

then netif_stop_queue() is called from here:

https://github.com/torvalds/linux/blob/master/drivers/net/can/c_can/c_can_main.c#L469

and then there is no call to netif_start_queue(), so the bus hangs.


Switching back to the pch_can driver. I'm guessing here but it would seem that the driver is not receiving the TX interrupt for 'PCH_TX_OBJ_END' that would wake up the netif queue, since with the changes below I can't reproduce the hang, although I'm still seeing a lot of "echo_skb <x> is occupied!":

diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c
index 964c8a09226a..75ad2272d9b2 100644
--- a/drivers/net/can/pch_can.c
+++ b/drivers/net/can/pch_can.c
@@ -719,8 +720,7 @@ static void pch_can_tx_complete(struct net_device *ndev, u32 int_stat)
                          PCH_IF_MCONT_DLC);
        stats->tx_bytes += dlc;
        stats->tx_packets++;
-       if (int_stat == PCH_TX_OBJ_END)
-               netif_wake_queue(ndev);
+       netif_wake_queue(ndev);
 }

Jacob



[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux