blob: 0274bc32afaad479e729b23cea864a8c2109d34c [file] [log] [blame]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001From 65180976c9963432d166b47a0b692260a69c0d47 Mon Sep 17 00:00:00 2001
2From: Qingming Su <qingming.su@windriver.com>
3Date: Tue, 19 Aug 2014 05:16:17 -0400
4Subject: [PATCH] lmbench: Can't proceed on some targets
Patrick Williamsb48b7b42016-08-17 15:04:38 -05005
6lmbench can't proceed on some targets. The memory check fails because the
7memory latency of each page is longer then 10us, which is a time limit set
8in the original memsize.c.
9
10The memory latency is very different on different targets due to the
11hardware and current system load. The targets with slower memory
12chips or heavy system load need much longer time to read or write
13the memory.
14
15This fix changes the fixed time limit of 10us to a specific value calculated
16from the runtime target.
17
18Also set an upper limit of memory size used for lmbench testing. The memory
19check sometimes fails if the target has a large amount of memory, for
20example more than 4G.
21
22Signed-off-by: Qingming Su <qingming.su@windriver.com>
23Signed-off-by: Fupan Li <fupan.li@windriver.com>
24
25Add and reword above comments
26
Patrick Williamsb9af8752023-01-30 13:28:01 -060027Upstream-Status: Inappropriate [ configuration ]
Patrick Williamsb48b7b42016-08-17 15:04:38 -050028
29Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
30
Brad Bishop316dfdd2018-06-25 12:45:53 -040031---
32 scripts/config-run | 12 +++++++---
33 src/Makefile | 4 ++--
34 src/memsize.c | 66 +++++++++++++++++++++++++++++++++++-------------------
35 3 files changed, 54 insertions(+), 28 deletions(-)
36
Patrick Williamsb48b7b42016-08-17 15:04:38 -050037diff --git a/scripts/config-run b/scripts/config-run
Brad Bishop316dfdd2018-06-25 12:45:53 -040038index 918cbdf..096ed12 100755
Patrick Williamsb48b7b42016-08-17 15:04:38 -050039--- a/scripts/config-run
40+++ b/scripts/config-run
Brad Bishop316dfdd2018-06-25 12:45:53 -040041@@ -197,6 +197,12 @@ The bigger the range, the more accurate the results, but larger sizes
Patrick Williamsb48b7b42016-08-17 15:04:38 -050042 take somewhat longer to run the benchmark.
Brad Bishop316dfdd2018-06-25 12:45:53 -040043
Patrick Williamsb48b7b42016-08-17 15:04:38 -050044 EOF
45+
46+# By default, use 512M memory as the upper limit for lmbench test
47+if [ $MB -gt 512 ];then
48+MB=512
49+fi
50+
51 echo $ECHON "MB [default $MB]: $ECHOC"
Brad Bishop316dfdd2018-06-25 12:45:53 -040052 read TMP
53 if [ X$TMP != X ]
54@@ -687,10 +693,10 @@ case $MAIL in
55 ;;
Patrick Williamsb48b7b42016-08-17 15:04:38 -050056 esac
Brad Bishop316dfdd2018-06-25 12:45:53 -040057
Patrick Williamsb48b7b42016-08-17 15:04:38 -050058-INFO=`../scripts/info`
59+INFO=`../scripts/hostinfo`
60 if [ $MAIL = yes ]
61 then if [ ! -f $INFO ]
62- then cp ../scripts/info-template $INFO
63+ then cp ../scripts/hostinfo-template $INFO
64 chmod +w $INFO
65 REUSE=no
Brad Bishop316dfdd2018-06-25 12:45:53 -040066 else
67@@ -733,7 +739,7 @@ EOF
Patrick Williamsb48b7b42016-08-17 15:04:38 -050068 then EDITOR=$TMP
69 fi
70 if [ X$EDITOR != "none" ]
71- then $EDITOR `../scripts/info`
72+ then $EDITOR `../scripts/hostinfo`
73 fi
74 fi
75 fi
76diff --git a/src/Makefile b/src/Makefile
Brad Bishop316dfdd2018-06-25 12:45:53 -040077index c7e4e3c..d9efd54 100644
Patrick Williamsb48b7b42016-08-17 15:04:38 -050078--- a/src/Makefile
79+++ b/src/Makefile
Brad Bishop316dfdd2018-06-25 12:45:53 -040080@@ -50,7 +50,7 @@ TARGET=`../scripts/target`
Patrick Williamsb48b7b42016-08-17 15:04:38 -050081 BINDIR=../bin/$(OS)
82 CONFIG=../bin/$(OS)/`../scripts/config`
83 UTILS=../scripts/target ../scripts/os ../scripts/gnu-os ../scripts/compiler \
84- ../scripts/info ../scripts/info-template ../scripts/version \
85+ ../scripts/hostinfo ../scripts/hostinfo-template ../scripts/version \
86 ../scripts/config ../scripts/config-run ../scripts/results \
87 ../scripts/lmbench ../scripts/make ../scripts/build
88 INSTALL=cp
89@@ -240,7 +240,7 @@ $O/getopt.o : getopt.c $(INCS)
90 $(COMPILE) -c getopt.c -o $O/getopt.o
Brad Bishop316dfdd2018-06-25 12:45:53 -040091
Patrick Williamsb48b7b42016-08-17 15:04:38 -050092 $(UTILS) :
93- -cd ../scripts; make get
94+ -cd ../scripts; cp info hostinfo; cp info-template hostinfo-template
Brad Bishop316dfdd2018-06-25 12:45:53 -040095
Patrick Williamsb48b7b42016-08-17 15:04:38 -050096 # Do not remove the next line, $(MAKE) depend needs it
97 # MAKEDEPEND follows
98diff --git a/src/memsize.c b/src/memsize.c
Brad Bishop316dfdd2018-06-25 12:45:53 -040099index eb25a09..82d7faf 100644
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500100--- a/src/memsize.c
101+++ b/src/memsize.c
102@@ -14,9 +14,12 @@ char *id = "$Id$\n";
Brad Bishop316dfdd2018-06-25 12:45:53 -0400103
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500104 #define CHK(x) if ((x) == -1) { perror("x"); exit(1); }
Brad Bishop316dfdd2018-06-25 12:45:53 -0400105
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500106-#ifndef TOO_LONG
107-#define TOO_LONG 10 /* usecs */
108-#endif
109+//#ifndef TOO_LONG
110+//#define TOO_LONG 10 /* usecs */
111+//#endif
112+
113+#define MEMORY_SIZE_1MB (1024 * 1024)
114+#define MEMORY_SIZE_8MB (8 * 1024 * 1024)
Brad Bishop316dfdd2018-06-25 12:45:53 -0400115
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500116 int alarm_triggered = 0;
Brad Bishop316dfdd2018-06-25 12:45:53 -0400117
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500118@@ -35,10 +38,10 @@ main(int ac, char **av)
119 size_t delta;
Brad Bishop316dfdd2018-06-25 12:45:53 -0400120
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500121 if (ac == 2) {
122- max = size = bytes(av[1]) * 1024 * 1024;
123+ max = size = bytes(av[1]) * MEMORY_SIZE_1MB;
124 }
125- if (max < 1024 * 1024) {
126- max = size = 1024 * 1024 * 1024;
127+ if (max < MEMORY_SIZE_1MB) {
128+ max = size = 1024 * MEMORY_SIZE_1MB;
129 }
130 /*
131 * Binary search down and then binary search up
132@@ -48,7 +51,7 @@ main(int ac, char **av)
133 }
134 /* delta = size / (2 * 1024 * 1024) */
135 for (delta = (size >> 21); delta > 0; delta >>= 1) {
136- uint64 sz = (uint64)size + (uint64)delta * 1024 * 1024;
137+ uint64 sz = (uint64)size + (uint64)delta * MEMORY_SIZE_1MB;
138 size_t check = sz;
139 if (max < sz) continue;
140 if (check < sz || !test_malloc(sz)) break;
141@@ -66,41 +69,58 @@ timeit(char *where, size_t size)
142 {
143 int sum = 0;
144 size_t n;
145- size_t s_prev;
146+ size_t s_prev = MEMORY_SIZE_8MB;
147 size_t range;
148- size_t incr = 1024 * 1024;
149+ size_t incr = MEMORY_SIZE_1MB;
150 size_t pagesize = getpagesize();
151- unsigned long long s;
152-
153- if (size < 1024*1024 - 16*1024) {
154- fprintf(stderr, "Bad size\n");
155- return;
156- }
157+ size_t time_each_page = 0;
158+ size_t too_long = 0;
159+ unsigned long long s;
160+
161+ if (pagesize < MEMORY_SIZE_1MB)
162+ range = MEMORY_SIZE_1MB;
163+ else
164+ range = MEMORY_SIZE_8MB;
165+
166+ incr = MEMORY_SIZE_1MB;
167+
168+ if (size < range) {
169+ fprintf(stderr, "Bad size\n");
170+ return;
171+ }
172+
173+ //Touch range of memory, get the average time (usec) of operating each memory page on this system
174+ start(0);
175+ touchRange(where, range, pagesize);
176+ sum = stop(0, 0);
177+
178+ if ((time_each_page = sum * pagesize / range) < 1)
179+ time_each_page = 1;
180+ //Set the uper limit of time spending on one page
181+ too_long = 10 * time_each_page;
Brad Bishop316dfdd2018-06-25 12:45:53 -0400182
Patrick Williamsb48b7b42016-08-17 15:04:38 -0500183- range = 1024 * 1024;
184- incr = 1024 * 1024;
185- touchRange(where, range, pagesize);
186 for (range += incr; range <= size; range += incr) {
187 n = range / pagesize;
188- set_alarm(n * TOO_LONG);
189+ set_alarm(n * too_long);
190 touchRange(where + range - incr, incr, pagesize);
191 clear_alarm();
192- set_alarm(n * TOO_LONG);
193+ set_alarm(n * too_long);
194 start(0);
195 touchRange(where, range, pagesize);
196 sum = stop(0, 0);
197 clear_alarm();
198- if ((sum / n) > TOO_LONG || alarm_triggered) {
199+ if ((sum / n) > too_long || alarm_triggered) {
200 size = range - incr;
201+ fprintf(stderr, "Error! Memory testing timeout! Touch one page of memory needs more than %d (usecs)\n ", too_long);
202 break;
203 }
204- for (s = 8 * 1024 * 1024; s <= range; s_prev = s, s *= 2)
205+ for (s = s_prev; s <= range; s_prev = s, s *= 2)
206 if (s < s_prev) break;
207 incr = s / 8;
208 if (range < size && size < range + incr) {
209 incr = size - range;
210 }
211- fprintf(stderr, "%dMB OK\r", (int)(range/(1024*1024)));
212+ fprintf(stderr, "%dMB OK\r", (int)(range/MEMORY_SIZE_1MB));
213 }
214 fprintf(stderr, "\n");
215 printf("%d\n", (int)(size>>20));