]>
git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blob - tools/perf/util/values.c
10 int perf_read_values_init(struct perf_read_values
*values
)
12 values
->threads_max
= 16;
13 values
->pid
= malloc(values
->threads_max
* sizeof(*values
->pid
));
14 values
->tid
= malloc(values
->threads_max
* sizeof(*values
->tid
));
15 values
->value
= zalloc(values
->threads_max
* sizeof(*values
->value
));
16 if (!values
->pid
|| !values
->tid
|| !values
->value
) {
17 pr_debug("failed to allocate read_values threads arrays");
22 values
->counters_max
= 16;
23 values
->counterrawid
= malloc(values
->counters_max
24 * sizeof(*values
->counterrawid
));
25 values
->countername
= malloc(values
->counters_max
26 * sizeof(*values
->countername
));
27 if (!values
->counterrawid
|| !values
->countername
) {
28 pr_debug("failed to allocate read_values counters arrays");
29 goto out_free_counter
;
36 zfree(&values
->counterrawid
);
37 zfree(&values
->countername
);
41 zfree(&values
->value
);
45 void perf_read_values_destroy(struct perf_read_values
*values
)
49 if (!values
->threads_max
|| !values
->counters_max
)
52 for (i
= 0; i
< values
->threads
; i
++)
53 zfree(&values
->value
[i
]);
54 zfree(&values
->value
);
57 zfree(&values
->counterrawid
);
58 for (i
= 0; i
< values
->counters
; i
++)
59 zfree(&values
->countername
[i
]);
60 zfree(&values
->countername
);
63 static int perf_read_values__enlarge_threads(struct perf_read_values
*values
)
65 int nthreads_max
= values
->threads_max
* 2;
66 void *npid
= realloc(values
->pid
, nthreads_max
* sizeof(*values
->pid
)),
67 *ntid
= realloc(values
->tid
, nthreads_max
* sizeof(*values
->tid
)),
68 *nvalue
= realloc(values
->value
, nthreads_max
* sizeof(*values
->value
));
70 if (!npid
|| !ntid
|| !nvalue
)
73 values
->threads_max
= nthreads_max
;
76 values
->value
= nvalue
;
82 pr_debug("failed to enlarge read_values threads arrays");
86 static int perf_read_values__findnew_thread(struct perf_read_values
*values
,
91 for (i
= 0; i
< values
->threads
; i
++)
92 if (values
->pid
[i
] == pid
&& values
->tid
[i
] == tid
)
95 if (values
->threads
== values
->threads_max
) {
96 i
= perf_read_values__enlarge_threads(values
);
103 values
->value
[i
] = zalloc(values
->counters_max
* sizeof(**values
->value
));
104 if (!values
->value
[i
]) {
105 pr_debug("failed to allocate read_values counters array");
108 values
->pid
[i
] = pid
;
109 values
->tid
[i
] = tid
;
110 values
->threads
= i
+ 1;
115 static int perf_read_values__enlarge_counters(struct perf_read_values
*values
)
118 int i
, counters_max
= values
->counters_max
* 2;
119 u64
*counterrawid
= realloc(values
->counterrawid
, counters_max
* sizeof(*values
->counterrawid
));
122 pr_debug("failed to enlarge read_values rawid array");
126 countername
= realloc(values
->countername
, counters_max
* sizeof(*values
->countername
));
128 pr_debug("failed to enlarge read_values rawid array");
132 for (i
= 0; i
< values
->threads
; i
++) {
133 u64
*value
= realloc(values
->value
[i
], counters_max
* sizeof(**values
->value
));
137 pr_debug("failed to enlarge read_values ->values array");
141 for (j
= values
->counters_max
; j
< counters_max
; j
++)
144 values
->value
[i
] = value
;
147 values
->counters_max
= counters_max
;
148 values
->counterrawid
= counterrawid
;
149 values
->countername
= countername
;
160 static int perf_read_values__findnew_counter(struct perf_read_values
*values
,
161 u64 rawid
, const char *name
)
165 for (i
= 0; i
< values
->counters
; i
++)
166 if (values
->counterrawid
[i
] == rawid
)
169 if (values
->counters
== values
->counters_max
) {
170 i
= perf_read_values__enlarge_counters(values
);
175 i
= values
->counters
++;
176 values
->counterrawid
[i
] = rawid
;
177 values
->countername
[i
] = strdup(name
);
182 int perf_read_values_add_value(struct perf_read_values
*values
,
184 u64 rawid
, const char *name
, u64 value
)
188 tindex
= perf_read_values__findnew_thread(values
, pid
, tid
);
191 cindex
= perf_read_values__findnew_counter(values
, rawid
, name
);
195 values
->value
[tindex
][cindex
] += value
;
199 static void perf_read_values__display_pretty(FILE *fp
,
200 struct perf_read_values
*values
)
203 int pidwidth
, tidwidth
;
206 counterwidth
= malloc(values
->counters
* sizeof(*counterwidth
));
208 fprintf(fp
, "INTERNAL ERROR: Failed to allocate counterwidth array\n");
213 for (j
= 0; j
< values
->counters
; j
++)
214 counterwidth
[j
] = strlen(values
->countername
[j
]);
215 for (i
= 0; i
< values
->threads
; i
++) {
218 width
= snprintf(NULL
, 0, "%d", values
->pid
[i
]);
219 if (width
> pidwidth
)
221 width
= snprintf(NULL
, 0, "%d", values
->tid
[i
]);
222 if (width
> tidwidth
)
224 for (j
= 0; j
< values
->counters
; j
++) {
225 width
= snprintf(NULL
, 0, "%" PRIu64
, values
->value
[i
][j
]);
226 if (width
> counterwidth
[j
])
227 counterwidth
[j
] = width
;
231 fprintf(fp
, "# %*s %*s", pidwidth
, "PID", tidwidth
, "TID");
232 for (j
= 0; j
< values
->counters
; j
++)
233 fprintf(fp
, " %*s", counterwidth
[j
], values
->countername
[j
]);
236 for (i
= 0; i
< values
->threads
; i
++) {
237 fprintf(fp
, " %*d %*d", pidwidth
, values
->pid
[i
],
238 tidwidth
, values
->tid
[i
]);
239 for (j
= 0; j
< values
->counters
; j
++)
240 fprintf(fp
, " %*" PRIu64
,
241 counterwidth
[j
], values
->value
[i
][j
]);
247 static void perf_read_values__display_raw(FILE *fp
,
248 struct perf_read_values
*values
)
250 int width
, pidwidth
, tidwidth
, namewidth
, rawwidth
, countwidth
;
253 tidwidth
= 3; /* TID */
254 pidwidth
= 3; /* PID */
255 namewidth
= 4; /* "Name" */
256 rawwidth
= 3; /* "Raw" */
257 countwidth
= 5; /* "Count" */
259 for (i
= 0; i
< values
->threads
; i
++) {
260 width
= snprintf(NULL
, 0, "%d", values
->pid
[i
]);
261 if (width
> pidwidth
)
263 width
= snprintf(NULL
, 0, "%d", values
->tid
[i
]);
264 if (width
> tidwidth
)
267 for (j
= 0; j
< values
->counters
; j
++) {
268 width
= strlen(values
->countername
[j
]);
269 if (width
> namewidth
)
271 width
= snprintf(NULL
, 0, "%" PRIx64
, values
->counterrawid
[j
]);
272 if (width
> rawwidth
)
275 for (i
= 0; i
< values
->threads
; i
++) {
276 for (j
= 0; j
< values
->counters
; j
++) {
277 width
= snprintf(NULL
, 0, "%" PRIu64
, values
->value
[i
][j
]);
278 if (width
> countwidth
)
283 fprintf(fp
, "# %*s %*s %*s %*s %*s\n",
284 pidwidth
, "PID", tidwidth
, "TID",
285 namewidth
, "Name", rawwidth
, "Raw",
286 countwidth
, "Count");
287 for (i
= 0; i
< values
->threads
; i
++)
288 for (j
= 0; j
< values
->counters
; j
++)
289 fprintf(fp
, " %*d %*d %*s %*" PRIx64
" %*" PRIu64
,
290 pidwidth
, values
->pid
[i
],
291 tidwidth
, values
->tid
[i
],
292 namewidth
, values
->countername
[j
],
293 rawwidth
, values
->counterrawid
[j
],
294 countwidth
, values
->value
[i
][j
]);
297 void perf_read_values_display(FILE *fp
, struct perf_read_values
*values
, int raw
)
300 perf_read_values__display_raw(fp
, values
);
302 perf_read_values__display_pretty(fp
, values
);