hdparm: reduce possibility of numeric overflow in -T.

do_time                                              386     410     +24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 24/0)               Total: 24 bytes
This commit is contained in:
Denis Vlasenko 2007-09-28 11:21:47 +00:00
parent b925605441
commit a7bc9ac8f8

View File

@ -1375,10 +1375,13 @@ static void print_timing(unsigned long m, unsigned elapsed_us)
printf("%5lu MB in %u.%02u seconds = %lu kB/s\n", printf("%5lu MB in %u.%02u seconds = %lu kB/s\n",
m, sec, hs, m, sec, hs,
/* Trying to not overflow 32-bit arith in m * CONST /* Trying to not overflow 32-bit arith in m * CONST
* by keeping CONST not so big. + 1 prevents div-by-0. */ * by keeping CONST not so big. But elapsed_us / CONST2
(m * (1024 * 1000000 / (64*1024))) / (elapsed_us / (64*1024) + 1) * also should not introduce big errors. Currently,
// ~= (m * 1024 * 1000000) / elapsed_ms * 16000us is ~1.6% of 1 second.
// = (m * 1024) / (elapsed_ms / 1000000) * "+ 1" prevents div-by-0. */
(m * (1024 * 1000000 / (16*1024))) / (elapsed_us / (16*1024) + 1)
// ~= (m * 1024 * 1000000) / elapsed_us
// = (m * 1024) / (elapsed_us / 1000000)
// = kb / elapsed_sec // = kb / elapsed_sec
); );
} }
@ -1418,6 +1421,11 @@ static void do_time(int cache /*,int fd*/)
/* Now do the timing */ /* Now do the timing */
iterations = 0; iterations = 0;
/* Max time to run (small for cache, avoids getting
* huge total_MB which can overlow on print_timing) */
elapsed2 = 510000; /* cache */
if (!cache)
elapsed2 = 3000000; /* not cache */
start = monotonic_us(); start = monotonic_us();
do { do {
if (cache) if (cache)
@ -1425,11 +1433,11 @@ static void do_time(int cache /*,int fd*/)
read_big_block(buf); read_big_block(buf);
elapsed = (unsigned)monotonic_us() - start; elapsed = (unsigned)monotonic_us() - start;
++iterations; ++iterations;
} while (elapsed < 3000000 && iterations < max_iterations); } while (elapsed < elapsed2 && iterations < max_iterations);
total_MB = (unsigned long)iterations * TIMING_BUF_MB; total_MB = (unsigned long)iterations * TIMING_BUF_MB;
//printf(" elapsed:%u iterations:%u ", elapsed, iterations); //printf(" elapsed:%u iterations:%u ", elapsed, iterations);
if (cache) { if (cache) {
/* Now remove the lseek() and monotonic_us() overheads /* Cache: remove lseek() and monotonic_us() overheads
* from elapsed */ * from elapsed */
start = monotonic_us(); start = monotonic_us();
do { do {