Hello,
I encountered performance problems and errors when I’m receiving bigger amount of data (more than approx 80 MB/s) on integrated ethernet on TX2 (ether_eqos).
Multiple messages in kernel log appear:
ubuntu@tegra-ubuntu:~$ dmesg
[...]
[ 5295.529451]
prx_desc[00 ffffff800ea7d9a0 154 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529474]
prx_desc[00 ffffff800ea7d9b0 155 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529502]
prx_desc[00 ffffff800ea7d9c0 156 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529531]
prx_desc[00 ffffff800ea7d9d0 157 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529552]
prx_desc[00 ffffff800ea7d9e0 158 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529574]
prx_desc[00 ffffff800ea7d9f0 159 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529603]
prx_desc[00 ffffff800ea7da00 160 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529624]
prx_desc[00 ffffff800ea7da10 161 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529649]
prx_desc[00 ffffff800ea7da20 162 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.529695]
prx_desc[00 ffffff800ea7da30 163 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530141]
prx_desc[00 ffffff800ea7da40 164 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530169]
prx_desc[00 ffffff800ea7da50 165 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530199]
prx_desc[00 ffffff800ea7da60 166 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530228]
prx_desc[00 ffffff800ea7da70 167 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530255]
prx_desc[00 ffffff800ea7da80 168 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530283]
prx_desc[00 ffffff800ea7da90 169 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530306]
prx_desc[00 ffffff800ea7daa0 170 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530329]
prx_desc[00 ffffff800ea7dab0 171 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530397]
prx_desc[00 ffffff800ea7dac0 172 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530460]
prx_desc[00 ffffff800ea7dae0 174 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530484]
prx_desc[00 ffffff800ea7db00 176 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530507]
prx_desc[00 ffffff800ea7db10 177 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530532]
prx_desc[00 ffffff800ea7db20 178 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.530562]
prx_desc[00 ffffff800ea7db30 179 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.531075]
prx_desc[00 ffffff800ea7db40 180 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.531100]
prx_desc[00 ffffff800ea7db50 181 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.531128]
prx_desc[00 ffffff800ea7db60 182 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
[ 5295.531211]
prx_desc[00 ffffff800ea7db70 183 RECEIVED FROM DEVICE] = 0x0:0x0:0x0:0x30208000
There are also errors and overruns in ifconfig output.
ubuntu@tegra-ubuntu:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:04:4b:8d:46:b5
inet addr:10.0.32.3 Bcast:10.0.47.255 Mask:255.255.240.0
inet6 addr: fe80::204:4bff:fe8d:46b5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1
RX packets:8575072 errors:3524 dropped:0 overruns:3524 frame:0
TX packets:89727 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:76345646337 (76.3 GB) TX bytes:5246902 (5.2 MB)
Interrupt:42
Interesting is that much fewer errors occur when the interface is monitored (i.e. is in promiscuous mode).
So far I’ve been able to learn the kernel message printed by eqos driver (source code from https://developer.nvidia.com/embedded/dlc/sources-r2821
under kernel-4.4/drivers/net/ethernet/nvidia/eqos) is performed in drv.c (dump_rx_desc call):
static int process_rx_completions(struct eqos_prv_data *pdata,
int quota, UINT qinx)
{
[...]
if (!(prx_desc->rdes3 & err_bits) &&
(prx_desc->rdes3 & EQOS_RDESC3_LD)) {
[...]
} else {
dump_rx_desc(qinx, prx_desc,
prx_ring->cur_rx);
if (!(prx_desc->rdes3 & EQOS_RDESC3_LD))
pr_debug("Received oversized pkt,"
"spanned across multiple desc\n");
/* recycle skb */
prx_swcx_desc->skb = skb;
dev->stats.rx_errors++;
eqos_update_rx_errors(dev,
prx_desc->rdes3);
}
[...]
Macros for prx_desc->rdes3 are defined in yheader.h (EQOS_RDESC3_*), so for this case we have rdes3 == 0x30208000 which stands for EQOS_RDESC3_FD | EQOS_RDESC3_FD | EQOS_RDESC3_OF | EQOS_RDESC3_ES.
Unfortunately these macros aren’t described in the header, so I couldn’t analyse the errors more.
Is there anyone who could help with fixing this issue?