On Wed, 13 Apr 2016 15:37:00 -0500 Clark Williams <[email protected]> wrote:
> John, > > I ran into issues with parsing cpu masks when trying to run this command: > > sudo ./cyclictest -i100 -qmu -h 2000 -p95 -t1 -a3 > > I had previously booted a 4-core system with these boot options: > > isolcpus=3 nohz_full=3 rcu_nocbs=3 > > The intent was to run loads on cpus 0-2 while running cyclictest on the > isolated cpu 3. > > Unfortunately, the libnuma function numa_parse_cpumask() (which we use when > it's available) seems to check the current affinity mask and fails the parse > if any of the cpus in the input string are not in the current affinity mask. > I find this "unhelpful" when trying to place a measurement thread on an > isolated cpu. > > This patch removes the wrapper function which uses libnuma cpumask parsing > functions and instead uses the parser function we wrote for when libnuma is > not available. There's an alternative solution that I was working on some time ago, which is having a simple configure script. This is usually done by simple projects that don't need a full blown autoconf machinery. The patch below adds such a script. It detects librt, libpthread and libnuma. It solves the problem you mention and it removes hardcoded lib details from the Makefile. If there's interest for this solution I can finish it and post for inclusion. >From 4228140e9dbb7fbb1bb495663ae3d896fc447f8f Mon Sep 17 00:00:00 2001 From: Luiz Capitulino <[email protected]> Date: Tue, 23 Feb 2016 15:53:43 -0500 Subject: [PATCH] add configure script Signed-off-by: Luiz Capitulino <[email protected]> --- .gitignore | 1 + Makefile | 22 ++---------- configure | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 19 deletions(-) create mode 100755 configure diff --git a/.gitignore b/.gitignore index ceee8bf..5b3e4cc 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ SRPMS rt-tests.spec tags TAGS +config.mk diff --git a/Makefile b/Makefile index 280fd3b..dad0175 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +include config.mk + VERSION = 0.97 CC?=$(CROSS_COMPILE)gcc AR?=$(CROSS_COMPILE)ar @@ -17,7 +19,6 @@ sources = cyclictest.c \ svsematest.c TARGETS = $(sources:.c=) -LIBS = -lrt -lpthread RTTESTLIB = -lrttest -L$(OBJDIR) EXTRA_LIBS ?= -ldl # for get_cpu DESTDIR ?= @@ -48,26 +49,9 @@ ostype := $(lastword $(subst -, ,$(dumpmachine))) machinetype := $(shell echo $(dumpmachine)| \ sed -e 's/-.*//' -e 's/i.86/i386/' -e 's/mips.*/mips/' -e 's/ppc.*/powerpc/') -# The default is to assume you have libnuma installed, which is fine to do -# even on non-numa machines. If you don't want to install the numa libs, for -# example, they might not be available in an embedded environment, then -# compile with -# make NUMA=0 -ifneq ($(filter x86_64 i386 ia64 mips powerpc,$(machinetype)),) -NUMA := 1 -endif - -# The default is to assume that you only have numa_parse_cpustring -# If you are sure you have a version of libnuma with numa_parse_cpustring_all -# then compile with -# make HAVE_PARSE_CPUSTRING_ALL=1 -ifeq ($(NUMA),1) - CFLAGS += -DNUMA - NUMA_LIBS = -lnuma ifdef HAVE_PARSE_CPUSTRING_ALL CFLAGS += -DHAVE_PARSE_CPUSTRING_ALL endif -endif include src/arch/android/Makefile @@ -100,7 +84,7 @@ $(OBJDIR): -include $(addprefix $(OBJDIR)/,$(sources:.c=.d)) cyclictest: $(OBJDIR)/cyclictest.o $(OBJDIR)/librttest.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) $(NUMA_LIBS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) signaltest: $(OBJDIR)/signaltest.o $(OBJDIR)/librttest.a $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS) $(RTTESTLIB) diff --git a/configure b/configure new file mode 100755 index 0000000..1d17ef9 --- /dev/null +++ b/configure @@ -0,0 +1,116 @@ +#!/bin/sh + +build_config=config.mk +temp_dir=$(mktemp -d) +temp_file=$temp_dir/file.c + +LIBS= +NUMA_LIBS= +EXTRA_CFLAGS= +has_numa=n +has_numa_cpustring_all=n + +build_test() +{ + local libs=$* + local ret= + + cd $temp_dir + cc -o prog $temp_file $libs 2> /dev/null + ret=$? + cd - > /dev/null + return $ret +} + +# +# -lpthread +# +pthread_lib=-lpthread + +cat > $temp_file << EOF +#include <pthread.h> +static void *func(void *p) { return NULL; } +int main(void) { + pthread_t thread; + pthread_create(&thread, 0, func, 0); + return 0; +} +EOF + +if ! build_test $pthread_lib; then + echo ERROR: missing pthread library + exit 1 +else + LIBS="$LIBS $pthread_lib" +fi + +# +# -lrt +# +rt_lib=-lrt + +cat > $temp_file << EOF +#include <sys/mman.h> +#include <sys/stat.h> +#include <fcntl.h> +int main(void) { + shm_open("", 0, 0); + return 0; +} +EOF + +if ! build_test $rt_lib; then + echo ERROR: missing rt library + exit 1 +else + LIBS="$LIBS $rt_lib" +fi + +# +# -lnuma +# +numa_lib=-lnuma + +cat > $temp_file << EOF +#include <numa.h> +int main(void) { + numa_available(); + return 0; +} +EOF + +if build_test $numa_lib; then + LIBS="$LIBS $numa_lib" + EXTRA_CFLAGS="$EXTRA_CFLAGS -DNUMA" + has_numa=y +fi + +# +# numa_parse_cpustring_all +# +if [ $has_numa = "y" ]; then + + cat > $temp_file << EOF +#include <numa.h> +int main(void) { + numa_parse_cpustring_all(""); + return 0; +} +EOF + + if build_test $numa_lib; then + has_numa_cpustring_all=y; + fi +fi + +# +# Write $build_config +# +echo "LIBS = $LIBS" > $build_config +echo "EXTRA_CFLAGS = $EXTRA_CFLAGS" >> $build_config + +if [ "$has_numa_cpustring_all" = "y" ]; then + echo "HAVE_PARSE_CPUSTRING_ALL := 1" >> $build_config +fi + +rm -rf $temp_dir -- 2.5.5

