Commit ffc5e1f3 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

staging: greybus: drop loopback test files



The greybus loopback test tool does not belong burried down in a
driver-specific directory.  If it is needed, it should be somewhere
else, like in the testing directory.  But as the loopback driver is
probably never going to be merged out of the staging directory, let's
just delete the test alltogether for now.  If it's needed in the future,
it can be brought back with a revert.

Also, having an Android.mk file in the kernel source tree breaks some
Android build systems when trying to build from a read-only source tree,
the report of which prompted this being a good reason to remove it as
well.

Cc: Johan Hovold <johan@kernel.org>
Cc: Jack Schofield <schofija@oregonstate.edu>
Cc: Vaibhav Nagare <vnagare@redhat.com>
Cc: greybus-dev@lists.linaro.org
Acked-by: default avatarAlex Elder <elder@linaro.org>
Link: https://lore.kernel.org/r/2023040613-huntsman-goldsmith-4a41@gregkh


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 41500f45
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
loopback_test
+0 −10
Original line number Diff line number Diff line
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= loopback_test.c
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := gb_loopback_test

include $(BUILD_EXECUTABLE)
+0 −33
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
ifeq ($(strip $(V)), 1)
  Q =
else
  Q = @
endif

CFLAGS	+= -std=gnu99 -Wall -Wextra -g \
	    -D_GNU_SOURCE \
	    -Wno-unused-parameter \
	    -Wmaybe-uninitialized \
	    -Wredundant-decls \
	    -Wcast-align \
	    -Wsign-compare \
	    -Wno-missing-field-initializers \
	    -Wno-shift-negative-value

CC	:= $(CROSS_COMPILE)gcc

TOOLS = loopback_test

all: $(TOOLS)

%.o: %.c ../greybus_protocols.h
	@echo '  TARGET_CC $@'
	$(Q)$(CC) $(CFLAGS) -c $< -o $@

loopback_%: loopback_%.o
	@echo '  TARGET_LD $@'
	$(Q)$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@

clean::
	rm -f *.o $(TOOLS)
+0 −198
Original line number Diff line number Diff line


        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
+0 −169
Original line number Diff line number Diff line
#!/usr/bin/env python
# SPDX-License-Identifier: BSD-3-Clause

# Copyright (c) 2015 Google, Inc.
# Copyright (c) 2015 Linaro, Ltd.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from __future__ import print_function
import csv
import datetime
import sys
import time

dict = {'ping': '2', 'transfer': '3', 'sink': '4'}
verbose = 1

def abort():
	sys.exit(1)

def usage():
	print('Usage: looptest TEST SIZE ITERATIONS PATH\n\n'
	'  Run TEST for a number of ITERATIONS with operation data SIZE bytes\n'
	'  TEST may be \'ping\' \'transfer\' or \'sink\'\n'
	'  SIZE indicates the size of transfer <= greybus max payload bytes\n'
	'  ITERATIONS indicates the number of times to execute TEST at SIZE bytes\n'
	'             Note if ITERATIONS is set to zero then this utility will\n'
	'             initiate an infinite (non terminating) test and exit\n'
	'             without logging any metrics data\n'
	'  PATH indicates the sysfs path for the loopback greybus entries e.g.\n'
	'             /sys/bus/greybus/devices/endo0:1:1:1:1/\n'
	'Examples:\n'
	'  looptest transfer 128 10000\n'
	'  looptest ping 0 128\n'
	'  looptest sink 2030 32768\n'
	.format(sys.argv[0]), file=sys.stderr)

	abort()

def read_sysfs_int(path):
	try:
		f = open(path, "r");
		val = f.read();
		f.close()
		return int(val)
	except IOError as e:
		print("I/O error({0}): {1}".format(e.errno, e.strerror))
		print("Invalid path %s" % path)

def write_sysfs_val(path, val):
	try:
		f = open(path, "r+")
		f.write(val)
		f.close()
	except IOError as e:
		print("I/O error({0}): {1}".format(e.errno, e.strerror))
		print("Invalid path %s" % path)

def log_csv(test_name, size, iteration_max, sys_pfx):
	# file name will test_name_size_iteration_max.csv
	# every time the same test with the same parameters is run we will then
	# append to the same CSV with datestamp - representing each test dataset
	fname = test_name + '_' + size + '_' + str(iteration_max) + '.csv'

	try:
		# gather data set
		date = str(datetime.datetime.now())
		error = read_sysfs_int(sys_pfx + 'error')
		request_min = read_sysfs_int(sys_pfx + 'requests_per_second_min')
		request_max = read_sysfs_int(sys_pfx + 'requests_per_second_max')
		request_avg = read_sysfs_int(sys_pfx + 'requests_per_second_avg')
		latency_min = read_sysfs_int(sys_pfx + 'latency_min')
		latency_max = read_sysfs_int(sys_pfx + 'latency_max')
		latency_avg = read_sysfs_int(sys_pfx + 'latency_avg')
		throughput_min = read_sysfs_int(sys_pfx + 'throughput_min')
		throughput_max = read_sysfs_int(sys_pfx + 'throughput_max')
		throughput_avg = read_sysfs_int(sys_pfx + 'throughput_avg')

		# derive jitter
		request_jitter = request_max - request_min
		latency_jitter = latency_max - latency_min
		throughput_jitter = throughput_max - throughput_min

		# append data set to file
		with open(fname, 'a') as csvf:
			row = csv.writer(csvf, delimiter=",", quotechar="'",
					quoting=csv.QUOTE_MINIMAL)
			row.writerow([date, test_name, size, iteration_max, error,
					request_min, request_max, request_avg, request_jitter,
					latency_min, latency_max, latency_avg, latency_jitter,
					throughput_min, throughput_max, throughput_avg, throughput_jitter])
	except IOError as e:
		print("I/O error({0}): {1}".format(e.errno, e.strerror))

def loopback_run(test_name, size, iteration_max, sys_pfx):
	test_id = dict[test_name]
	try:
		# Terminate any currently running test
		write_sysfs_val(sys_pfx + 'type', '0')
		# Set parameter for no wait between messages
		write_sysfs_val(sys_pfx + 'ms_wait', '0')
		# Set operation size
		write_sysfs_val(sys_pfx + 'size', size)
		# Set iterations
		write_sysfs_val(sys_pfx + 'iteration_max', str(iteration_max))
		# Initiate by setting loopback operation type
		write_sysfs_val(sys_pfx + 'type', test_id)
		time.sleep(1)

		if iteration_max == 0:
			print ("Infinite test initiated CSV won't be logged\n")
			return

		previous = 0
		err = 0
		while True:
			# get current count bail out if it hasn't changed
			iteration_count = read_sysfs_int(sys_pfx + 'iteration_count')
			if previous == iteration_count:
				err = 1
				break
			elif iteration_count == iteration_max:
				break
			previous = iteration_count
			if verbose:
				print('%02d%% complete %d of %d ' %
					(100 * iteration_count / iteration_max,
					iteration_count, iteration_max))
			time.sleep(1)
		if err:
			print ('\nError executing test\n')
		else:
			log_csv(test_name, size, iteration_max, sys_pfx)
	except ValueError as ve:
		print("Error: %s " % format(e.strerror), file=sys.stderr)
		abort()

def main():
	if len(sys.argv) < 5:
		usage()

	if sys.argv[1] in dict.keys():
		loopback_run(sys.argv[1], sys.argv[2], int(sys.argv[3]), sys.argv[4])
	else:
		usage()
if __name__ == '__main__':
	main()
Loading