#!/usr/bin/env python # SPDX-License-Identifier: Apache-2.0 # # Copyright (C) 2017, ARM Limited, Google, and contributors. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import logging from conf import LisaLogging LisaLogging.setup() import json import os import devlib from env import TestEnv import argparse # Setup target configuration conf = { # Target platform and board "platform" : 'android', # Useful for reading names of little/big cluster # and energy model info, its device specific and use # only if needed for analysis # "board" : 'pixel', # Device # By default the device connected is detected, but if more than 1 # device, override the following to get a specific device. # "device" : "HT66N0300080", # Folder where all the results will be collected "results_dir" : "BinderThroughputTest", # Define devlib modules to load "modules" : [ 'cpufreq', # enable CPUFreq support 'cpuidle', # enable cpuidle support # 'cgroups' # Enable for cgroup support ], "emeter" : { 'instrument': 'monsoon', 'conf': { } }, "systrace": { 'extra_categories': ['binder_driver'], "extra_events": ["binder_transaction_alloc_buf"], }, # Tools required by the experiments "tools" : [ 'taskset'], } te = TestEnv(conf, wipe=False) target = te.target def experiment(workers, payload, iterations, cpu): target.cpufreq.set_all_governors("performance") cmd = "taskset -a {} /data/local/tmp/binderThroughputTest -p ".format(cpu) cmd += "-s {} -i {} -w {}".format(payload, iterations, workers) return target.execute(cmd) parser = argparse.ArgumentParser( description="Run binderThroughputTest and collect output.") parser.add_argument("--test", "-t", type=str, choices=["cs", "payload"], default="cs", help="cs: vary number of cs_pairs while control payload.\n" "payload: vary payload size while control cs_pairs.") parser.add_argument("--out_prefix", "-o", type=str, help="The kernel image used for running the test.") parser.add_argument("--cpu", "-c", type=str, default='f', help="cpus on which to run the tests.") parser.add_argument("--iterations", "-i", type=int, default=10000, help="Number of iterations to run the transaction.") parser.add_argument("--cs_pairs", type=int, nargs='+', default=[1, 2, 3, 4, 5], help="Varying client-server pairs.") parser.add_argument("--payload", type=int, default=0, help="Fixed payload in varying cs pairs.") parser.add_argument("--payloads", type=int, nargs='+', default=[0, 4096, 4096*2, 4096*4, 4096*8], help="Varying payloads.") parser.add_argument("--cs_pair", type=int, default=1, help="Fixed single cs pair in varying payload.") if __name__ == "__main__": args = parser.parse_args() results = [] if args.test == "cs": for cs in args.cs_pairs: result = experiment(cs*2, args.payload, args.iterations, args.cpu) results.append(result) out_file = os.path.join(te.res_dir, args.out_prefix + "_cs_" + str(args.payload)) with open(out_file, 'w') as f: for r in results: f.write("%s\n" % r) else: for pl in args.payloads: result = experiment(args.cs_pair*2, pl, args.iterations, args.cpu) results.append(result) out_file = os.path.join(te.res_dir, args.out_prefix + \ "_payload_" + str(args.cs_pair)) with open(out_file, 'w') as f: for r in results: f.write("%s\n" % r)