From 748aab4b0f2c77b4b0034f26abd74696d32aef67 Mon Sep 17 00:00:00 2001 From: Marek Bykowski Date: Tue, 22 Oct 2019 04:17:33 -0500 Subject: [PATCH] Fix/clean-up the build for lmbench This is the heads-up that meta-oe of Yocto is planning on integrating a couple of changes to lmbench. These changes can be wrapped up around fixing/cleaning up as follows: - if lmbench doesn't use a return from a function attributed to warn_unused_result supress the warning/s - fix buffer overflow - define feature_test_macro _GNU_SOURCE compiling in sched_{get,set}affinity() - go strict for a pre-build check if sched_{get,set}affinity() from glibc builds cleanly. If it is not compile it out. Please find the original discussion on the changes at meta-oe http://lists.openembedded.org/pipermail/openembedded-devel/2019-October/202206.html I have tested these changes against this repo and they build just fine. The compiler warns though about the changes which already are in the meta-oe and are not part of this commit. Signed-off-by: Marek Bykowski Reviewed-off-by: Marcin Lapaj --- scripts/build | 29 ++++++++++++++++------------- src/Makefile | 2 +- src/bw_tcp.c | 2 +- src/bw_unix.c | 4 ++-- src/hello.c | 2 +- src/lat_connect.c | 2 +- src/lat_fcntl.c | 4 ++-- src/lat_fs.c | 2 +- src/lat_http.c | 6 +++--- src/lat_proc.c | 2 +- src/lat_select.c | 2 +- src/lat_tcp.c | 8 ++++---- src/lat_unix.c | 2 +- src/lat_unix_connect.c | 4 ++-- src/lib_debug.c | 1 + src/lib_sched.c | 7 +++++-- src/lib_timing.c | 18 +++++++++--------- src/lmhttp.c | 26 +++++++++++++++++--------- src/memsize.c | 2 +- 19 files changed, 70 insertions(+), 55 deletions(-) diff --git a/scripts/build b/scripts/build index 16a6600..8df9b38 100755 --- a/scripts/build +++ b/scripts/build @@ -18,8 +18,6 @@ done trap 'rm -f ${BASE}$$.s ${BASE}$$.c ${BASE}$$.o ${BASE}$$; exit 1' 1 2 15 -LDLIBS=-lm - # check for HP-UX's ANSI compiler echo "main(int ac, char *av[]) { int i; }" > ${BASE}$$.c if ${CC} ${CFLAGS} -o ${BASE}$$ ${BASE}$$.c 1>${NULL} 2>${NULL} @@ -33,7 +31,7 @@ else fi fi rm -f ${BASE}$$ ${BASE}$$.o ${BASE}$$.c - + # check for IA64 HP-UX w/ HP's ANSI compiler; may need pointer swizzling arch=`echo $OS | awk -F- '{print $1;}'` if [ X$CC = "Xcc" -a X$arch = "Xia64" ] @@ -48,7 +46,7 @@ then && CFLAGS="${CFLAGS} +DD64" rm -f ${BASE}$$ ${BASE}$$.o ${BASE}$$.c fi - + # check for bcopy (optionally set the SYS5 flag) echo "#include " > ${BASE}$$.c echo "main() { char a[256], b[256]; bcopy(a, b, 256); }" >> ${BASE}$$.c @@ -236,15 +234,20 @@ ${CC} ${CFLAGS} -o ${BASE}$$ ${BASE}$$.c 1>${NULL} 2>${NULL} \ && CFLAGS="${CFLAGS} -DHAVE_BINDPROCESSOR=1"; rm -f ${BASE}$$ ${BASE}$$.o ${BASE}$$.c -# check that we have sched_setaffinity -echo "#include " > ${BASE}$$.c -echo "#include " >> ${BASE}$$.c -echo "#include " >> ${BASE}$$.c -echo "main() { unsigned long mask = 1; return sched_setaffinity(0, sizeof(unsigned long), &mask); }" >> ${BASE}$$.c -${CC} ${CFLAGS} -o ${BASE}$$ ${BASE}$$.c 1>${NULL} 2>${NULL} \ - && CFLAGS="${CFLAGS} -DHAVE_SCHED_SETAFFINITY=1"; -rm -f ${BASE}$$ ${BASE}$$.o ${BASE}$$.c - +# check that we have sched_setaffinity and it builds cleanly +cat << '_ACEOF' > ${BASE}$$.c +#define _GNU_SOURCE +#include +#include +#include +int main() { +cpu_set_t set; CPU_ZERO(&set); CPU_SET(0, &set); +if (sched_setaffinity(0, sizeof(set), &set) == -1) exit(EXIT_FAILURE); exit(EXIT_SUCCESS); +} +_ACEOF +${CC} ${CFLAGS} -o ${BASE}$$ ${BASE}$$.c ${LDLIBS} 1>${NULL} 2>${BASE}$$_err +test -s ${BASE}$$_err || CFLAGS="${CFLAGS} -DHAVE_SCHED_SETAFFINITY=1" +rm -f ${BASE}$$_err ${BASE}$$ ${BASE}$$.o ${BASE}$$.c if [ ! -d ${BINDIR} ]; then mkdir -p ${BINDIR}; fi diff --git a/src/Makefile b/src/Makefile index 2555014..b7041f0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -34,7 +34,7 @@ # I finally know why Larry Wall's Makefile says "Grrrr". SHELL=/bin/sh -CC=`../scripts/compiler` +CC=x86_64-intelaxxia-linux-gcc MAKE=`../scripts/make` AR=ar ARCREATE=cr diff --git a/src/bw_tcp.c b/src/bw_tcp.c index 6a2e8f7..0dcd070 100644 --- a/src/bw_tcp.c +++ b/src/bw_tcp.c @@ -60,7 +60,7 @@ main(int ac, char **av) { int conn; conn = tcp_connect(optarg, TCP_DATA, SOCKOPT_NONE); - write(conn, "0", 1); + (void) !write(conn, "0", 1); exit(0); } case 'm': diff --git a/src/bw_unix.c b/src/bw_unix.c index c877585..810a21b 100644 --- a/src/bw_unix.c +++ b/src/bw_unix.c @@ -97,7 +97,7 @@ reader(iter_t iterations, void* cookie) size_t todo = state->bytes; while (iterations-- > 0) { - write(state->control[1], &todo, sizeof(todo)); + (void) !write(state->control[1], &todo, sizeof(todo)); for (done = 0; done < todo; done += n) { if ((n = read(state->pipes[0], state->buf, state->xfer)) <= 0) { /* error! */ @@ -114,7 +114,7 @@ writer(int controlfd, int writefd, char* buf, void* cookie) struct _state* state = (struct _state*)cookie; for ( ;; ) { - read(controlfd, &todo, sizeof(todo)); + (void) !read(controlfd, &todo, sizeof(todo)); for (done = 0; done < todo; done += n) { #ifdef TOUCH touch(buf, XFERSIZE); diff --git a/src/hello.c b/src/hello.c index 15a2493..0f7f237 100644 --- a/src/hello.c +++ b/src/hello.c @@ -3,6 +3,6 @@ int main() { - write(1, "Hello world\n", 12); + (void) !write(1, "Hello world\n", 12); return (0); } diff --git a/src/lat_connect.c b/src/lat_connect.c index 6639cca..404e21a 100644 --- a/src/lat_connect.c +++ b/src/lat_connect.c @@ -52,7 +52,7 @@ main(int ac, char **av) int sock = tcp_connect(av[optind], TCP_CONNECT, SOCKOPT_NONE); - write(sock, "0", 1); + (void) !write(sock, "0", 1); close(sock); exit(0); } diff --git a/src/lat_fcntl.c b/src/lat_fcntl.c index bfe9e7f..a367943 100644 --- a/src/lat_fcntl.c +++ b/src/lat_fcntl.c @@ -120,8 +120,8 @@ initialize(iter_t iterations, void* cookie) } unlink(state->filename1); unlink(state->filename2); - write(state->fd1, buf, sizeof(buf)); - write(state->fd2, buf, sizeof(buf)); + (void) !write(state->fd1, buf, sizeof(buf)); + (void) !write(state->fd2, buf, sizeof(buf)); lock.l_type = F_WRLCK; lock.l_whence = 0; lock.l_start = 0; diff --git a/src/lat_fs.c b/src/lat_fs.c index 0dfafb9..9ea65a6 100644 --- a/src/lat_fs.c +++ b/src/lat_fs.c @@ -117,7 +117,7 @@ mkfile(char *name, size_t size) while (size > 0) { chunk = ((size > (128*1024)) ? (128*1024) : size); - write(fd, buf, chunk); + (void) !write(fd, buf, chunk); size -= chunk; } close(fd); diff --git a/src/lat_http.c b/src/lat_http.c index 77e6f38..78305f5 100644 --- a/src/lat_http.c +++ b/src/lat_http.c @@ -29,11 +29,11 @@ http(char *server, char *file, int prog) if (debug) { printf(buf); } - write(sock, buf, strlen(buf)); + (void) !write(sock, buf, strlen(buf)); while ((n = read(sock, buf, XFERSIZE)) > 0) { b += n; if (echo) { - write(1, buf, n); + (void) !write(1, buf, n); } } close(sock); @@ -49,7 +49,7 @@ killhttp(char *server, int prog) int sock; sock = tcp_connect(server, prog, SOCKOPT_REUSE); - write(sock, "EXIT", 4); + (void) !write(sock, "EXIT", 4); close(sock); } diff --git a/src/lat_proc.c b/src/lat_proc.c index e36e19d..190e349 100644 --- a/src/lat_proc.c +++ b/src/lat_proc.c @@ -111,7 +111,7 @@ do_shell(iter_t iterations, void* cookie) case 0: /* child */ handle_scheduler(benchmp_childid(), 1, 1); close(1); - execlp("/bin/sh", "sh", "-c", PROG, 0); + execlp("/bin/sh", "sh", "-c", PROG, (char *)0); exit(1); default: diff --git a/src/lat_select.c b/src/lat_select.c index 583b505..2bcdb3b 100644 --- a/src/lat_select.c +++ b/src/lat_select.c @@ -131,7 +131,7 @@ server(void* cookie) /* child server process */ while (pid == getppid()) { int newsock = tcp_accept(state->sock, SOCKOPT_NONE); - read(newsock, &state->fid, 1); + (void) !read(newsock, &state->fid, 1); close(newsock); } exit(0); diff --git a/src/lat_tcp.c b/src/lat_tcp.c index cf4d145..2fd36f6 100644 --- a/src/lat_tcp.c +++ b/src/lat_tcp.c @@ -100,7 +100,7 @@ init(iter_t iterations, void* cookie) state->sock = tcp_connect(state->server, TCP_XACT, SOCKOPT_NONE); state->buf = malloc(state->msize); - write(state->sock, &msize, sizeof(int)); + (void) !write(state->sock, &msize, sizeof(int)); } void @@ -121,8 +121,8 @@ doclient(iter_t iterations, void* cookie) int sock = state->sock; while (iterations-- > 0) { - write(sock, state->buf, state->msize); - read(sock, state->buf, state->msize); + (void) !write(sock, state->buf, state->msize); + (void) !read(sock, state->buf, state->msize); } } @@ -161,7 +161,7 @@ doserver(int sock) char* buf = (char*)malloc(msize); for (n = 0; read(sock, buf, msize) > 0; n++) { - write(sock, buf, msize); + (void) !write(sock, buf, msize); } free(buf); } else { diff --git a/src/lat_unix.c b/src/lat_unix.c index 1e321f8..2d598c6 100644 --- a/src/lat_unix.c +++ b/src/lat_unix.c @@ -94,7 +94,7 @@ initialize(iter_t iterations, void* cookie) /* Child sits and ping-pongs packets back to parent */ signal(SIGTERM, exit); while (read(pState->sv[0], pState->buf, pState->msize) == pState->msize) { - write(pState->sv[0], pState->buf, pState->msize); + (void) !write(pState->sv[0], pState->buf, pState->msize); } exit(0); } diff --git a/src/lat_unix_connect.c b/src/lat_unix_connect.c index 46e1876..d87221c 100644 --- a/src/lat_unix_connect.c +++ b/src/lat_unix_connect.c @@ -47,7 +47,7 @@ int main(int ac, char **av) } if (!strcmp(av[1], "-S")) { int sock = unix_connect(CONNAME); - write(sock, "0", 1); + (void) !write(sock, "0", 1); close(sock); exit(0); } @@ -92,7 +92,7 @@ void server_main(void) for (;;) { newsock = unix_accept(sock); c = 0; - read(newsock, &c, 1); + (void) !read(newsock, &c, 1); if (c && c == '0') { unix_done(sock, CONNAME); exit(0); diff --git a/src/lib_debug.c b/src/lib_debug.c index e8347dd..2be1852 100644 --- a/src/lib_debug.c +++ b/src/lib_debug.c @@ -1,3 +1,4 @@ +#include #include "bench.h" #include "lib_debug.h" diff --git a/src/lib_sched.c b/src/lib_sched.c index 035925b..257f468 100644 --- a/src/lib_sched.c +++ b/src/lib_sched.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE #include "bench.h" /* #define _DEBUG */ @@ -204,7 +205,8 @@ sched_pin(int cpu) sz = 1 + (2 * sched_ncpus()) / (8 * sizeof(unsigned long)); mask = (unsigned long*)malloc(sz * sizeof(unsigned long)); cpumask = (unsigned long*)malloc(sz * sizeof(unsigned long)); - retval = sched_getaffinity(0, sz * sizeof(unsigned long), cpumask); + retval = sched_getaffinity(0, sz * sizeof(unsigned long), + (cpu_set_t *) cpumask); if (retval < 0) perror("sched_getaffinity:"); if (retval < 0) return retval; @@ -228,7 +230,8 @@ sched_pin(int cpu) j++; } } - retval = sched_setaffinity(0, sz * sizeof(unsigned long), mask); + retval = sched_setaffinity(0, sz * sizeof(unsigned long), + (const cpu_set_t *) mask); if (retval < 0) perror("sched_setaffinity:"); #ifdef _DEBUG fprintf(stderr, "sched_pin(%d): pid=%d, returning %d\n", cpu, (int)getpid(), retval); diff --git a/src/lib_timing.c b/src/lib_timing.c index af8cf68..6ed1ea5 100644 --- a/src/lib_timing.c +++ b/src/lib_timing.c @@ -401,7 +401,7 @@ benchmp_parent( int response, } /* send 'start' signal */ - write(start_signal, signals, parallel * sizeof(char)); + (void) !write(start_signal, signals, parallel * sizeof(char)); /* Collect 'done' signals */ for (i = 0; i < parallel * sizeof(char); i += bytes_read) { @@ -446,7 +446,7 @@ benchmp_parent( int response, FD_ZERO(&fds_error); /* tell one child to report its results */ - write(result_signal, buf, sizeof(char)); + (void) !write(result_signal, buf, sizeof(char)); for (; n > 0; n -= bytes_read, buf += bytes_read) { bytes_read = 0; @@ -487,7 +487,7 @@ benchmp_parent( int response, signal(SIGCHLD, SIG_DFL); /* send 'exit' signals */ - write(exit_signal, results, parallel * sizeof(char)); + (void) !write(exit_signal, results, parallel * sizeof(char)); /* Compute median time; iterations is constant! */ set_results(merged_results); @@ -700,13 +700,13 @@ benchmp_interval(void* _state) NULL, &timeout); if (FD_ISSET(state->start_signal, &fds)) { state->state = timing_interval; - read(state->start_signal, &c, sizeof(char)); + (void) !read(state->start_signal, &c, sizeof(char)); iterations = state->iterations; } if (state->need_warmup) { state->need_warmup = 0; /* send 'ready' */ - write(state->response, &c, sizeof(char)); + (void) !write(state->response, &c, sizeof(char)); } break; case timing_interval: @@ -736,7 +736,7 @@ benchmp_interval(void* _state) state->iterations = iterations; if (state->state == cooldown) { /* send 'done' */ - write(state->response, (void*)&c, sizeof(char)); + (void) !write(state->response, (void*)&c, sizeof(char)); iterations = state->iterations_batch; } break; @@ -751,8 +751,8 @@ benchmp_interval(void* _state) * the parent to tell us to send our results back. * From this point on, we will do no more "work". */ - read(state->result_signal, (void*)&c, sizeof(char)); - write(state->response, (void*)get_results(), state->r_size); + (void) !read(state->result_signal, (void*)&c, sizeof(char)); + (void) !write(state->response, (void*)get_results(), state->r_size); if (state->cleanup) { if (benchmp_sigchld_handler == SIG_DFL) signal(SIGCHLD, SIG_DFL); @@ -760,7 +760,7 @@ benchmp_interval(void* _state) } /* Now wait for signal to exit */ - read(state->exit_signal, (void*)&c, sizeof(char)); + (void) !read(state->exit_signal, (void*)&c, sizeof(char)); exit(0); } }; diff --git a/src/lmhttp.c b/src/lmhttp.c index 00bd4b0..0b4868f 100644 --- a/src/lmhttp.c +++ b/src/lmhttp.c @@ -277,26 +277,34 @@ void dodir(char *name, int sock) { FILE *p; - char buf[1024]; + char *buf; char path[1024]; + size_t bytes; if (dflg) printf("dodir(%s)\n", name); + /* figure out a buf size and allocate with malloc */ + bytes = snprintf(buf, 0, "cd %s && ls -1a", name); + buf = (char*) malloc(bytes + 1); sprintf(buf, "cd %s && ls -1a", name); p = popen(buf, "r"); if (!p && dflg) printf("Couldn't popen %s\n", buf); + bytes = snprintf(buf, 0, "\ +\nIndex of /%s

