| #!/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) |