1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * resource_track.c --- resource tracking
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 2013 by Theodore Ts'o
5*6a54128fSAndroid Build Coastguard Worker *
6*6a54128fSAndroid Build Coastguard Worker * %Begin-Header%
7*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Public
8*6a54128fSAndroid Build Coastguard Worker * License.
9*6a54128fSAndroid Build Coastguard Worker * %End-Header%
10*6a54128fSAndroid Build Coastguard Worker */
11*6a54128fSAndroid Build Coastguard Worker
12*6a54128fSAndroid Build Coastguard Worker
13*6a54128fSAndroid Build Coastguard Worker #include "config.h"
14*6a54128fSAndroid Build Coastguard Worker #include "resize2fs.h"
15*6a54128fSAndroid Build Coastguard Worker #include <time.h>
16*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_MALLOC_H
17*6a54128fSAndroid Build Coastguard Worker #include <malloc.h>
18*6a54128fSAndroid Build Coastguard Worker #endif
19*6a54128fSAndroid Build Coastguard Worker #include <sys/resource.h>
20*6a54128fSAndroid Build Coastguard Worker
init_resource_track(struct resource_track * track,const char * desc,io_channel channel)21*6a54128fSAndroid Build Coastguard Worker void init_resource_track(struct resource_track *track, const char *desc,
22*6a54128fSAndroid Build Coastguard Worker io_channel channel)
23*6a54128fSAndroid Build Coastguard Worker {
24*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETRUSAGE
25*6a54128fSAndroid Build Coastguard Worker struct rusage r;
26*6a54128fSAndroid Build Coastguard Worker #endif
27*6a54128fSAndroid Build Coastguard Worker io_stats io_start = 0;
28*6a54128fSAndroid Build Coastguard Worker
29*6a54128fSAndroid Build Coastguard Worker track->desc = desc;
30*6a54128fSAndroid Build Coastguard Worker track->brk_start = sbrk(0);
31*6a54128fSAndroid Build Coastguard Worker gettimeofday(&track->time_start, 0);
32*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETRUSAGE
33*6a54128fSAndroid Build Coastguard Worker #ifdef sun
34*6a54128fSAndroid Build Coastguard Worker memset(&r, 0, sizeof(struct rusage));
35*6a54128fSAndroid Build Coastguard Worker #endif
36*6a54128fSAndroid Build Coastguard Worker getrusage(RUSAGE_SELF, &r);
37*6a54128fSAndroid Build Coastguard Worker track->user_start = r.ru_utime;
38*6a54128fSAndroid Build Coastguard Worker track->system_start = r.ru_stime;
39*6a54128fSAndroid Build Coastguard Worker #else
40*6a54128fSAndroid Build Coastguard Worker track->user_start.tv_sec = track->user_start.tv_usec = 0;
41*6a54128fSAndroid Build Coastguard Worker track->system_start.tv_sec = track->system_start.tv_usec = 0;
42*6a54128fSAndroid Build Coastguard Worker #endif
43*6a54128fSAndroid Build Coastguard Worker track->bytes_read = 0;
44*6a54128fSAndroid Build Coastguard Worker track->bytes_written = 0;
45*6a54128fSAndroid Build Coastguard Worker if (channel && channel->manager && channel->manager->get_stats)
46*6a54128fSAndroid Build Coastguard Worker channel->manager->get_stats(channel, &io_start);
47*6a54128fSAndroid Build Coastguard Worker if (io_start) {
48*6a54128fSAndroid Build Coastguard Worker track->bytes_read = io_start->bytes_read;
49*6a54128fSAndroid Build Coastguard Worker track->bytes_written = io_start->bytes_written;
50*6a54128fSAndroid Build Coastguard Worker }
51*6a54128fSAndroid Build Coastguard Worker }
52*6a54128fSAndroid Build Coastguard Worker
timeval_subtract(struct timeval * tv1,struct timeval * tv2)53*6a54128fSAndroid Build Coastguard Worker static float timeval_subtract(struct timeval *tv1,
54*6a54128fSAndroid Build Coastguard Worker struct timeval *tv2)
55*6a54128fSAndroid Build Coastguard Worker {
56*6a54128fSAndroid Build Coastguard Worker return ((tv1->tv_sec - tv2->tv_sec) +
57*6a54128fSAndroid Build Coastguard Worker ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000);
58*6a54128fSAndroid Build Coastguard Worker }
59*6a54128fSAndroid Build Coastguard Worker
print_resource_track(ext2_resize_t rfs,struct resource_track * track,io_channel channel)60*6a54128fSAndroid Build Coastguard Worker void print_resource_track(ext2_resize_t rfs, struct resource_track *track,
61*6a54128fSAndroid Build Coastguard Worker io_channel channel)
62*6a54128fSAndroid Build Coastguard Worker {
63*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETRUSAGE
64*6a54128fSAndroid Build Coastguard Worker struct rusage r;
65*6a54128fSAndroid Build Coastguard Worker #endif
66*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_MALLINFO2
67*6a54128fSAndroid Build Coastguard Worker struct mallinfo2 malloc_info;
68*6a54128fSAndroid Build Coastguard Worker #elif defined HAVE_MALLINFO
69*6a54128fSAndroid Build Coastguard Worker struct mallinfo malloc_info;
70*6a54128fSAndroid Build Coastguard Worker #endif
71*6a54128fSAndroid Build Coastguard Worker struct timeval time_end;
72*6a54128fSAndroid Build Coastguard Worker
73*6a54128fSAndroid Build Coastguard Worker if ((rfs->flags & RESIZE_DEBUG_RTRACK) == 0)
74*6a54128fSAndroid Build Coastguard Worker return;
75*6a54128fSAndroid Build Coastguard Worker
76*6a54128fSAndroid Build Coastguard Worker gettimeofday(&time_end, 0);
77*6a54128fSAndroid Build Coastguard Worker
78*6a54128fSAndroid Build Coastguard Worker if (track->desc)
79*6a54128fSAndroid Build Coastguard Worker printf("%s: ", track->desc);
80*6a54128fSAndroid Build Coastguard Worker
81*6a54128fSAndroid Build Coastguard Worker #define kbytes(x) (((unsigned long)(x) + 1023) / 1024)
82*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_MALLINFO2
83*6a54128fSAndroid Build Coastguard Worker malloc_info = mallinfo2();
84*6a54128fSAndroid Build Coastguard Worker printf("Memory used: %luk/%luk (%luk/%luk), ",
85*6a54128fSAndroid Build Coastguard Worker kbytes(malloc_info.arena), kbytes(malloc_info.hblkhd),
86*6a54128fSAndroid Build Coastguard Worker kbytes(malloc_info.uordblks), kbytes(malloc_info.fordblks));
87*6a54128fSAndroid Build Coastguard Worker #elif defined HAVE_MALLINFO
88*6a54128fSAndroid Build Coastguard Worker
89*6a54128fSAndroid Build Coastguard Worker malloc_info = mallinfo();
90*6a54128fSAndroid Build Coastguard Worker printf("Memory used: %luk/%luk (%luk/%luk), ",
91*6a54128fSAndroid Build Coastguard Worker kbytes(malloc_info.arena), kbytes(malloc_info.hblkhd),
92*6a54128fSAndroid Build Coastguard Worker kbytes(malloc_info.uordblks), kbytes(malloc_info.fordblks));
93*6a54128fSAndroid Build Coastguard Worker #else
94*6a54128fSAndroid Build Coastguard Worker printf("Memory used: %lu, ",
95*6a54128fSAndroid Build Coastguard Worker (unsigned long) (((char *) sbrk(0)) -
96*6a54128fSAndroid Build Coastguard Worker ((char *) track->brk_start)));
97*6a54128fSAndroid Build Coastguard Worker #endif
98*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETRUSAGE
99*6a54128fSAndroid Build Coastguard Worker getrusage(RUSAGE_SELF, &r);
100*6a54128fSAndroid Build Coastguard Worker
101*6a54128fSAndroid Build Coastguard Worker printf("time: %5.2f/%5.2f/%5.2f\n",
102*6a54128fSAndroid Build Coastguard Worker timeval_subtract(&time_end, &track->time_start),
103*6a54128fSAndroid Build Coastguard Worker timeval_subtract(&r.ru_utime, &track->user_start),
104*6a54128fSAndroid Build Coastguard Worker timeval_subtract(&r.ru_stime, &track->system_start));
105*6a54128fSAndroid Build Coastguard Worker #else
106*6a54128fSAndroid Build Coastguard Worker printf("elapsed time: %6.3f\n",
107*6a54128fSAndroid Build Coastguard Worker timeval_subtract(&time_end, &track->time_start));
108*6a54128fSAndroid Build Coastguard Worker #endif
109*6a54128fSAndroid Build Coastguard Worker #define mbytes(x) (((x) + 1048575) / 1048576)
110*6a54128fSAndroid Build Coastguard Worker if (channel && channel->manager && channel->manager->get_stats) {
111*6a54128fSAndroid Build Coastguard Worker io_stats delta = 0;
112*6a54128fSAndroid Build Coastguard Worker unsigned long long bytes_read = 0;
113*6a54128fSAndroid Build Coastguard Worker unsigned long long bytes_written = 0;
114*6a54128fSAndroid Build Coastguard Worker
115*6a54128fSAndroid Build Coastguard Worker channel->manager->get_stats(channel, &delta);
116*6a54128fSAndroid Build Coastguard Worker if (delta) {
117*6a54128fSAndroid Build Coastguard Worker bytes_read = delta->bytes_read - track->bytes_read;
118*6a54128fSAndroid Build Coastguard Worker bytes_written = delta->bytes_written -
119*6a54128fSAndroid Build Coastguard Worker track->bytes_written;
120*6a54128fSAndroid Build Coastguard Worker if (bytes_read == 0 && bytes_written == 0)
121*6a54128fSAndroid Build Coastguard Worker goto skip_io;
122*6a54128fSAndroid Build Coastguard Worker if (track->desc)
123*6a54128fSAndroid Build Coastguard Worker printf("%s: ", track->desc);
124*6a54128fSAndroid Build Coastguard Worker printf("I/O read: %lluMB, write: %lluMB, "
125*6a54128fSAndroid Build Coastguard Worker "rate: %.2fMB/s\n",
126*6a54128fSAndroid Build Coastguard Worker mbytes(bytes_read),
127*6a54128fSAndroid Build Coastguard Worker mbytes(bytes_written),
128*6a54128fSAndroid Build Coastguard Worker (double)mbytes(bytes_read + bytes_written) /
129*6a54128fSAndroid Build Coastguard Worker timeval_subtract(&time_end, &track->time_start));
130*6a54128fSAndroid Build Coastguard Worker }
131*6a54128fSAndroid Build Coastguard Worker }
132*6a54128fSAndroid Build Coastguard Worker skip_io:
133*6a54128fSAndroid Build Coastguard Worker fflush(stdout);
134*6a54128fSAndroid Build Coastguard Worker }
135*6a54128fSAndroid Build Coastguard Worker
136