Thread (6 messages) 6 messages, 3 authors, 2016-03-03

RE: [PATCH] can: rcar_canfd: Add Renesas R-Car CAN FD driver

From: Ramesh Shanmugasundaram <hidden>
Date: 2016-03-03 13:48:14
Also in: linux-can, linux-renesas-soc, netdev

Hi Marc,

Sorry for the late response.
On 03/02/2016 11:08 AM, Ramesh Shanmugasundaram wrote:
quoted
quoted
quoted
quoted
I see no locking for the tx-path.
I am not sure why locking is needed in tx-path?
If the tx-path is shared between both channels you need locking as
the networking subsystem may send one frame to each controller at the
same time.
Yes. Tx completion interrupt is shared by both channels but the Tx
FIFO, echo skbs, head, tail are maintained on a per channel basis.
Yes, net subsystem can send one frame to each channel at the same time
and the tx completion interrupt handler will traverse each channel &
update per channel context accordingly.
Ok. Which instruction starts the transmit? Please add a comment to the
code.
Please see

---<snip>---

+	/* Start Tx: Write 0xff to CFPC to increment the CPU-side
+	 * pointer for the Common FIFO
+	 */
+	rcar_canfd_write(priv, RCANFD_CFPCTR(ch, RCANFD_CFFIFO_IDX), 0xff);

---<snip>---
You stop the tx_queue after this, so your code is racy, as the
interrupt might happen in between.
It is a very good point. Thank you. 
I managed to reproduce this issue once with 50Kbps rate and ignoring -ENOBUFS in user space. It also exposed another subtle issue in the echo skb management where the tx_done loop pushes the skb before the actual ACK for that index happens. Fixed both issues.
As you mentioned, I have introduced a lock to protect this critical section. I'll send the updates in the next v2 patch.

Thanks,
Ramesh
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help