1b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan/*
2b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Copyright (C) 2016 The Android Open Source Project
3b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
4b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Licensed under the Apache License, Version 2.0 (the "License");
5b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * you may not use this file except in compliance with the License.
6b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * You may obtain a copy of the License at
7b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
8b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *      http://www.apache.org/licenses/LICENSE-2.0
9b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan *
10b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * Unless required by applicable law or agreed to in writing, software
11b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * distributed under the License is distributed on an "AS IS" BASIS,
12b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * See the License for the specific language governing permissions and
14b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan * limitations under the License.
15b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan */
16b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
17b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#ifdef IOSHARK_MAIN
18b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanconst char *IO_op[] = {
19b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"LSEEK",
20b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"LLSEEK",
21b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"PREAD64",
22b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"PWRITE64",
23b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"READ",
24b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"WRITE",
25b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"MMAP",
26b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"MMAP2",
27b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"OPEN",
28b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"FSYNC",
29b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"FDATASYNC",
30b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"CLOSE",
31b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"MAPPED_PREAD",
32b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"MAPPED_PWRITE",
33b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	"MAX_FILE_OP"
34b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
35b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#endif
36b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
37b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#define MAX(A, B)	((A) > (B) ? (A) : (B))
38b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#define MIN(A, B)	((A) < (B) ? (A) : (B))
39b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
40b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#define MINBUFLEN	(16*1024)
41b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
42b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan#define FILE_DB_HASHSIZE	8192
43b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
44b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct files_db_s {
45b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *filename;
46b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int fileno;
47b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	size_t	size;
48b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int fd;
4902f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan	int readonly;
50b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	int debug_open_flags;
51b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct files_db_s *next;
52b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
53b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
54b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct files_db_handle {
55b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct files_db_s *files_db_buckets[FILE_DB_HASHSIZE];
56b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
57b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
58b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct IO_operation_s {
59b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	char *IO_op;
60b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
61b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
62b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstruct rw_bytes_s {
63b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	u_int64_t bytes_read;
64b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	u_int64_t bytes_written;
65b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan};
66b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
67b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline void
68b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanfiles_db_update_size(void *node, u_int64_t new_size)
69b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
70b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct files_db_s *db_node = (struct files_db_s *)node;
71b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
72b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	if (db_node->size < new_size)
73b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		db_node->size = new_size;
74b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
75b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
76b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline void
77b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanfiles_db_update_filename(void *node, char *filename)
78b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
79b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	((struct files_db_s *)node)->filename = strdup(filename);
80b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
81b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
82b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline int
83b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanfiles_db_get_fileno(void *node)
84b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
85b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return (((struct files_db_s *)node)->fileno);
86b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
87b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
88b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline int
89b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanfiles_db_get_fd(void *node)
90b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
91b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return (((struct files_db_s *)node)->fd);
92b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
93b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
94b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline char *
95b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanfiles_db_get_filename(void *node)
96b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
97b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return (((struct files_db_s *)node)->filename);
98b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
99b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
10002f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanstatic inline int
10102f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanfiles_db_readonly(void *node)
10202f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan{
10302f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan	return (((struct files_db_s *)node)->readonly);
10402f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan}
10502f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasan
106b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline u_int64_t
107b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_msecs(struct timeval *tv)
108b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
109b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return ((tv->tv_sec * 1000) + (tv->tv_usec / 1000));
110b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
111b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
112b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline u_int64_t
113b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanget_usecs(struct timeval *tv)
114b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
115b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	return (tv->tv_usec % 1000);
116b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
117b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
118b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanstatic inline void
119b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanupdate_delta_time(struct timeval *start,
120b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		  struct timeval *destination)
121b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan{
122b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	struct timeval res, finish;
123b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
124b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	(void)gettimeofday(&finish, (struct timezone *)NULL);
125b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	timersub(&finish, start, &res);
126b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	timeradd(destination, &res, &finish);
127b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan	*destination = finish;
128b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan}
129b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
130b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid *files_db_create_handle(void);
131b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid *files_db_lookup_byfileno(void *handle, int fileno);
13202f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanvoid *files_db_add_byfileno(void *handle, int fileno, int readonly);
133b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_update_fd(void *node, int fd);
134b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_unlink_files(void *db_handle);
135b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_close_files(void *handle);
136b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_close_fd(void *node);
137b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_free_memory(void *handle);
138b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid create_file(char *path, size_t size,
139b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan		 struct rw_bytes_s *rw_bytes);
140b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanchar *get_buf(char **buf, int *buflen, int len, int do_fill);
141b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid files_db_fsync_discard_files(void *handle);
142b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid print_op_stats(u_int64_t *op_counts);
143b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid print_bytes(char *desc, struct rw_bytes_s *rw_bytes);
144b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid ioshark_handle_mmap(void *db_node,
145b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			 struct ioshark_file_operation *file_op,
146b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			 char **bufp, int *buflen, u_int64_t *op_counts,
147b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan			 struct rw_bytes_s *rw_bytes);
148b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid capture_util_state_before(void);
149b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasanvoid report_cpu_disk_util(void);
150b707f30a7cdd521db5d0d1c1e5c391e61a1675c9Mohan Srinivasan
15102f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanchar *get_ro_filename(int ix);
15202f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanvoid init_filename_cache(void);
15302f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanvoid free_filename_cache(void);
15402f8626d766424406bcfea1e20ef352d3b9a72cfMohan Srinivasanint is_readonly_mount(char *filename, size_t size);
155