Skip to content

Commit ceef4cf

Browse files
Amit Kumar Mahapatramiquelraynal
authored andcommitted
mtd: tests: Fix eraseblock read speed miscalculation for lower partition sizes
While calculating speed during mtd_speedtest, the time interval (i.e., start - finish) is rounded off to the nearest milliseconds by ignoring the fractional part. This leads to miscalculation of speed. The miscalculation is more visible while running speed test on small partition sizes(i.e., when partition size is equal to eraseblock size or twice the eraseblock size) at higher spi frequencies. For e.g., while calculating eraseblock read speed for a mtd partition with size equal to the eraseblock size(i.e., 64KiB) the eraseblock read time interval comes out to be 966490 nanosecond. This is then converted to millisecond(i.e., 0.966 msec.). The integer part (i.e., 0 msec) of the value is considered and the fractional part (i.e., 0.966) is ignored,for calculating the eraseblock read speed. So the reported eraseblock read speed is 0 KiB/s, which is incorrect. There are two approaches to fix this issue. First approach will be to keep the time interval in millisecond. and round up the integer value, with this approach the 0.966msec time interval in the above example will be rounded up to 1msec and this value is used for calculating the speed. Downside of this approach is that the reported speed is still not accurate. Second approach will be to convert the time interval to microseconds instead of milliseconds, with this approach the 966490 nanosecond time interval in the above example will be converted t0 966.490usec and this value is used for calculating the speed. As compared to the current implementation and the suggested First approach, this approach will report a more accurate speed. Downside of this approach is that, in future if the mtd size is too large then the u64 variable, that holds the number of bytes, might overflow. In this patch we have gone with the second approach as this reports a more accurate speed. With this approach the eraseblock read speed in the above example comes out to be 132505 KiB/s when the spi clock is configured at 150Mhz. Signed-off-by: Amit Kumar Mahapatra <amit.kumar-mahapatra@xilinx.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20220208103905.13354-1-amit.kumar-mahapatra@xilinx.com
1 parent 2365f91 commit ceef4cf

1 file changed

Lines changed: 5 additions & 6 deletions

File tree

drivers/mtd/tests/speedtest.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,13 @@ static inline void stop_timing(void)
160160

161161
static long calc_speed(void)
162162
{
163-
uint64_t k;
164-
long ms;
163+
uint64_t k, us;
165164

166-
ms = ktime_ms_delta(finish, start);
167-
if (ms == 0)
165+
us = ktime_us_delta(finish, start);
166+
if (us == 0)
168167
return 0;
169-
k = (uint64_t)goodebcnt * (mtd->erasesize / 1024) * 1000;
170-
do_div(k, ms);
168+
k = (uint64_t)goodebcnt * (mtd->erasesize / 1024) * 1000000;
169+
do_div(k, us);
171170
return k;
172171
}
173172

0 commit comments

Comments
 (0)