can: c_can: Another pile of fixes and improvements
Get series with b4
b4 am [email protected]Versions newest first · linked by author and title
- v2 Latest21 patches 4 repliesIn review
- v110 patches 14 repliesSuperseded
Changes in v2 from the cover letter
- Slightly modified version of the interrupt reduction patch
- Included the fix for PCH / C_CAN
- Lockless XMIT path
- Further reduction of register access
- Add the missing can.type setup in c_can_pci.c
- A pile of code cleanups.
Patches in v2 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/21 | can: c_can_pci: Set the type of the IP coredrivers/ | +2 | 0 replies | |
| 2/21 | can: c_can: Fix startup logicdrivers/ | +17 | 0 replies | |
| 3/21 | can: c_can: Make bus off interrupt disable logic workdrivers/ | +4 | 0 replies | |
| 4/21 | can: c_can: Do not access skb after net_receive_skb()drivers/ | +4 | 0 replies | |
| 5/21 | can: c_can: Handle state change correctlydrivers/ | +20 | 0 replies | |
| 6/21 | can: c_can: Fix berr reportingdrivers/ | +6 | 0 replies | |
| 7/21 | can: c_can: Always update error statsdrivers/ | +7 | 0 replies | |
| 8/21 | can: c_can: Simplify buffer reenablingdrivers/ | +6 | 0 replies | |
| 9/21 | can: c_can: Avoid status register update for D_CANdrivers/ | +6 | 0 replies | |
| 10/21 | can: c_can: Get rid of pointless interruptsdrivers/ drivers/ | +48 | 0 replies | |
| 11/21 | can: c_can : Disable rx split as workarounddrivers/ drivers/ | +55 | 0 replies | |
| 12/21 | can: c_can": Work around C_CAN RX wreckagedrivers/ drivers/ | +11 | 3 replies | |
| 13/21 | can: c_can: Cleanup irq enable/disabledrivers/ | +12 | 0 replies | |
| 14/21 | can: c_can: Cleanup c_can_read_msg_object()drivers/ | +15 | 0 replies | |
| 15/21 | can: c_can Cleanup setup of receive buffersdrivers/ | +18 | 0 replies | |
| 16/21 | can: c_can: Cleanup c_can_inval_msg_object()drivers/ | +5 | 0 replies | |
| 17/21 | can: c_can: Cleanup c_can_msg_obj_put/get()drivers/ | +16 | 0 replies | |
| 18/21 | can: c_can: Cleanup c_can_write_msg_object()drivers/ drivers/ | +25 | 0 replies | |
| 19/21 | can: c_can: Use proper u32 variables in c_can_write_msg_object()drivers/ | +9 | 0 replies | |
| 20/21 | can: c_can: Remove tx lockingdrivers/ drivers/ | +43 | 0 replies | |
| 21/21 | can: c_can: Speed up tx buffer invalidationdrivers/ drivers/ | +40 | 0 replies |
Reviews trailers per patch
None of the 21 patches has a Reviewed-by or Acked-by.
| Patch | Alexander Stein |
|---|---|
| Series | T-b |
| 1/21 | |
| 2/21 | |
| 3/21 | |
| 4/21 | |
| 5/21 | |
| 6/21 | |
| 7/21 | |
| 8/21 | |
| 9/21 | |
| 10/21 | |
| 11/21 | |
| 12/21 | Reported-and-tested-by |
| 13/21 | |
| 14/21 | |
| 15/21 | |
| 16/21 | |
| 17/21 | |
| 18/21 | |
| 19/21 | |
| 20/21 | |
| 21/21 |
Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.
Cover letter [patch V2 00/21] can: c_can: Another pile of fixes and improvements
Changes since V1:
- Slightly modified version of the interrupt reduction patch
- Included the fix for PCH / C_CAN
- Lockless XMIT path
- Further reduction of register access
- Add the missing can.type setup in c_can_pci.c
- A pile of code cleanups.
It would be nice to reduce the register access some more by relying completely on the status interrupt, but it turned out that the TX/RXOK is not reliable enough. So we need to invalidate the message objects in the tx softirq handling.
But the overall change of this series is that the I/O load gets reduced by about 45% according to perf top. Though that PCH thing sucks. The beaglebone manages to almost saturate the bus with short packets at 1Mbit while PCH fails miserably and thats solely related to the miserable I/O performance.
time cangen can0 -g0 -p10 -I5A5 -L0 -x -n 1000000
arm: real 0m51.510s I/O read: ~6% I/O write: 1.5% ~3.5s
x86: real 1m48.533s I/O read: ~29% I/O write: 0.8% ~32 s!!
That's both with HW loopback on, as my PCH does not have a tranceiver. Granted the C_CAN in the PCH needs the double IF transfer to prevent the message loss versus the D_CAN in the ARM chip, but even that taken into account makes a whopping 16s per 1M messages vs. 3.5s on ARM.
w/o loopback the arm I/O read load drops to ~3.5% on the sender side and ~5.5% on the receiver side. The time drops to 50.5s on the transmit side if we do not have to get all the RX packets from HW loopback. On TX we have a ~10us large gap every 16 packets which is caused by the queue stall as we have to wait for the last packet in the "FIFO" to be transferred.
It seems there is a reason why the ATOM perf events do not expose the stalled cpu cycles. But it's easy to figure out. You can compare the CAN load case with some other scenario which has 100% CPU utilization by running
# perf stat -a sleep 60
The interesting part is: insns per cycle
CAN: 0.23 insns per cycle
Other: 0.53 insns per cycle
I don't have comparison numbers for ARM due to not supported perf events, but the perf top numbers and the transfer performance tell a clear story.
There might be room for a few improvements, but I'm running out of cycles and I really want to get the IF3 DMA feature functional on the TI chips, but that seems to be an equally tedious reverse engineering problem as the rest of this.
Thanks,
tglx
---------
Kconfig | 7 c_can.c | 662 +++++++++++++++++++++++++++--------------------------------- c_can.h | 21 - c_can_pci.c | 2 4 files changed, 320 insertions(+), 372 deletions(-)