| |
| |
| 1 - LOOPBACK DRIVER |
| |
| The driver implements the main logic of the loopback test and provides |
| sysfs files to configure the test and retrieve the results. |
| A user could run a test without the need of the test application given |
| that he understands the sysfs interface of the loopback driver. |
| |
| The loopback kernel driver needs to be loaded and at least one module |
| with the loopback feature enabled must be present for the sysfs files to be |
| created and for the loopback test application to be able to run. |
| |
| To load the module: |
| # modprobe gb-loopback |
| |
| |
| When the module is probed, New files are available on the sysfs |
| directory of the detected loopback device. |
| (typically under "/sys/bus/graybus/devices"). |
| |
| Here is a short summary of the sysfs interface files that should be visible: |
| |
| * Loopback Configuration Files: |
| async - Use asynchronous operations. |
| iteration_max - Number of tests iterations to perform. |
| size - payload size of the transfer. |
| timeout - The number of microseconds to give an individual |
| asynchronous request before timing out. |
| us_wait - Time to wait between 2 messages |
| type - By writing the test type to this file, the test starts. |
| Valid tests are: |
| 0 stop the test |
| 2 - ping |
| 3 - transfer |
| 4 - sink |
| |
| * Loopback feedback files: |
| error - number of errors that have occurred. |
| iteration_count - Number of iterations performed. |
| requests_completed - Number of requests successfully completed. |
| requests_timedout - Number of requests that have timed out. |
| timeout_max - Max allowed timeout |
| timeout_min - Min allowed timeout. |
| |
| * Loopback result files: |
| apbridge_unipro_latency_avg |
| apbridge_unipro_latency_max |
| apbridge_unipro_latency_min |
| gpbridge_firmware_latency_avg |
| gpbridge_firmware_latency_max |
| gpbridge_firmware_latency_min |
| requests_per_second_avg |
| requests_per_second_max |
| requests_per_second_min |
| latency_avg |
| latency_max |
| latency_min |
| throughput_avg |
| throughput_max |
| throughput_min |
| |
| |
| |
| 2 - LOOPBACK TEST APPLICATION |
| |
| The loopback test application manages and formats the results provided by |
| the loopback kernel module. The purpose of this application |
| is to: |
| - Start and manage multiple loopback device tests concurrently. |
| - Calculate the aggregate results for multiple devices. |
| - Gather and format test results (csv or human readable). |
| |
| The best way to get up to date usage information for the application is |
| usually to pass the "-h" parameter. |
| Here is the summary of the available options: |
| |
| Mandatory arguments |
| -t must be one of the test names - sink, transfer or ping |
| -i iteration count - the number of iterations to run the test over |
| Optional arguments |
| -S sysfs location - location for greybus 'endo' entries default /sys/bus/greybus/devices/ |
| -D debugfs location - location for loopback debugfs entries default /sys/kernel/debug/gb_loopback/ |
| -s size of data packet to send during test - defaults to zero |
| -m mask - a bit mask of connections to include example: -m 8 = 4th connection -m 9 = 1st and 4th connection etc |
| default is zero which means broadcast to all connections |
| -v verbose output |
| -d debug output |
| -r raw data output - when specified the full list of latency values are included in the output CSV |
| -p porcelain - when specified printout is in a user-friendly non-CSV format. This option suppresses writing to CSV file |
| -a aggregate - show aggregation of all enabled devies |
| -l list found loopback devices and exit. |
| -x Async - Enable async transfers. |
| -o Timeout - Timeout in microseconds for async operations. |
| |
| |
| |
| 3 - REAL WORLD EXAMPLE USAGES |
| |
| 3.1 - Using the driver sysfs files to run a test on a single device: |
| |
| * Run a 1000 transfers of a 100 byte packet. Each transfer is started only |
| after the previous one finished successfully: |
| echo 0 > /sys/bus/greybus/devices/1-2.17/type |
| echo 0 > /sys/bus/greybus/devices/1-2.17/async |
| echo 2000 > /sys/bus/greybus/devices/1-2.17/us_wait |
| echo 100 > /sys/bus/greybus/devices/1-2.17/size |
| echo 1000 > /sys/bus/greybus/devices/1-2.17/iteration_max |
| echo 0 > /sys/bus/greybus/devices/1-2.17/mask |
| echo 200000 > /sys/bus/greybus/devices/1-2.17/timeout |
| echo 3 > /sys/bus/greybus/devices/1-2.17/type |
| |
| * Run a 1000 transfers of a 100 byte packet. Transfers are started without |
| waiting for the previous one to finish: |
| echo 0 > /sys/bus/greybus/devices/1-2.17/type |
| echo 3 > /sys/bus/greybus/devices/1-2.17/async |
| echo 0 > /sys/bus/greybus/devices/1-2.17/us_wait |
| echo 100 > /sys/bus/greybus/devices/1-2.17/size |
| echo 1000 > /sys/bus/greybus/devices/1-2.17/iteration_max |
| echo 0 > /sys/bus/greybus/devices/1-2.17/mask |
| echo 200000 > /sys/bus/greybus/devices/1-2.17/timeout |
| echo 3 > /sys/bus/greybus/devices/1-2.17/type |
| |
| * Read the results from sysfs: |
| cat /sys/bus/greybus/devices/1-2.17/requests_per_second_min |
| cat /sys/bus/greybus/devices/1-2.17/requests_per_second_max |
| cat /sys/bus/greybus/devices/1-2.17/requests_per_second_avg |
| |
| cat /sys/bus/greybus/devices/1-2.17/latency_min |
| cat /sys/bus/greybus/devices/1-2.17/latency_max |
| cat /sys/bus/greybus/devices/1-2.17/latency_avg |
| |
| cat /sys/bus/greybus/devices/1-2.17/apbridge_unipro_latency_min |
| cat /sys/bus/greybus/devices/1-2.17/apbridge_unipro_latency_max |
| cat /sys/bus/greybus/devices/1-2.17/apbridge_unipro_latency_avg |
| |
| cat /sys/bus/greybus/devices/1-2.17/gpbridge_firmware_latency_min |
| cat /sys/bus/greybus/devices/1-2.17/gpbridge_firmware_latency_max |
| cat /sys/bus/greybus/devices/1-2.17/gpbridge_firmware_latency_avg |
| |
| cat /sys/bus/greybus/devices/1-2.17/error |
| cat /sys/bus/greybus/devices/1-2.17/requests_completed |
| cat /sys/bus/greybus/devices/1-2.17/requests_timedout |
| |
| |
| 3.2 - using the test application: |
| |
| * Run a transfer test 10 iterations of size 100 bytes on all available devices |
| #/loopback_test -t transfer -i 10 -s 100 |
| 1970-1-1 0:10:7,transfer,1-4.17,100,10,0,443,509,471.700012,66,1963,2256,2124.600098,293,102776,118088,109318.898438,15312,1620,1998,1894.099976,378,56,57,56.799999,1 |
| 1970-1-1 0:10:7,transfer,1-5.17,100,10,0,399,542,463.399994,143,1845,2505,2175.800049,660,92568,125744,107393.296875,33176,1469,2305,1806.500000,836,56,57,56.799999,1 |
| |
| |
| * Show the aggregate results of both devices. ("-a") |
| #/loopback_test -t transfer -i 10 -s 100 -a |
| 1970-1-1 0:10:35,transfer,1-4.17,100,10,0,448,580,494.100006,132,1722,2230,2039.400024,508,103936,134560,114515.703125,30624,1513,1980,1806.900024,467,56,57,57.299999,1 |
| 1970-1-1 0:10:35,transfer,1-5.17,100,10,0,383,558,478.600006,175,1791,2606,2115.199951,815,88856,129456,110919.703125,40600,1457,2246,1773.599976,789,56,57,57.099998,1 |
| 1970-1-1 0:10:35,transfer,aggregate,100,10,0,383,580,486.000000,197,1722,2606,2077.000000,884,88856,134560,112717.000000,45704,1457,2246,1789.000000,789,56,57,57.000000,1 |
| |
| * Example usage of the mask option to select which devices will |
| run the test (1st, 2nd, or both devices): |
| # /loopback_test -t transfer -i 10 -s 100 -m 1 |
| 1970-1-1 0:11:56,transfer,1-4.17,100,10,0,514,558,544.900024,44,1791,1943,1836.599976,152,119248,129456,126301.296875,10208,1600,1001609,101613.601562,1000009,56,57,56.900002,1 |
| # /loopback_test -t transfer -i 10 -s 100 -m 2 |
| 1970-1-1 0:12:0,transfer,1-5.17,100,10,0,468,554,539.000000,86,1804,2134,1859.500000,330,108576,128528,124932.500000,19952,1606,1626,1619.300049,20,56,57,57.400002,1 |
| # /loopback_test -t transfer -i 10 -s 100 -m 3 |
| 1970-1-1 0:12:3,transfer,1-4.17,100,10,0,432,510,469.399994,78,1959,2313,2135.800049,354,100224,118320,108785.296875,18096,1610,2024,1893.500000,414,56,57,57.200001,1 |
| 1970-1-1 0:12:3,transfer,1-5.17,100,10,0,404,542,468.799988,138,1843,2472,2152.500000,629,93728,125744,108646.101562,32016,1504,2247,1853.099976,743,56,57,57.099998,1 |
| |
| * Show output in human readable format ("-p") |
| # /loopback_test -t transfer -i 10 -s 100 -m 3 -p |
| |
| 1970-1-1 0:12:37 |
| test: transfer |
| path: 1-4.17 |
| size: 100 |
| iterations: 10 |
| errors: 0 |
| async: Disabled |
| requests per-sec: min=390, max=547, average=469.299988, jitter=157 |
| ap-throughput B/s: min=90480 max=126904 average=108762.101562 jitter=36424 |
| ap-latency usec: min=1826 max=2560 average=2146.000000 jitter=734 |
| apbridge-latency usec: min=1620 max=1982 average=1882.099976 jitter=362 |
| gpbridge-latency usec: min=56 max=57 average=57.099998 jitter=1 |
| |
| |
| 1970-1-1 0:12:37 |
| test: transfer |
| path: 1-5.17 |
| size: 100 |
| iterations: 10 |
| errors: 0 |
| async: Disabled |
| requests per-sec: min=397, max=538, average=461.700012, jitter=141 |
| ap-throughput B/s: min=92104 max=124816 average=106998.898438 jitter=32712 |
| ap-latency usec: min=1856 max=2514 average=2185.699951 jitter=658 |
| apbridge-latency usec: min=1460 max=2296 average=1828.599976 jitter=836 |
| gpbridge-latency usec: min=56 max=57 average=57.099998 jitter=1 |