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

Reply via email to