mcexec: --disable-sched-yield: avoid kernel/user switch

This commit is contained in:
Balazs Gerofi
2017-03-05 14:36:56 +09:00
parent a256280118
commit e554f4e2f9
6 changed files with 89 additions and 5 deletions

13
configure vendored
View File

@ -634,6 +634,7 @@ KERNDIR
KMODDIR KMODDIR
ETCDIR ETCDIR
SBINDIR SBINDIR
LIBDIR
BINDIR BINDIR
TARGET TARGET
UNAME_R UNAME_R
@ -4039,6 +4040,9 @@ case $WITH_TARGET in
if test "X$BINDIR" = X; then if test "X$BINDIR" = X; then
BINDIR="$prefix/bin" BINDIR="$prefix/bin"
fi fi
if test "X$LIBDIR" = X; then
LIBDIR="$prefix/lib"
fi
if test "X$SBINDIR" = X; then if test "X$SBINDIR" = X; then
SBINDIR="$prefix/sbin" SBINDIR="$prefix/sbin"
fi fi
@ -4506,6 +4510,15 @@ else
$as_echo "$as_me: mcoverlayfs is disabled" >&6;} $as_echo "$as_me: mcoverlayfs is disabled" >&6;}
fi fi
if test "x$LIBDIR" != "x" ; then
cat >>confdefs.h <<_ACEOF
#define MCKERNEL_LIBDIR "$LIBDIR"
_ACEOF
fi

View File

@ -162,6 +162,9 @@ case $WITH_TARGET in
if test "X$BINDIR" = X; then if test "X$BINDIR" = X; then
BINDIR="$prefix/bin" BINDIR="$prefix/bin"
fi fi
if test "X$LIBDIR" = X; then
LIBDIR="$prefix/lib"
fi
if test "X$SBINDIR" = X; then if test "X$SBINDIR" = X; then
SBINDIR="$prefix/sbin" SBINDIR="$prefix/sbin"
fi fi
@ -295,6 +298,10 @@ else
AC_MSG_NOTICE([mcoverlayfs is disabled]) AC_MSG_NOTICE([mcoverlayfs is disabled])
fi fi
if test "x$LIBDIR" != "x" ; then
AC_DEFINE_UNQUOTED(MCKERNEL_LIBDIR,"$LIBDIR",[McKernel specific libraries])
fi
AC_SUBST(CC) AC_SUBST(CC)
AC_SUBST(XCC) AC_SUBST(XCC)
AC_SUBST(ARCH) AC_SUBST(ARCH)
@ -302,6 +309,7 @@ AC_SUBST(KDIR)
AC_SUBST(UNAME_R) AC_SUBST(UNAME_R)
AC_SUBST(TARGET) AC_SUBST(TARGET)
AC_SUBST(BINDIR) AC_SUBST(BINDIR)
AC_SUBST(LIBDIR)
AC_SUBST(SBINDIR) AC_SUBST(SBINDIR)
AC_SUBST(ETCDIR) AC_SUBST(ETCDIR)
AC_SUBST(KMODDIR) AC_SUBST(KMODDIR)

View File

