| #!/bin/sh |
| |
|
|
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
|
|
| . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
| print_ver_ nproc |
| require_root_ |
| require_gcc_shared_ |
|
|
| |
| cat > k.c <<'EOF' || framework_failure_ |
| |
| |
| |
| |
|
|
| int |
| sched_getscheduler (pid_t pid) |
| { |
| fclose (fopen ("preloaded","w")); /* marker for preloaded interception */ |
| FILE* policyf = fopen ("/proc/self/sched", "r"); |
| int policy; |
| |
| if (pid == 0 && fscanfmt (policyf, "policy : %d", &policy) == 1) |
| { |
| switch (policy) |
| { |
| case 0: return SCHED_OTHER; |
| case 1: return SCHED_FIFO; |
| case 2: return SCHED_RR; |
| case 6: return SCHED_DEADLINE; |
| case -1: errno = EINVAL; return -1; |
| default: return SCHED_OTHER; |
| } |
| } |
| else |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| } |
| EOF |
|
|
| |
| gcc_shared_ k.c k.so \ |
| || skip_ 'failed to build sched_getscheduler shared library' |
|
|
| (export LD_PRELOAD=$LD_PRELOAD:./k.so |
| nproc) || fail=1 |
|
|
| |
| |
| |
| test -e preloaded || skip_ 'LD_PRELOAD interception failed' |
|
|
| |
| |
| |
| |
| |
|
|
| ROOT=cgroup |
| { |
| mkdir -p $ROOT/proc/self && |
| mkdir -p $ROOT/sys/fs/cgroup/foo && |
| touch $ROOT/sys/fs/cgroup/cgroup.controllers && |
| echo '0::/foo' > $ROOT/proc/self/cgroup && |
| echo 'policy : 0' > $ROOT/proc/self/sched && |
| echo 'max 100000' > $ROOT/sys/fs/cgroup/foo/cpu.max |
| } || framework_failure_ |
|
|
| nproc=$abs_top_builddir/src/nproc$EXEEXT |
| cp --parents $(ldd $nproc | grep -o '/[^ ]*') $ROOT || |
| skip_ 'Failed to copy nproc libs to chroot' |
| cp $nproc $ROOT || framework_failure_ |
| cp k.so $ROOT || framework_failure_ |
|
|
| NPROC() { LD_PRELOAD=$LD_PRELOAD:./k.so chroot $ROOT /nproc "$@"; } |
| NPROC --version || |
| skip_ 'Failed to execute nproc in chroot' |
|
|
| unset OMP_NUM_THREADS |
| unset OMP_THREAD_LIMIT |
|
|
| ncpus=$(nproc) || fail=1 |
|
|
| |
| |
| |
| if test "$ncpus" = "$(nproc --all)"; then |
| echo 'max 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq $ncpus || fail=1 |
| |
| |
| echo "1000000 1" > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq $ncpus || fail=1 |
| |
| echo '100000 0' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq $ncpus || fail=1 |
| echo '100000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(OMP_NUM_THREADS=$ncpus NPROC) -eq $ncpus || fail=1 |
|
|
| echo '100000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| echo 'policy : 1' > $ROOT/proc/self/sched && |
| test $(NPROC) -eq $ncpus || fail=1 |
| echo 'policy : 2' > $ROOT/proc/self/sched && |
| test $(NPROC) -eq $ncpus || fail=1 |
| echo 'policy : 6' > $ROOT/proc/self/sched && |
| test $(NPROC) -eq $ncpus || fail=1 |
| echo 'policy : -1' > $ROOT/proc/self/sched && |
| test $(NPROC) -eq $ncpus || fail=1 |
| echo 'policy : 0' > $ROOT/proc/self/sched |
| fi |
|
|
| echo '40000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 1 || fail=1 |
| echo '50000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 1 || fail=1 |
| echo '100000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 1 || fail=1 |
| echo '140000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 1 || fail=1 |
| echo '1 1000000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 1 || fail=1 |
|
|
| if test $ncpus -gt 1; then |
| echo '150000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(NPROC) -eq 2 || fail=1 |
| echo '150000 100000' > $ROOT/sys/fs/cgroup/cpu.max && |
| test $(OMP_THREAD_LIMIT=10 NPROC) -eq 2 || fail=1 |
| fi |
|
|
| Exit $fail |
|
|