Thread (14 messages) flat view 14 messages, 3 authors, 2021-02-13

Re: [PATCH net-next v2 1/5] lan743x: boost performance on cpu archs w/o dma cache snooping

From: Sergej Bauer <hidden>
Date: 2021-02-12 00:20:31
Also in: lkml

On Thursday, February 11, 2021 7:18:26 PM MSK you wrote:
From: Sven Van Asbroeck <redacted>

The buffers in the lan743x driver's receive ring are always 9K,
even when the largest packet that can be received (the mtu) is
much smaller. This performs particularly badly on cpu archs
without dma cache snooping (such as ARM): each received packet
results in a 9K dma_{map|unmap} operation, which is very expensive
because cpu caches need to be invalidated.

Careful measurement of the driver rx path on armv7 reveals that
the cpu spends the majority of its time waiting for cache
invalidation.

Optimize by keeping the rx ring buffer size as close as possible
to the mtu. This limits the amount of cache that requires
invalidation.

This optimization would normally force us to re-allocate all
ring buffers when the mtu is changed - a disruptive event,
because it can only happen when the network interface is down.

Remove the need to re-allocate all ring buffers by adding support
for multi-buffer frames. Now any combination of mtu and ring
buffer size will work. When the mtu changes from mtu1 to mtu2,
consumed buffers of size mtu1 are lazily replaced by newly
allocated buffers of size mtu2.

These optimizations double the rx performance on armv7.
Third parties report 3x rx speedup on armv8.

Tested with iperf3 on a freescale imx6qp + lan7430, both sides
set to mtu 1500 bytes, measure rx performance:

Before:
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-20.00  sec   550 MBytes   231 Mbits/sec    0
After:
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-20.00  sec  1.33 GBytes   570 Mbits/sec    0

Signed-off-by: Sven Van Asbroeck <redacted>
---
( for the reference to current speed, response to v1 of the patch can be found at
https://lkml.org/lkml/2021/2/5/472 )

Hi Sven
although whole set of tests might be an overly extensive, but after applying patch v2 [1/5]
tests are:
sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ ifmtu eth7 500
mtu =  500
sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ sudo test_ber -l eth7 -c 1000 -n 1000000 -f500 --no-conf
...
number of sent packets      = 1000000
number of received packets  = 747411
number of lost packets = 252589
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 252589
bit error rate         = 0.252589
average speed: 408.0757 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 738377
number of lost packets = 261623
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 261623
bit error rate         = 0.261623
average speed: 413.1470 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 738142
number of lost packets = 261858
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 261858
bit error rate         = 0.261858
average speed: 413.2262 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 708973
number of lost packets = 291027
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 291027
bit error rate         = 0.291027
average speed: 430.6224 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 725452
number of lost packets = 274548
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 274548
bit error rate         = 0.274548
average speed: 420.7341 Mbit/s

sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ ifmtu eth7 1500
mtu =  1500
sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ sudo test_ber -l eth7 -c 1000 -n 1000000 -f500 --no-conf
...
number of sent packets      = 1000000
number of received packets  = 714228
number of lost packets = 285772
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 285772
bit error rate         = 0.285772
average speed: 427.1300 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 750055
number of lost packets = 249945
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 249945
bit error rate         = 0.249945
average speed: 405.0383 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 689458
number of lost packets = 310542
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 310542
bit error rate         = 0.310542
average speed: 442.5301 Mbit/s

number of sent packets      = 1000000
number of received packets  = 676830
number of lost packets = 323170
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 323170
bit error rate         = 0.32317
average speed: 450.9439 Mbit/s

number of sent packets      = 1000000
number of received packets  = 701719
number of lost packets = 298281
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 298281
bit error rate         = 0.298281
average speed: 434.7563 Mbit/s

sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ sudo test_ber -l eth7 -c 1000 -n 1000000 -f1500 --no-conf
...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 643.5758 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 644.7713 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 645.4407 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 645.6741 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 646.0109 Mbit/s

sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ ifmtu eth7 9216
mtu =  9216
bauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ sudo test_ber -l eth7 -c 1000 -n 1000000 -f1500 --no-conf
...
number of sent packets      = 1000000
number of received packets  = 575141
number of lost packets = 424859
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 424859
bit error rate         = 0.424859
average speed: 646.7859 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 583353
number of lost packets = 416647
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 416647
bit error rate         = 0.416647
average speed: 637.8472 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 577127
number of lost packets = 422873
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 422873
bit error rate         = 0.422873
average speed: 644.5562 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 576916
number of lost packets = 423084
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 423084
bit error rate         = 0.423084
average speed: 644.8260 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 577154
number of lost packets = 422846
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 422846
bit error rate         = 0.422846
average speed: 644.6815 Mbit/s

sbauer@metamini ~/devel/kernel-works/net-next.git lan743x_virtual_phy$ sudo test_ber -l eth7 -c 1000 -n 1000000 -f9216 --no-conf
...
number of sent packets      = 1000000
number of received packets  = 1000000
number of lost packets = 0
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 0
bit error rate         = 0
average speed: 775.2005 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 999998
number of lost packets = 2
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 2
bit error rate         = 2e-06
average speed: 775.0468 Mbit/

...
number of sent packets      = 1000000
number of received packets  = 999998
number of lost packets = 2
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 2
bit error rate         = 2e-06
average speed: 775.2150 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 999997
number of lost packets = 3
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 3
bit error rate         = 3e-06
average speed: 775.2666 Mbit/s

...
number of sent packets      = 1000000
number of received packets  = 999999
number of lost packets = 1
number of out of order packets = 0
number of bit errors   = 0
total errors detected  = 1
bit error rate         = 1e-06
average speed: 775.2182 Mbit/s
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help