@ -72,6 +72,9 @@
/* Define to address of kernel symbol zap_page_range, or 0 if exported */ /* Define to address of kernel symbol zap_page_range, or 0 if exported */
#undef MCCTRL_KSYM_zap_page_range #undef MCCTRL_KSYM_zap_page_range
/* McKernel specific libraries */
#undef MCKERNEL_LIBDIR
/* Define to the address where bug reports for this package should be sent. */ /* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT #undef PACKAGE_BUGREPORT

View File

@ -1,9 +1,10 @@
CC=@CC@ CC=@CC@
BINDIR=@BINDIR@ BINDIR=@BINDIR@
LIBDIR=@LIBDIR@
KDIR ?= @KDIR@ KDIR ?= @KDIR@
CFLAGS=-Wall -O -I. CFLAGS=-Wall -O -I.
VPATH=@abs_srcdir@ VPATH=@abs_srcdir@
TARGET=mcexec TARGET=mcexec libsched_yield
@uncomment_if_ENABLE_MEMDUMP@TARGET+=eclair @uncomment_if_ENABLE_MEMDUMP@TARGET+=eclair
LIBS=@LIBS@ LIBS=@LIBS@
IHKDIR ?= $(VPATH)/../../../ihk/linux/include/ IHKDIR ?= $(VPATH)/../../../ihk/linux/include/
@ -16,6 +17,9 @@ mcexec: mcexec.c
eclair: eclair.c eclair: eclair.c
$(CC) $(CFLAGS) -I${IHKDIR} -o $@ $^ $(LIBS) $(CC) $(CFLAGS) -I${IHKDIR} -o $@ $^ $(LIBS)
libsched_yield: libsched_yield.c
$(CC) -shared -fPIC -Wl,-soname,sched_yield.so.1 -o libsched_yield.so.1.0.0 $^ -lc -ldl
clean: clean:
$(RM) $(TARGET) *.o $(RM) $(TARGET) *.o
@ -24,5 +28,7 @@ clean:
install: install:
mkdir -p -m 755 $(BINDIR) mkdir -p -m 755 $(BINDIR)
install -m 755 mcexec $(BINDIR) install -m 755 mcexec $(BINDIR)
mkdir -p -m 755 $(LIBDIR)
install -m 755 libsched_yield.so.1.0.0 $(LIBDIR)
@uncomment_if_ENABLE_MEMDUMP@install -m 755 eclair $(BINDIR) @uncomment_if_ENABLE_MEMDUMP@install -m 755 eclair $(BINDIR)

View File

@ -0,0 +1,27 @@
#define _GNU_SOURCE
#include <dlfcn.h>
#include <sys/time.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#undef sched_yield
typedef int (*int_void_fn)(void);
static int_void_fn orig_sched_yield = 0;
int sched_yield(void)
{
#if 0
if (!orig_sched_yield) {
orig_sched_yield = (int_void_fn)dlsym(RTLD_NEXT, "sched_yield");
}
printf("sched_yield() called\n");
#endif
return 0;
}

View File

@ -152,6 +152,7 @@ static int fd;
static char *exec_path = NULL; static char *exec_path = NULL;
static char *altroot; static char *altroot;
static const char rlimit_stack_envname[] = "MCKERNEL_RLIMIT_STACK"; static const char rlimit_stack_envname[] = "MCKERNEL_RLIMIT_STACK";
static const char ld_preload_envname[] = "MCKERNEL_LD_PRELOAD";
static int ischild; static int ischild;
static int enable_vdso = 1; static int enable_vdso = 1;
static int mpol_no_heap = 0; static int mpol_no_heap = 0;
@ -160,6 +161,7 @@ static int mpol_no_bss = 0;
static int no_bind_ikc_map = 0; static int no_bind_ikc_map = 0;
static unsigned long mpol_threshold = 0; static unsigned long mpol_threshold = 0;
static int profile = 0; static int profile = 0;
static int disable_sched_yield = 0;
/* Partitioned execution (e.g., for MPI) */ /* Partitioned execution (e.g., for MPI) */
static int nr_processes = 0; static int nr_processes = 0;
@ -1321,6 +1323,12 @@ static struct option mcexec_options[] = {
.flag = NULL, .flag = NULL,
.val = 'm', .val = 'm',
}, },
{
.name = "disable-sched-yield",
.has_arg = no_argument,
.flag = &disable_sched_yield,
.val = 1,
},
/* end */ /* end */
{ NULL, 0, NULL, 0, }, { NULL, 0, NULL, 0, },
}; };
@ -1361,10 +1369,6 @@ int main(int argc, char **argv)
altroot = "/usr/linux-k1om-4.7/linux-k1om"; altroot = "/usr/linux-k1om-4.7/linux-k1om";
} }
/* Collect environment variables */
envs_len = flatten_strings(-1, NULL, environ, &envs);
envs = envs;
rlim_stack.rlim_cur = MCEXEC_DEF_CUR_STACK_SIZE; rlim_stack.rlim_cur = MCEXEC_DEF_CUR_STACK_SIZE;
rlim_stack.rlim_max = MCEXEC_DEF_MAX_STACK_SIZE; rlim_stack.rlim_max = MCEXEC_DEF_MAX_STACK_SIZE;
@ -1436,6 +1440,29 @@ int main(int argc, char **argv)
return 1; return 1;
} }
if (disable_sched_yield) {
char sched_yield_lib_path[PATH_MAX];
sprintf(sched_yield_lib_path, "%s/libsched_yield.so.1.0.0",
MCKERNEL_LIBDIR);
__dprintf("%s: %s\n", __FUNCTION__, sched_yield_lib_path);
if (setenv("LD_PRELOAD", sched_yield_lib_path, 1) < 0) {
printf("%s: warning: failed to set LD_PRELOAD for sched_yield\n",
__FUNCTION__);
}
}
/* Set LD_PRELOAD to McKernel specific value */
else if (getenv(ld_preload_envname)) {
if (setenv("LD_PRELOAD", getenv(ld_preload_envname), 1) < 0) {
printf("%s: warning: failed to set LD_PRELOAD environment variable\n",
__FUNCTION__);
}
unsetenv(ld_preload_envname);
}
/* Collect environment variables */
envs_len = flatten_strings(-1, NULL, environ, &envs);
envs = envs;
#ifdef ENABLE_MCOVERLAYFS #ifdef ENABLE_MCOVERLAYFS
__dprintf("mcoverlay enable\n"); __dprintf("mcoverlay enable\n");
char mcos_procdir[PATH_MAX]; char mcos_procdir[PATH_MAX];