1*f40fafd4SAndroid Build Coastguard Worker#!/usr/bin/env python 2*f40fafd4SAndroid Build Coastguard Worker 3*f40fafd4SAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project 4*f40fafd4SAndroid Build Coastguard Worker# 5*f40fafd4SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the 'License'); 6*f40fafd4SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*f40fafd4SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*f40fafd4SAndroid Build Coastguard Worker# 9*f40fafd4SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*f40fafd4SAndroid Build Coastguard Worker# 11*f40fafd4SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*f40fafd4SAndroid Build Coastguard Worker# distributed under the License is distributed on an 'AS IS' BASIS, 13*f40fafd4SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*f40fafd4SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*f40fafd4SAndroid Build Coastguard Worker# limitations under the License. 16*f40fafd4SAndroid Build Coastguard Worker 17*f40fafd4SAndroid Build Coastguard Worker""" 18*f40fafd4SAndroid Build Coastguard WorkerGenerates storage benchmark from captured strace output. 19*f40fafd4SAndroid Build Coastguard Worker 20*f40fafd4SAndroid Build Coastguard WorkerCurrently assumes that all mmap'ed regions are resource accesses, and emulates as pread(). 21*f40fafd4SAndroid Build Coastguard Worker 22*f40fafd4SAndroid Build Coastguard WorkerUsage: 23*f40fafd4SAndroid Build Coastguard Worker$ adb shell strace -p `pid zygote` -o /data/local/tmp/trace -f -ff -y -ttt -e trace=file,desc,munmap 24*f40fafd4SAndroid Build Coastguard Worker$ adb pull /data/local/tmp/trace* 25*f40fafd4SAndroid Build Coastguard Worker$ python benchgen.py trace.* 26*f40fafd4SAndroid Build Coastguard Worker 27*f40fafd4SAndroid Build Coastguard Worker""" 28*f40fafd4SAndroid Build Coastguard Worker 29*f40fafd4SAndroid Build Coastguard Workerimport re, sys, collections, traceback, argparse 30*f40fafd4SAndroid Build Coastguard Worker 31*f40fafd4SAndroid Build Coastguard Workerfrom operator import itemgetter 32*f40fafd4SAndroid Build Coastguard Workerfrom collections import defaultdict 33*f40fafd4SAndroid Build Coastguard Worker 34*f40fafd4SAndroid Build Coastguard Workerclass Event: 35*f40fafd4SAndroid Build Coastguard Worker def __init__(self, thread, time, call, args, ret): 36*f40fafd4SAndroid Build Coastguard Worker self.thread = thread 37*f40fafd4SAndroid Build Coastguard Worker self.time = time 38*f40fafd4SAndroid Build Coastguard Worker self.call = call 39*f40fafd4SAndroid Build Coastguard Worker self.args = args 40*f40fafd4SAndroid Build Coastguard Worker self.ret = ret 41*f40fafd4SAndroid Build Coastguard Worker 42*f40fafd4SAndroid Build Coastguard Worker def __repr__(self): 43*f40fafd4SAndroid Build Coastguard Worker return "%s(%s)=%s" % (self.call, repr(self.args), self.ret) 44*f40fafd4SAndroid Build Coastguard Worker 45*f40fafd4SAndroid Build Coastguard Worker 46*f40fafd4SAndroid Build Coastguard Workerclass File: 47*f40fafd4SAndroid Build Coastguard Worker def __init__(self, name, ident): 48*f40fafd4SAndroid Build Coastguard Worker self.name = name 49*f40fafd4SAndroid Build Coastguard Worker self.ident = ident 50*f40fafd4SAndroid Build Coastguard Worker self.size = 0 51*f40fafd4SAndroid Build Coastguard Worker 52*f40fafd4SAndroid Build Coastguard Worker def __repr__(self): 53*f40fafd4SAndroid Build Coastguard Worker return self.name 54*f40fafd4SAndroid Build Coastguard Worker 55*f40fafd4SAndroid Build Coastguard Worker 56*f40fafd4SAndroid Build Coastguard Workerevents = [] 57*f40fafd4SAndroid Build Coastguard Workerfiles = {} 58*f40fafd4SAndroid Build Coastguard Worker 59*f40fafd4SAndroid Build Coastguard Workerdef find_file(name): 60*f40fafd4SAndroid Build Coastguard Worker name = name.strip('<>"') 61*f40fafd4SAndroid Build Coastguard Worker if name not in files: 62*f40fafd4SAndroid Build Coastguard Worker files[name] = File(name, len(files)) 63*f40fafd4SAndroid Build Coastguard Worker return files[name] 64*f40fafd4SAndroid Build Coastguard Worker 65*f40fafd4SAndroid Build Coastguard Workerdef extract_file(e, arg): 66*f40fafd4SAndroid Build Coastguard Worker if "<" in arg: 67*f40fafd4SAndroid Build Coastguard Worker fd, path = arg.split("<") 68*f40fafd4SAndroid Build Coastguard Worker path = path.strip(">") 69*f40fafd4SAndroid Build Coastguard Worker handle = "t%sf%s" % (e.thread, fd) 70*f40fafd4SAndroid Build Coastguard Worker return (fd, find_file(path), handle) 71*f40fafd4SAndroid Build Coastguard Worker else: 72*f40fafd4SAndroid Build Coastguard Worker return (None, None, None) 73*f40fafd4SAndroid Build Coastguard Worker 74*f40fafd4SAndroid Build Coastguard Workerdef parse_args(s): 75*f40fafd4SAndroid Build Coastguard Worker args = [] 76*f40fafd4SAndroid Build Coastguard Worker arg = "" 77*f40fafd4SAndroid Build Coastguard Worker esc = False 78*f40fafd4SAndroid Build Coastguard Worker quot = False 79*f40fafd4SAndroid Build Coastguard Worker for c in s: 80*f40fafd4SAndroid Build Coastguard Worker if esc: 81*f40fafd4SAndroid Build Coastguard Worker esc = False 82*f40fafd4SAndroid Build Coastguard Worker arg += c 83*f40fafd4SAndroid Build Coastguard Worker continue 84*f40fafd4SAndroid Build Coastguard Worker 85*f40fafd4SAndroid Build Coastguard Worker if c == '"': 86*f40fafd4SAndroid Build Coastguard Worker if quot: 87*f40fafd4SAndroid Build Coastguard Worker quot = False 88*f40fafd4SAndroid Build Coastguard Worker continue 89*f40fafd4SAndroid Build Coastguard Worker else: 90*f40fafd4SAndroid Build Coastguard Worker quot = True 91*f40fafd4SAndroid Build Coastguard Worker continue 92*f40fafd4SAndroid Build Coastguard Worker 93*f40fafd4SAndroid Build Coastguard Worker if c == '\\': 94*f40fafd4SAndroid Build Coastguard Worker esc = True 95*f40fafd4SAndroid Build Coastguard Worker continue 96*f40fafd4SAndroid Build Coastguard Worker 97*f40fafd4SAndroid Build Coastguard Worker if c == ',' and not quot: 98*f40fafd4SAndroid Build Coastguard Worker args.append(arg.strip()) 99*f40fafd4SAndroid Build Coastguard Worker arg = "" 100*f40fafd4SAndroid Build Coastguard Worker else: 101*f40fafd4SAndroid Build Coastguard Worker arg += c 102*f40fafd4SAndroid Build Coastguard Worker 103*f40fafd4SAndroid Build Coastguard Worker args.append(arg.strip()) 104*f40fafd4SAndroid Build Coastguard Worker return args 105*f40fafd4SAndroid Build Coastguard Worker 106*f40fafd4SAndroid Build Coastguard Worker 107*f40fafd4SAndroid Build Coastguard Workerbufsize = 1048576 108*f40fafd4SAndroid Build Coastguard Workerinteresting = ["mmap2","read","write","pread64","pwrite64","fsync","fdatasync","openat","close","lseek","_llseek"] 109*f40fafd4SAndroid Build Coastguard Worker 110*f40fafd4SAndroid Build Coastguard Workerre_event = re.compile(r"^([\d\.]+) (.+?)\((.+?)\) = (.+?)$") 111*f40fafd4SAndroid Build Coastguard Workerre_arg = re.compile(r'''((?:[^,"']|"[^"]*"|'[^']*')+)''') 112*f40fafd4SAndroid Build Coastguard Workerfor fn in sys.argv[1:]: 113*f40fafd4SAndroid Build Coastguard Worker with open(fn) as f: 114*f40fafd4SAndroid Build Coastguard Worker thread = int(fn.split(".")[-1]) 115*f40fafd4SAndroid Build Coastguard Worker for line in f: 116*f40fafd4SAndroid Build Coastguard Worker line = re_event.match(line) 117*f40fafd4SAndroid Build Coastguard Worker if not line: continue 118*f40fafd4SAndroid Build Coastguard Worker 119*f40fafd4SAndroid Build Coastguard Worker time, call, args, ret = line.groups() 120*f40fafd4SAndroid Build Coastguard Worker if call not in interesting: continue 121*f40fafd4SAndroid Build Coastguard Worker if "/data/" not in args: continue 122*f40fafd4SAndroid Build Coastguard Worker 123*f40fafd4SAndroid Build Coastguard Worker time = float(time) 124*f40fafd4SAndroid Build Coastguard Worker args = parse_args(args) 125*f40fafd4SAndroid Build Coastguard Worker events.append(Event(thread, time, call, args, ret)) 126*f40fafd4SAndroid Build Coastguard Worker 127*f40fafd4SAndroid Build Coastguard Worker 128*f40fafd4SAndroid Build Coastguard Workerwith open("BenchmarkGen.h", 'w') as bench: 129*f40fafd4SAndroid Build Coastguard Worker print >>bench, """/* 130*f40fafd4SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 131*f40fafd4SAndroid Build Coastguard Worker * 132*f40fafd4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 133*f40fafd4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 134*f40fafd4SAndroid Build Coastguard Worker * You may obtain a copy of the License at 135*f40fafd4SAndroid Build Coastguard Worker * 136*f40fafd4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 137*f40fafd4SAndroid Build Coastguard Worker * 138*f40fafd4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 139*f40fafd4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 140*f40fafd4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141*f40fafd4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 142*f40fafd4SAndroid Build Coastguard Worker * limitations under the License. 143*f40fafd4SAndroid Build Coastguard Worker */ 144*f40fafd4SAndroid Build Coastguard Worker 145*f40fafd4SAndroid Build Coastguard Worker 146*f40fafd4SAndroid Build Coastguard Worker/****************************************************************** 147*f40fafd4SAndroid Build Coastguard Worker * THIS CODE WAS GENERATED BY benchgen.py, DO NOT MODIFY DIRECTLY * 148*f40fafd4SAndroid Build Coastguard Worker ******************************************************************/ 149*f40fafd4SAndroid Build Coastguard Worker 150*f40fafd4SAndroid Build Coastguard Worker 151*f40fafd4SAndroid Build Coastguard Worker#include <android-base/logging.h> 152*f40fafd4SAndroid Build Coastguard Worker 153*f40fafd4SAndroid Build Coastguard Worker#include <stdlib.h> 154*f40fafd4SAndroid Build Coastguard Worker#include <sys/types.h> 155*f40fafd4SAndroid Build Coastguard Worker#include <sys/stat.h> 156*f40fafd4SAndroid Build Coastguard Worker#include <sys/sendfile.h> 157*f40fafd4SAndroid Build Coastguard Worker#include <fcntl.h> 158*f40fafd4SAndroid Build Coastguard Worker 159*f40fafd4SAndroid Build Coastguard Worker#include <algorithm> 160*f40fafd4SAndroid Build Coastguard Worker#include <functional> 161*f40fafd4SAndroid Build Coastguard Worker#include <string> 162*f40fafd4SAndroid Build Coastguard Worker 163*f40fafd4SAndroid Build Coastguard Worker#include <Utils.h> 164*f40fafd4SAndroid Build Coastguard Worker 165*f40fafd4SAndroid Build Coastguard Workernamespace android { 166*f40fafd4SAndroid Build Coastguard Workernamespace vold { 167*f40fafd4SAndroid Build Coastguard Worker 168*f40fafd4SAndroid Build Coastguard Workerstatic status_t BenchmarkRun(std::function<bool(int)> checkpoint) { 169*f40fafd4SAndroid Build Coastguard Worker 170*f40fafd4SAndroid Build Coastguard Worker""" 171*f40fafd4SAndroid Build Coastguard Worker 172*f40fafd4SAndroid Build Coastguard Worker print >>bench, "char* buf = (char*) malloc(%d);" % (bufsize) 173*f40fafd4SAndroid Build Coastguard Worker 174*f40fafd4SAndroid Build Coastguard Worker nread = 0 175*f40fafd4SAndroid Build Coastguard Worker nwrite = 0 176*f40fafd4SAndroid Build Coastguard Worker nsync = 0 177*f40fafd4SAndroid Build Coastguard Worker events = sorted(events, key=lambda e: e.time) 178*f40fafd4SAndroid Build Coastguard Worker active = set() 179*f40fafd4SAndroid Build Coastguard Worker defined = set() 180*f40fafd4SAndroid Build Coastguard Worker i = 0 181*f40fafd4SAndroid Build Coastguard Worker total = len(events) 182*f40fafd4SAndroid Build Coastguard Worker for e in events: 183*f40fafd4SAndroid Build Coastguard Worker i += 1 184*f40fafd4SAndroid Build Coastguard Worker if i % 256 == 0: 185*f40fafd4SAndroid Build Coastguard Worker print >>bench, "if (!checkpoint(%d)) return -1;" % (50 + ((i * 50) / total)) 186*f40fafd4SAndroid Build Coastguard Worker 187*f40fafd4SAndroid Build Coastguard Worker if e.call == "openat": 188*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.ret) 189*f40fafd4SAndroid Build Coastguard Worker if f: 190*f40fafd4SAndroid Build Coastguard Worker active.add(handle) 191*f40fafd4SAndroid Build Coastguard Worker if handle not in defined: 192*f40fafd4SAndroid Build Coastguard Worker print >>bench, "int", 193*f40fafd4SAndroid Build Coastguard Worker defined.add(handle) 194*f40fafd4SAndroid Build Coastguard Worker create_mode = '' 195*f40fafd4SAndroid Build Coastguard Worker if 'O_CREAT' in e.args[2]: 196*f40fafd4SAndroid Build Coastguard Worker assert len(e.args) > 3, 'File creation lacks a mode?' 197*f40fafd4SAndroid Build Coastguard Worker create_mode = ', ' + e.args[3] 198*f40fafd4SAndroid Build Coastguard Worker print >>bench, '%s = TEMP_FAILURE_RETRY(open("file%s", %s%s));' \ 199*f40fafd4SAndroid Build Coastguard Worker % (handle, f.ident, e.args[2], create_mode) 200*f40fafd4SAndroid Build Coastguard Worker 201*f40fafd4SAndroid Build Coastguard Worker elif e.call == "close": 202*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 203*f40fafd4SAndroid Build Coastguard Worker if handle in active: 204*f40fafd4SAndroid Build Coastguard Worker active.remove(handle) 205*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'close(%s);' % (handle) 206*f40fafd4SAndroid Build Coastguard Worker 207*f40fafd4SAndroid Build Coastguard Worker elif e.call == "lseek": 208*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 209*f40fafd4SAndroid Build Coastguard Worker if handle in active: 210*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(lseek(%s, %s, %s));' % (handle, e.args[1], e.args[2]) 211*f40fafd4SAndroid Build Coastguard Worker 212*f40fafd4SAndroid Build Coastguard Worker elif e.call == "_llseek": 213*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 214*f40fafd4SAndroid Build Coastguard Worker if handle in active: 215*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(lseek(%s, %s, %s));' % (handle, e.args[1], e.args[3]) 216*f40fafd4SAndroid Build Coastguard Worker 217*f40fafd4SAndroid Build Coastguard Worker elif e.call == "read": 218*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 219*f40fafd4SAndroid Build Coastguard Worker if handle in active: 220*f40fafd4SAndroid Build Coastguard Worker # TODO: track actual file size instead of guessing 221*f40fafd4SAndroid Build Coastguard Worker count = min(int(e.args[2]), bufsize) 222*f40fafd4SAndroid Build Coastguard Worker f.size += count 223*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(read(%s, buf, %d));' % (handle, count) 224*f40fafd4SAndroid Build Coastguard Worker nread += 1 225*f40fafd4SAndroid Build Coastguard Worker 226*f40fafd4SAndroid Build Coastguard Worker elif e.call == "write": 227*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 228*f40fafd4SAndroid Build Coastguard Worker if handle in active: 229*f40fafd4SAndroid Build Coastguard Worker # TODO: track actual file size instead of guessing 230*f40fafd4SAndroid Build Coastguard Worker count = min(int(e.args[2]), bufsize) 231*f40fafd4SAndroid Build Coastguard Worker f.size += count 232*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(write(%s, buf, %d));' % (handle, count) 233*f40fafd4SAndroid Build Coastguard Worker nwrite += 1 234*f40fafd4SAndroid Build Coastguard Worker 235*f40fafd4SAndroid Build Coastguard Worker elif e.call == "pread64": 236*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 237*f40fafd4SAndroid Build Coastguard Worker if handle in active: 238*f40fafd4SAndroid Build Coastguard Worker f.size = max(f.size, int(e.args[2]) + int(e.args[3])) 239*f40fafd4SAndroid Build Coastguard Worker count = min(int(e.args[2]), bufsize) 240*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(pread(%s, buf, %d, %s));' % (handle, count, e.args[3]) 241*f40fafd4SAndroid Build Coastguard Worker nread += 1 242*f40fafd4SAndroid Build Coastguard Worker 243*f40fafd4SAndroid Build Coastguard Worker elif e.call == "pwrite64": 244*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 245*f40fafd4SAndroid Build Coastguard Worker if handle in active: 246*f40fafd4SAndroid Build Coastguard Worker f.size = max(f.size, int(e.args[2]) + int(e.args[3])) 247*f40fafd4SAndroid Build Coastguard Worker count = min(int(e.args[2]), bufsize) 248*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(pwrite(%s, buf, %d, %s));' % (handle, count, e.args[3]) 249*f40fafd4SAndroid Build Coastguard Worker nwrite += 1 250*f40fafd4SAndroid Build Coastguard Worker 251*f40fafd4SAndroid Build Coastguard Worker elif e.call == "fsync": 252*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 253*f40fafd4SAndroid Build Coastguard Worker if handle in active: 254*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(fsync(%s));' % (handle) 255*f40fafd4SAndroid Build Coastguard Worker nsync += 1 256*f40fafd4SAndroid Build Coastguard Worker 257*f40fafd4SAndroid Build Coastguard Worker elif e.call == "fdatasync": 258*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[0]) 259*f40fafd4SAndroid Build Coastguard Worker if handle in active: 260*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(fdatasync(%s));' % (handle) 261*f40fafd4SAndroid Build Coastguard Worker nsync += 1 262*f40fafd4SAndroid Build Coastguard Worker 263*f40fafd4SAndroid Build Coastguard Worker elif e.call == "mmap2": 264*f40fafd4SAndroid Build Coastguard Worker fd, f, handle = extract_file(e, e.args[4]) 265*f40fafd4SAndroid Build Coastguard Worker if handle in active: 266*f40fafd4SAndroid Build Coastguard Worker count = min(int(e.args[1]), bufsize) 267*f40fafd4SAndroid Build Coastguard Worker offset = int(e.args[5], 0) 268*f40fafd4SAndroid Build Coastguard Worker f.size = max(f.size, count + offset) 269*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'TEMP_FAILURE_RETRY(pread(%s, buf, %s, %s)); // mmap2' % (handle, count, offset) 270*f40fafd4SAndroid Build Coastguard Worker nread += 1 271*f40fafd4SAndroid Build Coastguard Worker 272*f40fafd4SAndroid Build Coastguard Worker for handle in active: 273*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'close(%s);' % (handle) 274*f40fafd4SAndroid Build Coastguard Worker 275*f40fafd4SAndroid Build Coastguard Worker print >>bench, """ 276*f40fafd4SAndroid Build Coastguard Workerfree(buf); 277*f40fafd4SAndroid Build Coastguard Workerreturn 0; 278*f40fafd4SAndroid Build Coastguard Worker} 279*f40fafd4SAndroid Build Coastguard Worker 280*f40fafd4SAndroid Build Coastguard Workerstatic status_t CreateFile(const char* name, int len) { 281*f40fafd4SAndroid Build Coastguard Worker int chunk = std::min(len, 65536); 282*f40fafd4SAndroid Build Coastguard Worker int out = -1; 283*f40fafd4SAndroid Build Coastguard Worker std::string buf; 284*f40fafd4SAndroid Build Coastguard Worker 285*f40fafd4SAndroid Build Coastguard Worker if (android::vold::ReadRandomBytes(chunk, buf) != OK) { 286*f40fafd4SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to read random data"; 287*f40fafd4SAndroid Build Coastguard Worker return -EIO; 288*f40fafd4SAndroid Build Coastguard Worker } 289*f40fafd4SAndroid Build Coastguard Worker if ((out = TEMP_FAILURE_RETRY(open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644))) < 0) { 290*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Failed to open " << name; 291*f40fafd4SAndroid Build Coastguard Worker return -errno; 292*f40fafd4SAndroid Build Coastguard Worker } 293*f40fafd4SAndroid Build Coastguard Worker 294*f40fafd4SAndroid Build Coastguard Worker while (len > 0) { 295*f40fafd4SAndroid Build Coastguard Worker int n = write(out, buf.c_str(), std::min(len, chunk)); 296*f40fafd4SAndroid Build Coastguard Worker if (n < 0) { 297*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Failed to write"; 298*f40fafd4SAndroid Build Coastguard Worker close(out); 299*f40fafd4SAndroid Build Coastguard Worker return -errno; 300*f40fafd4SAndroid Build Coastguard Worker } 301*f40fafd4SAndroid Build Coastguard Worker len -= n; 302*f40fafd4SAndroid Build Coastguard Worker } 303*f40fafd4SAndroid Build Coastguard Worker 304*f40fafd4SAndroid Build Coastguard Worker close(out); 305*f40fafd4SAndroid Build Coastguard Worker return OK; 306*f40fafd4SAndroid Build Coastguard Worker} 307*f40fafd4SAndroid Build Coastguard Worker 308*f40fafd4SAndroid Build Coastguard Workerstatic status_t BenchmarkCreate(std::function<bool(int)> checkpoint) { 309*f40fafd4SAndroid Build Coastguard Workerstatus_t res = 0; 310*f40fafd4SAndroid Build Coastguard Workerres |= CreateFile("stub", 0); 311*f40fafd4SAndroid Build Coastguard Worker""" 312*f40fafd4SAndroid Build Coastguard Worker i = 0 313*f40fafd4SAndroid Build Coastguard Worker total = len(files.values()) 314*f40fafd4SAndroid Build Coastguard Worker for f in files.values(): 315*f40fafd4SAndroid Build Coastguard Worker i += 1 316*f40fafd4SAndroid Build Coastguard Worker if i % 12 == 0: 317*f40fafd4SAndroid Build Coastguard Worker print >>bench, "if (!checkpoint(%d)) return -1;" % ((i * 50) / total) 318*f40fafd4SAndroid Build Coastguard Worker 319*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'res |= CreateFile("file%s", %d);' % (f.ident, f.size) 320*f40fafd4SAndroid Build Coastguard Worker 321*f40fafd4SAndroid Build Coastguard Worker print >>bench, """ 322*f40fafd4SAndroid Build Coastguard Workerreturn res; 323*f40fafd4SAndroid Build Coastguard Worker} 324*f40fafd4SAndroid Build Coastguard Worker 325*f40fafd4SAndroid Build Coastguard Workerstatic status_t BenchmarkDestroy() { 326*f40fafd4SAndroid Build Coastguard Workerstatus_t res = 0; 327*f40fafd4SAndroid Build Coastguard Workerres |= unlink("stub"); 328*f40fafd4SAndroid Build Coastguard Worker""" 329*f40fafd4SAndroid Build Coastguard Worker for f in files.values(): 330*f40fafd4SAndroid Build Coastguard Worker print >>bench, 'res |= unlink("file%s");' % (f.ident) 331*f40fafd4SAndroid Build Coastguard Worker 332*f40fafd4SAndroid Build Coastguard Worker print >>bench, """ 333*f40fafd4SAndroid Build Coastguard Workerreturn res; 334*f40fafd4SAndroid Build Coastguard Worker} 335*f40fafd4SAndroid Build Coastguard Worker 336*f40fafd4SAndroid Build Coastguard Workerstatic std::string BenchmarkIdent() {""" 337*f40fafd4SAndroid Build Coastguard Worker print >>bench, """return "r%d:w%d:s%d";""" % (nread, nwrite, nsync) 338*f40fafd4SAndroid Build Coastguard Worker print >>bench, """} 339*f40fafd4SAndroid Build Coastguard Worker 340*f40fafd4SAndroid Build Coastguard Worker} // namespace vold 341*f40fafd4SAndroid Build Coastguard Worker} // namespace android 342*f40fafd4SAndroid Build Coastguard Worker""" 343*f40fafd4SAndroid Build Coastguard Worker 344*f40fafd4SAndroid Build Coastguard Worker 345*f40fafd4SAndroid Build Coastguard Workersize = sum([ f.size for f in files.values() ]) 346*f40fafd4SAndroid Build Coastguard Workerprint "Found", len(files), "data files accessed, total size", (size/1024), "kB" 347*f40fafd4SAndroid Build Coastguard Worker 348*f40fafd4SAndroid Build Coastguard Workertypes = defaultdict(int) 349*f40fafd4SAndroid Build Coastguard Workerfor e in events: 350*f40fafd4SAndroid Build Coastguard Worker types[e.call] += 1 351*f40fafd4SAndroid Build Coastguard Worker 352*f40fafd4SAndroid Build Coastguard Workerprint "Found syscalls:" 353*f40fafd4SAndroid Build Coastguard Workerfor t, n in types.iteritems(): 354*f40fafd4SAndroid Build Coastguard Worker print str(n).rjust(8), t 355*f40fafd4SAndroid Build Coastguard Worker 356*f40fafd4SAndroid Build Coastguard Workerprint 357