1#!/usr/bin/env python 2# SPDX-License-Identifier: Apache-2.0 3# 4# Copyright (C) 2017, ARM Limited, Google, and contributors. 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); you may 7# not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17# 18 19import logging 20from conf import LisaLogging 21LisaLogging.setup() 22 23import json 24import os 25import devlib 26from env import TestEnv 27import argparse 28 29# Setup target configuration 30conf = { 31 # Target platform and board 32 "platform" : 'android', 33 # Useful for reading names of little/big cluster 34 # and energy model info, its device specific and use 35 # only if needed for analysis 36 # "board" : 'pixel', 37 # Device 38 # By default the device connected is detected, but if more than 1 39 # device, override the following to get a specific device. 40 # "device" : "HT66N0300080", 41 # Folder where all the results will be collected 42 "results_dir" : "BinderThroughputTest", 43 # Define devlib modules to load 44 "modules" : [ 45 'cpufreq', # enable CPUFreq support 46 'cpuidle', # enable cpuidle support 47 # 'cgroups' # Enable for cgroup support 48 ], 49 "emeter" : { 50 'instrument': 'monsoon', 51 'conf': { } 52 }, 53 "systrace": { 54 'extra_categories': ['binder_driver'], 55 "extra_events": ["binder_transaction_alloc_buf"], 56 }, 57 # Tools required by the experiments 58 "tools" : [ 'taskset'], 59} 60 61te = TestEnv(conf, wipe=False) 62target = te.target 63 64def experiment(workers, payload, iterations, cpu): 65 target.cpufreq.set_all_governors("performance") 66 cmd = "taskset -a {} /data/local/tmp/binderThroughputTest -p ".format(cpu) 67 cmd += "-s {} -i {} -w {}".format(payload, iterations, workers) 68 return target.execute(cmd) 69 70parser = argparse.ArgumentParser( 71 description="Run binderThroughputTest and collect output.") 72 73parser.add_argument("--test", "-t", type=str, 74 choices=["cs", "payload"], 75 default="cs", 76 help="cs: vary number of cs_pairs while control payload.\n" 77 "payload: vary payload size while control cs_pairs.") 78parser.add_argument("--out_prefix", "-o", type=str, 79 help="The kernel image used for running the test.") 80parser.add_argument("--cpu", "-c", type=str, 81 default='f', 82 help="cpus on which to run the tests.") 83parser.add_argument("--iterations", "-i", type=int, 84 default=10000, 85 help="Number of iterations to run the transaction.") 86 87parser.add_argument("--cs_pairs", type=int, nargs='+', 88 default=[1, 2, 3, 4, 5], 89 help="Varying client-server pairs.") 90parser.add_argument("--payload", type=int, default=0, 91 help="Fixed payload in varying cs pairs.") 92 93parser.add_argument("--payloads", type=int, nargs='+', 94 default=[0, 4096, 4096*2, 4096*4, 4096*8], 95 help="Varying payloads.") 96parser.add_argument("--cs_pair", type=int, default=1, 97 help="Fixed single cs pair in varying payload.") 98 99if __name__ == "__main__": 100 args = parser.parse_args() 101 102 results = [] 103 if args.test == "cs": 104 for cs in args.cs_pairs: 105 result = experiment(cs*2, args.payload, args.iterations, args.cpu) 106 results.append(result) 107 108 out_file = os.path.join(te.res_dir, 109 args.out_prefix + "_cs_" + str(args.payload)) 110 with open(out_file, 'w') as f: 111 for r in results: 112 f.write("%s\n" % r) 113 else: 114 for pl in args.payloads: 115 result = experiment(args.cs_pair*2, pl, args.iterations, args.cpu) 116 results.append(result) 117 118 out_file = os.path.join(te.res_dir, 119 args.out_prefix + \ 120 "_payload_" + str(args.cs_pair)) 121 with open(out_file, 'w') as f: 122 for r in results: 123 f.write("%s\n" % r) 124