| From 65180976c9963432d166b47a0b692260a69c0d47 Mon Sep 17 00:00:00 2001 |
| From: Qingming Su <qingming.su@windriver.com> |
| Date: Tue, 19 Aug 2014 05:16:17 -0400 |
| Subject: [PATCH] lmbench: Can't proceed on some targets |
| |
| lmbench can't proceed on some targets. The memory check fails because the |
| memory latency of each page is longer then 10us, which is a time limit set |
| in the original memsize.c. |
| |
| The memory latency is very different on different targets due to the |
| hardware and current system load. The targets with slower memory |
| chips or heavy system load need much longer time to read or write |
| the memory. |
| |
| This fix changes the fixed time limit of 10us to a specific value calculated |
| from the runtime target. |
| |
| Also set an upper limit of memory size used for lmbench testing. The memory |
| check sometimes fails if the target has a large amount of memory, for |
| example more than 4G. |
| |
| Signed-off-by: Qingming Su <qingming.su@windriver.com> |
| Signed-off-by: Fupan Li <fupan.li@windriver.com> |
| |
| Add and reword above comments |
| |
| Upstream-status: inappropriate [ configuration ] |
| |
| Signed-off-by: Mark Hatle <mark.hatle@windriver.com> |
| |
| --- |
| scripts/config-run | 12 +++++++--- |
| src/Makefile | 4 ++-- |
| src/memsize.c | 66 +++++++++++++++++++++++++++++++++++------------------- |
| 3 files changed, 54 insertions(+), 28 deletions(-) |
| |
| diff --git a/scripts/config-run b/scripts/config-run |
| index 918cbdf..096ed12 100755 |
| --- a/scripts/config-run |
| +++ b/scripts/config-run |
| @@ -197,6 +197,12 @@ The bigger the range, the more accurate the results, but larger sizes |
| take somewhat longer to run the benchmark. |
| |
| EOF |
| + |
| +# By default, use 512M memory as the upper limit for lmbench test |
| +if [ $MB -gt 512 ];then |
| +MB=512 |
| +fi |
| + |
| echo $ECHON "MB [default $MB]: $ECHOC" |
| read TMP |
| if [ X$TMP != X ] |
| @@ -687,10 +693,10 @@ case $MAIL in |
| ;; |
| esac |
| |
| -INFO=`../scripts/info` |
| +INFO=`../scripts/hostinfo` |
| if [ $MAIL = yes ] |
| then if [ ! -f $INFO ] |
| - then cp ../scripts/info-template $INFO |
| + then cp ../scripts/hostinfo-template $INFO |
| chmod +w $INFO |
| REUSE=no |
| else |
| @@ -733,7 +739,7 @@ EOF |
| then EDITOR=$TMP |
| fi |
| if [ X$EDITOR != "none" ] |
| - then $EDITOR `../scripts/info` |
| + then $EDITOR `../scripts/hostinfo` |
| fi |
| fi |
| fi |
| diff --git a/src/Makefile b/src/Makefile |
| index c7e4e3c..d9efd54 100644 |
| --- a/src/Makefile |
| +++ b/src/Makefile |
| @@ -50,7 +50,7 @@ TARGET=`../scripts/target` |
| BINDIR=../bin/$(OS) |
| CONFIG=../bin/$(OS)/`../scripts/config` |
| UTILS=../scripts/target ../scripts/os ../scripts/gnu-os ../scripts/compiler \ |
| - ../scripts/info ../scripts/info-template ../scripts/version \ |
| + ../scripts/hostinfo ../scripts/hostinfo-template ../scripts/version \ |
| ../scripts/config ../scripts/config-run ../scripts/results \ |
| ../scripts/lmbench ../scripts/make ../scripts/build |
| INSTALL=cp |
| @@ -240,7 +240,7 @@ $O/getopt.o : getopt.c $(INCS) |
| $(COMPILE) -c getopt.c -o $O/getopt.o |
| |
| $(UTILS) : |
| - -cd ../scripts; make get |
| + -cd ../scripts; cp info hostinfo; cp info-template hostinfo-template |
| |
| # Do not remove the next line, $(MAKE) depend needs it |
| # MAKEDEPEND follows |
| diff --git a/src/memsize.c b/src/memsize.c |
| index eb25a09..82d7faf 100644 |
| --- a/src/memsize.c |
| +++ b/src/memsize.c |
| @@ -14,9 +14,12 @@ char *id = "$Id$\n"; |
| |
| #define CHK(x) if ((x) == -1) { perror("x"); exit(1); } |
| |
| -#ifndef TOO_LONG |
| -#define TOO_LONG 10 /* usecs */ |
| -#endif |
| +//#ifndef TOO_LONG |
| +//#define TOO_LONG 10 /* usecs */ |
| +//#endif |
| + |
| +#define MEMORY_SIZE_1MB (1024 * 1024) |
| +#define MEMORY_SIZE_8MB (8 * 1024 * 1024) |
| |
| int alarm_triggered = 0; |
| |
| @@ -35,10 +38,10 @@ main(int ac, char **av) |
| size_t delta; |
| |
| if (ac == 2) { |
| - max = size = bytes(av[1]) * 1024 * 1024; |
| + max = size = bytes(av[1]) * MEMORY_SIZE_1MB; |
| } |
| - if (max < 1024 * 1024) { |
| - max = size = 1024 * 1024 * 1024; |
| + if (max < MEMORY_SIZE_1MB) { |
| + max = size = 1024 * MEMORY_SIZE_1MB; |
| } |
| /* |
| * Binary search down and then binary search up |
| @@ -48,7 +51,7 @@ main(int ac, char **av) |
| } |
| /* delta = size / (2 * 1024 * 1024) */ |
| for (delta = (size >> 21); delta > 0; delta >>= 1) { |
| - uint64 sz = (uint64)size + (uint64)delta * 1024 * 1024; |
| + uint64 sz = (uint64)size + (uint64)delta * MEMORY_SIZE_1MB; |
| size_t check = sz; |
| if (max < sz) continue; |
| if (check < sz || !test_malloc(sz)) break; |
| @@ -66,41 +69,58 @@ timeit(char *where, size_t size) |
| { |
| int sum = 0; |
| size_t n; |
| - size_t s_prev; |
| + size_t s_prev = MEMORY_SIZE_8MB; |
| size_t range; |
| - size_t incr = 1024 * 1024; |
| + size_t incr = MEMORY_SIZE_1MB; |
| size_t pagesize = getpagesize(); |
| - unsigned long long s; |
| - |
| - if (size < 1024*1024 - 16*1024) { |
| - fprintf(stderr, "Bad size\n"); |
| - return; |
| - } |
| + size_t time_each_page = 0; |
| + size_t too_long = 0; |
| + unsigned long long s; |
| + |
| + if (pagesize < MEMORY_SIZE_1MB) |
| + range = MEMORY_SIZE_1MB; |
| + else |
| + range = MEMORY_SIZE_8MB; |
| + |
| + incr = MEMORY_SIZE_1MB; |
| + |
| + if (size < range) { |
| + fprintf(stderr, "Bad size\n"); |
| + return; |
| + } |
| + |
| + //Touch range of memory, get the average time (usec) of operating each memory page on this system |
| + start(0); |
| + touchRange(where, range, pagesize); |
| + sum = stop(0, 0); |
| + |
| + if ((time_each_page = sum * pagesize / range) < 1) |
| + time_each_page = 1; |
| + //Set the uper limit of time spending on one page |
| + too_long = 10 * time_each_page; |
| |
| - range = 1024 * 1024; |
| - incr = 1024 * 1024; |
| - touchRange(where, range, pagesize); |
| for (range += incr; range <= size; range += incr) { |
| n = range / pagesize; |
| - set_alarm(n * TOO_LONG); |
| + set_alarm(n * too_long); |
| touchRange(where + range - incr, incr, pagesize); |
| clear_alarm(); |
| - set_alarm(n * TOO_LONG); |
| + set_alarm(n * too_long); |
| start(0); |
| touchRange(where, range, pagesize); |
| sum = stop(0, 0); |
| clear_alarm(); |
| - if ((sum / n) > TOO_LONG || alarm_triggered) { |
| + if ((sum / n) > too_long || alarm_triggered) { |
| size = range - incr; |
| + fprintf(stderr, "Error! Memory testing timeout! Touch one page of memory needs more than %d (usecs)\n ", too_long); |
| break; |
| } |
| - for (s = 8 * 1024 * 1024; s <= range; s_prev = s, s *= 2) |
| + for (s = s_prev; s <= range; s_prev = s, s *= 2) |
| if (s < s_prev) break; |
| incr = s / 8; |
| if (range < size && size < range + incr) { |
| incr = size - range; |
| } |
| - fprintf(stderr, "%dMB OK\r", (int)(range/(1024*1024))); |
| + fprintf(stderr, "%dMB OK\r", (int)(range/MEMORY_SIZE_1MB)); |
| } |
| fprintf(stderr, "\n"); |
| printf("%d\n", (int)(size>>20)); |