普通文本  |  124行  |  4.36 KB

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