From patchwork Fri Mar 4 17:53:18 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Bug in mtd_speedtest? From: David Lambert X-Patchwork-Id: 85428 Message-Id: <4D71270E.9030204@lambsys.com> To: dedekind1@gmail.com Cc: "linux-mtd@lists.infradead.org" Date: Fri, 04 Mar 2011 11:53:18 -0600 Artem, Please find attached patch. Regards, Dave. On 03/04/2011 12:59 AM, Artem Bityutskiy wrote: > On Thu, 2011-03-03 at 17:45 -0600, David Lambert wrote: >> I think I may have found an overflow condition in the speed calculation >> of mtd_speedtest on some platforms with larger flash partitions: >> >> Consider for example if goodebcnt = 15000, and mtd->erasesize = >> 256*1024, then there is an intermediate product of 3932160000 which >> results in the sign bit being set on a 32 bit integer. Maybe k should be >> an unsigned long long? > Please, just send a patch :-) > Index: mtd_speedtest.c =================================================================== RCS file: /home/cvsroot/ECMB/src/snapgear/linux-2.6.30.1.x/drivers/mtd/tests/mtd_speedtest.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 mtd_speedtest.c --- mtd_speedtest.c 10 Aug 2009 19:42:00 -0000 1.1.1.1 +++ mtd_speedtest.c 4 Mar 2011 17:51:23 -0000 @@ -281,13 +281,14 @@ static long calc_speed(void) { - long ms, k, speed; + uint64_t k; + long ms; - ms = (finish.tv_sec - start.tv_sec) * 1000 + - (finish.tv_usec - start.tv_usec) / 1000; - k = goodebcnt * mtd->erasesize / 1024; - speed = (k * 1000) / ms; - return speed; + ms = (finish.tv_sec - start.tv_sec) * 1000 + /* Time in milli-seconds from start to ...*/ + (finish.tv_usec - start.tv_usec) / 1000; /* finish */ + k = (goodebcnt * (mtd->erasesize / 1024) * 1000); /* Number of kBytes transferred * 1000 */ + do_div(k, ms); /* k now contains number of kBytes/second */ + return k; } static int scan_for_bad_eraseblocks(void)