I have tested a simple kernel module device driver on Jetson TX1. The execution of a single write() and read() on device takes about 10.36 msec while running the same code on xilinx zcu102 (ARM Cortex A-53) takes 0.0053 msec.
I am wondering why kernel module device driver on Jetson TX1 is extremely slow.
The codes are attached.
I have seen this behaviour with other drivers as well.
----output of the code on Jetson TX1-----------
write-read execution time 10.573000 ms elapsed
write-read execution time 10.501000 ms elapsed
write-read execution time 10.477000 ms elapsed
write-read execution time 10.475000 ms elapsed
write-read execution time 10.434000 ms elapsed
write-read execution time 14.088000 ms elapsed
write-read execution time 10.431000 ms elapsed
write-read execution time 10.469000 ms elapsed
write-read execution time 10.395000 ms elapsed
write-read execution time 10.476000 ms elapsed
----output of the code on Xilinx Zynq zcu102-----
write-read execution time 0.012000 ms elapsed
write-read execution time 0.008000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.012000 ms elapsed
write-read execution time 0.007000 ms elapsed
write-read execution time 0.012000 ms elapsed
write-read execution time 0.012000 ms elapsed
write-read execution time 0.007000 ms elapsed
write-read execution time 0.013000 ms elapsed
You need to keep UART prints silent to disable prints from the driver which is eating away the CPU time.
10 iterations is not allowing the CPU (which is running @ 102Mhz) to ramp up to a higher clock to do the task faster.
Recommendation is to increase the CPU clock or run the loop for 1000 or more iterations.
Commenting out the printk(), I’m getting these values on Xavier DevKit:
write-read execution time 0.015000 ms elapsed
write-read execution time 0.009000 ms elapsed
write-read execution time 0.007000 ms elapsed
write-read execution time 0.007000 ms elapsed
write-read execution time 0.007000 ms elapsed
write-read execution time 0.006000 ms elapsed
write-read execution time 0.006000 ms elapsed
write-read execution time 0.006000 ms elapsed
write-read execution time 0.006000 ms elapsed
write-read execution time 0.006000 ms elapsed
Note with Xavier there is apparently an issue with directly referencing user space relative to the TX1. This kernel module does not IHMO properly use __copy_from_user() to get the user space string.
write-read execution time 0.004000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.000000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.001000 ms elapsed
write-read execution time 0.000000 ms elapsed
And the Xavier run over various power modes (earlier run was 30W 2CORES):
sudo nvpmodel -q
NV Power Mode: MAXN
0
sudo ./test
write-read execution time 0.020000 ms elapsed
write-read execution time 0.016000 ms elapsed
write-read execution time 0.009000 ms elapsed
write-read execution time 0.011000 ms elapsed
write-read execution time 0.010000 ms elapsed
write-read execution time 0.008000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.011000 ms elapsed
write-read execution time 0.014000 ms elapsed
write-read execution time 0.013000 ms elapsed
sudo nvpmodel -m 2
sudo nvpmodel -q
NV Power Mode: MODE_15W
2
sudo ./test
write-read execution time 0.042000 ms elapsed
write-read execution time 0.020000 ms elapsed
write-read execution time 0.016000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.015000 ms elapsed
write-read execution time 0.015000 ms elapsed
write-read execution time 0.014000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.013000 ms elapsed
sudo nvpmodel -m 6
sudo nvpmodel -q
NV Power Mode: MODE_30W_2CORE
6
sudo ./test
write-read execution time 0.015000 ms elapsed
write-read execution time 0.020000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.013000 ms elapsed
write-read execution time 0.009000 ms elapsed
write-read execution time 0.010000 ms elapsed
write-read execution time 0.009000 ms elapsed
write-read execution time 0.008000 ms elapsed
write-read execution time 0.009000 ms elapsed