Index of /%s

\n", + name, name); + buf = (char*) realloc(buf, bytes + 1); sprintf(buf, "\ \nIndex of /%s

Index of /%s

\n", name, name); - write(sock, buf, strlen(buf)); + (void) !write(sock, buf, strlen(buf)); while (fgets(buf, sizeof(buf), p)) { buf[strlen(buf) - 1] = 0; sprintf(path, "/%s/%s", name, buf); if (dflg) printf("\t%s\n", path); - write(sock, "", 2); - write(sock, buf, strlen(buf)); - write(sock, "
\n", 9); + (void) !write(sock, "", 2); + (void) !write(sock, buf, strlen(buf)); + (void) !write(sock, "
\n", 9); } pclose(p); } @@ -380,7 +388,7 @@ logit(int sock, char *name, int size) len = sprintf(buf, "%u %u %s %u\n", *((unsigned int*)&sin.sin_addr), (unsigned int)time(0), name, size); if (nbytes + len >= sizeof(logbuf)) { - write(logfile, logbuf, nbytes); + (void) !write(logfile, logbuf, nbytes); nbytes = 0; } bcopy(buf, &logbuf[nbytes], len); @@ -390,7 +398,7 @@ logit(int sock, char *name, int size) void die() { if (nbytes) { - write(logfile, logbuf, nbytes); + (void) !write(logfile, logbuf, nbytes); nbytes = 0; } exit(1); diff --git a/src/memsize.c b/src/memsize.c index e1d05be..1f10f03 100644 --- a/src/memsize.c +++ b/src/memsize.c @@ -137,7 +137,7 @@ test_malloc(size_t size) close(fid[0]); p = malloc(size); result = (p ? 1 : 0); - write(fid[1], &result, sizeof(int)); + (void) !write(fid[1], &result, sizeof(int)); close(fid[1]); if (p) free(p); exit(0);