xref: /aosp_15_r20/system/vold/bench/benchgen.py (revision f40fafd4c6c2594924d919feffc1a1fd6e3b30f3)
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