Merge tag 'char-misc-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char / misc driver patches from Greg KH: "Here's the big driver misc / char pull request for 3.17-rc1. Lots of things in here, the thunderbolt support for Apple laptops, some other new drivers, testing fixes, and other good things. All have been in linux-next for a long time" * tag 'char-misc-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (119 commits) misc: bh1780: Introduce the use of devm_kzalloc Lattice ECP3 FPGA: Correct endianness drivers/misc/ti-st: Load firmware from ti-connectivity directory. dt-bindings: extcon: Add support for SM5502 MUIC device extcon: sm5502: Change internal hardware switch according to cable type extcon: sm5502: Detect cable state after completing platform booting extcon: sm5502: Add support new SM5502 extcon device driver extcon: arizona: Get MICVDD against extcon device extcon: Remove unnecessary OOM messages misc: vexpress: Fix sparse non static symbol warnings mei: drop unused hw dependent fw status functions misc: bh1770glc: Use managed functions pcmcia: remove DEFINE_PCI_DEVICE_TABLE usage misc: remove DEFINE_PCI_DEVICE_TABLE usage ipack: Replace DEFINE_PCI_DEVICE_TABLE macro use drivers/char/dsp56k.c: drop check for negativity of unsigned parameter mei: fix return value on disconnect timeout mei: don't schedule suspend in pm idle mei: start disconnect request timer consistently mei: reset client connection state on timeout ...
This commit is contained in:
@@ -12,6 +12,9 @@ TARGETS += powerpc
|
||||
TARGETS += user
|
||||
TARGETS += sysctl
|
||||
|
||||
TARGETS_HOTPLUG = cpu-hotplug
|
||||
TARGETS_HOTPLUG += memory-hotplug
|
||||
|
||||
all:
|
||||
for TARGET in $(TARGETS); do \
|
||||
make -C $$TARGET; \
|
||||
@@ -22,6 +25,21 @@ run_tests: all
|
||||
make -C $$TARGET run_tests; \
|
||||
done;
|
||||
|
||||
hotplug:
|
||||
for TARGET in $(TARGETS_HOTPLUG); do \
|
||||
make -C $$TARGET; \
|
||||
done;
|
||||
|
||||
run_hotplug: hotplug
|
||||
for TARGET in $(TARGETS_HOTPLUG); do \
|
||||
make -C $$TARGET run_full_test; \
|
||||
done;
|
||||
|
||||
clean_hotplug:
|
||||
for TARGET in $(TARGETS_HOTPLUG); do \
|
||||
make -C $$TARGET clean; \
|
||||
done;
|
||||
|
||||
clean:
|
||||
for TARGET in $(TARGETS); do \
|
||||
make -C $$TARGET clean; \
|
||||
|
@@ -4,8 +4,15 @@ The kernel contains a set of "self tests" under the tools/testing/selftests/
|
||||
directory. These are intended to be small unit tests to exercise individual
|
||||
code paths in the kernel.
|
||||
|
||||
Running the selftests
|
||||
=====================
|
||||
On some systems, hot-plug tests could hang forever waiting for cpu and
|
||||
memory to be ready to be offlined. A special hot-plug target is created
|
||||
to run full range of hot-plug tests. In default mode, hot-plug tests run
|
||||
in safe mode with a limited scope. In limited mode, cpu-hotplug test is
|
||||
run on a single cpu as opposed to all hotplug capable cpus, and memory
|
||||
hotplug test is run on 2% of hotplug capable memory instead of 10%.
|
||||
|
||||
Running the selftests (hotplug tests are run in limited mode)
|
||||
=============================================================
|
||||
|
||||
To build the tests:
|
||||
|
||||
@@ -18,14 +25,26 @@ To run the tests:
|
||||
|
||||
- note that some tests will require root privileges.
|
||||
|
||||
|
||||
To run only tests targetted for a single subsystem:
|
||||
To run only tests targeted for a single subsystem: (including
|
||||
hotplug targets in limited mode)
|
||||
|
||||
$ make -C tools/testing/selftests TARGETS=cpu-hotplug run_tests
|
||||
|
||||
See the top-level tools/testing/selftests/Makefile for the list of all possible
|
||||
targets.
|
||||
|
||||
Running the full range hotplug selftests
|
||||
========================================
|
||||
|
||||
To build the tests:
|
||||
|
||||
$ make -C tools/testing/selftests hotplug
|
||||
|
||||
To run the tests:
|
||||
|
||||
$ make -C tools/testing/selftests run_hotplug
|
||||
|
||||
- note that some tests will require root privileges.
|
||||
|
||||
Contributing new tests
|
||||
======================
|
||||
|
@@ -3,4 +3,7 @@ all:
|
||||
run_tests:
|
||||
@/bin/bash ./on-off-test.sh || echo "cpu-hotplug selftests: [FAIL]"
|
||||
|
||||
run_full_test:
|
||||
@/bin/bash ./on-off-test.sh -a || echo "cpu-hotplug selftests: [FAIL]"
|
||||
|
||||
clean:
|
||||
|
@@ -11,6 +11,8 @@ prerequisite()
|
||||
exit 0
|
||||
fi
|
||||
|
||||
taskset -p 01 $$
|
||||
|
||||
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
|
||||
|
||||
if [ ! -d "$SYSFS" ]; then
|
||||
@@ -22,6 +24,19 @@ prerequisite()
|
||||
echo $msg cpu hotplug is not supported >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "CPU online/offline summary:"
|
||||
online_cpus=`cat $SYSFS/devices/system/cpu/online`
|
||||
online_max=${online_cpus##*-}
|
||||
echo -e "\t Cpus in online state: $online_cpus"
|
||||
|
||||
offline_cpus=`cat $SYSFS/devices/system/cpu/offline`
|
||||
if [[ "a$offline_cpus" = "a" ]]; then
|
||||
offline_cpus=0
|
||||
else
|
||||
offline_max=${offline_cpus##*-}
|
||||
fi
|
||||
echo -e "\t Cpus in offline state: $offline_cpus"
|
||||
}
|
||||
|
||||
#
|
||||
@@ -113,15 +128,25 @@ offline_cpu_expect_fail()
|
||||
}
|
||||
|
||||
error=-12
|
||||
allcpus=0
|
||||
priority=0
|
||||
online_cpus=0
|
||||
online_max=0
|
||||
offline_cpus=0
|
||||
offline_max=0
|
||||
|
||||
while getopts e:hp: opt; do
|
||||
while getopts e:ahp: opt; do
|
||||
case $opt in
|
||||
e)
|
||||
error=$OPTARG
|
||||
;;
|
||||
a)
|
||||
allcpus=1
|
||||
;;
|
||||
h)
|
||||
echo "Usage $0 [ -e errno ] [ -p notifier-priority ]"
|
||||
echo "Usage $0 [ -a ] [ -e errno ] [ -p notifier-priority ]"
|
||||
echo -e "\t default offline one cpu"
|
||||
echo -e "\t run with -a option to offline all cpus"
|
||||
exit
|
||||
;;
|
||||
p)
|
||||
@@ -137,6 +162,29 @@ fi
|
||||
|
||||
prerequisite
|
||||
|
||||
#
|
||||
# Safe test (default) - offline and online one cpu
|
||||
#
|
||||
if [ $allcpus -eq 0 ]; then
|
||||
echo "Limited scope test: one hotplug cpu"
|
||||
echo -e "\t (leaves cpu in the original state):"
|
||||
echo -e "\t online to offline to online: cpu $online_max"
|
||||
offline_cpu_expect_success $online_max
|
||||
online_cpu_expect_success $online_max
|
||||
|
||||
if [[ $offline_cpus -gt 0 ]]; then
|
||||
echo -e "\t offline to online to offline: cpu $offline_max"
|
||||
online_cpu_expect_success $offline_max
|
||||
offline_cpu_expect_success $offline_max
|
||||
fi
|
||||
exit 0
|
||||
else
|
||||
echo "Full scope test: all hotplug cpus"
|
||||
echo -e "\t online all offline cpus"
|
||||
echo -e "\t offline all online cpus"
|
||||
echo -e "\t online all offline cpus"
|
||||
fi
|
||||
|
||||
#
|
||||
# Online all hot-pluggable CPUs
|
||||
#
|
||||
|
@@ -81,7 +81,7 @@ int main(int argc, char **argv)
|
||||
/* Compare with self */
|
||||
ret = sys_kcmp(pid1, pid1, KCMP_VM, 0, 0);
|
||||
if (ret) {
|
||||
printf("FAIL: 0 expected but %li returned (%s)\n",
|
||||
printf("FAIL: 0 expected but %d returned (%s)\n",
|
||||
ret, strerror(errno));
|
||||
ret = -1;
|
||||
} else
|
||||
|
@@ -1,6 +1,9 @@
|
||||
all:
|
||||
|
||||
run_tests:
|
||||
@/bin/bash ./on-off-test.sh -r 2 || echo "memory-hotplug selftests: [FAIL]"
|
||||
|
||||
run_full_test:
|
||||
@/bin/bash ./on-off-test.sh || echo "memory-hotplug selftests: [FAIL]"
|
||||
|
||||
clean:
|
||||
|
@@ -142,10 +142,16 @@ fi
|
||||
|
||||
prerequisite
|
||||
|
||||
echo "Test scope: $ratio% hotplug memory"
|
||||
echo -e "\t online all hotplug memory in offline state"
|
||||
echo -e "\t offline $ratio% hotplug memory in online state"
|
||||
echo -e "\t online all hotplug memory in offline state"
|
||||
|
||||
#
|
||||
# Online all hot-pluggable memory
|
||||
#
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
echo offline-online $memory
|
||||
online_memory_expect_success $memory
|
||||
done
|
||||
|
||||
@@ -154,6 +160,7 @@ done
|
||||
#
|
||||
for memory in `hotpluggable_online_memory`; do
|
||||
if [ $((RANDOM % 100)) -lt $ratio ]; then
|
||||
echo online-offline $memory
|
||||
offline_memory_expect_success $memory
|
||||
fi
|
||||
done
|
||||
@@ -162,6 +169,7 @@ done
|
||||
# Online all hot-pluggable memory again
|
||||
#
|
||||
for memory in `hotplaggable_offline_memory`; do
|
||||
echo offline-online $memory
|
||||
online_memory_expect_success $memory
|
||||
done
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
all:
|
||||
gcc -O2 -lrt mq_open_tests.c -o mq_open_tests
|
||||
gcc -O2 -lrt -lpthread -lpopt -o mq_perf_tests mq_perf_tests.c
|
||||
gcc -O2 mq_open_tests.c -o mq_open_tests -lrt
|
||||
gcc -O2 -o mq_perf_tests mq_perf_tests.c -lrt -lpthread -lpopt
|
||||
|
||||
run_tests:
|
||||
@./mq_open_tests /test1 || echo "mq_open_tests: [FAIL]"
|
||||
|
@@ -80,7 +80,8 @@ void shutdown(int exit_val, char *err_cause, int line_no)
|
||||
if (in_shutdown++)
|
||||
return;
|
||||
|
||||
seteuid(0);
|
||||
if (seteuid(0) == -1)
|
||||
perror("seteuid() failed");
|
||||
|
||||
if (queue != -1)
|
||||
if (mq_close(queue))
|
||||
@@ -292,8 +293,10 @@ int main(int argc, char *argv[])
|
||||
/* Tell the user our initial state */
|
||||
printf("\nInitial system state:\n");
|
||||
printf("\tUsing queue path:\t\t%s\n", queue_path);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", saved_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", saved_limits.rlim_max);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t%ld\n",
|
||||
(long) saved_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t%ld\n",
|
||||
(long) saved_limits.rlim_max);
|
||||
printf("\tMaximum Message Size:\t\t%d\n", saved_max_msgsize);
|
||||
printf("\tMaximum Queue Size:\t\t%d\n", saved_max_msgs);
|
||||
if (default_settings) {
|
||||
@@ -308,8 +311,8 @@ int main(int argc, char *argv[])
|
||||
validate_current_settings();
|
||||
|
||||
printf("Adjusted system state for testing:\n");
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", cur_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", cur_limits.rlim_max);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t%ld\n", (long) cur_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t%ld\n", (long) cur_limits.rlim_max);
|
||||
printf("\tMaximum Message Size:\t\t%d\n", cur_max_msgsize);
|
||||
printf("\tMaximum Queue Size:\t\t%d\n", cur_max_msgs);
|
||||
if (default_settings) {
|
||||
@@ -454,7 +457,12 @@ int main(int argc, char *argv[])
|
||||
else
|
||||
printf("Queue open with total size > 2GB when euid = 0 "
|
||||
"failed:\t\t\tPASS\n");
|
||||
seteuid(99);
|
||||
|
||||
if (seteuid(99) == -1) {
|
||||
perror("seteuid() failed");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
attr.mq_maxmsg = cur_max_msgs;
|
||||
attr.mq_msgsize = cur_max_msgsize;
|
||||
if (test_queue_fail(&attr, &result))
|
||||
|
@@ -296,9 +296,9 @@ static inline void open_queue(struct mq_attr *attr)
|
||||
printf("\n\tQueue %s created:\n", queue_path);
|
||||
printf("\t\tmq_flags:\t\t\t%s\n", result.mq_flags & O_NONBLOCK ?
|
||||
"O_NONBLOCK" : "(null)");
|
||||
printf("\t\tmq_maxmsg:\t\t\t%d\n", result.mq_maxmsg);
|
||||
printf("\t\tmq_msgsize:\t\t\t%d\n", result.mq_msgsize);
|
||||
printf("\t\tmq_curmsgs:\t\t\t%d\n", result.mq_curmsgs);
|
||||
printf("\t\tmq_maxmsg:\t\t\t%lu\n", result.mq_maxmsg);
|
||||
printf("\t\tmq_msgsize:\t\t\t%lu\n", result.mq_msgsize);
|
||||
printf("\t\tmq_curmsgs:\t\t\t%lu\n", result.mq_curmsgs);
|
||||
}
|
||||
|
||||
void *fake_cont_thread(void *arg)
|
||||
@@ -440,7 +440,7 @@ void *perf_test_thread(void *arg)
|
||||
shutdown(2, "clock_getres()", __LINE__);
|
||||
|
||||
printf("\t\tMax priorities:\t\t\t%d\n", mq_prio_max);
|
||||
printf("\t\tClock resolution:\t\t%d nsec%s\n", res.tv_nsec,
|
||||
printf("\t\tClock resolution:\t\t%lu nsec%s\n", res.tv_nsec,
|
||||
res.tv_nsec > 1 ? "s" : "");
|
||||
|
||||
|
||||
@@ -454,20 +454,20 @@ void *perf_test_thread(void *arg)
|
||||
recv_total.tv_nsec = 0;
|
||||
for (i = 0; i < TEST1_LOOPS; i++)
|
||||
do_send_recv();
|
||||
printf("\t\tSend msg:\t\t\t%d.%ds total time\n",
|
||||
printf("\t\tSend msg:\t\t\t%ld.%lus total time\n",
|
||||
send_total.tv_sec, send_total.tv_nsec);
|
||||
nsec = ((unsigned long long)send_total.tv_sec * 1000000000 +
|
||||
send_total.tv_nsec) / TEST1_LOOPS;
|
||||
printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
|
||||
printf("\t\tRecv msg:\t\t\t%d.%ds total time\n",
|
||||
printf("\t\t\t\t\t\t%lld nsec/msg\n", nsec);
|
||||
printf("\t\tRecv msg:\t\t\t%ld.%lus total time\n",
|
||||
recv_total.tv_sec, recv_total.tv_nsec);
|
||||
nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 +
|
||||
recv_total.tv_nsec) / TEST1_LOOPS;
|
||||
printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
|
||||
printf("\t\t\t\t\t\t%lld nsec/msg\n", nsec);
|
||||
|
||||
|
||||
for (cur_test = test2; cur_test->desc != NULL; cur_test++) {
|
||||
printf(cur_test->desc);
|
||||
printf("%s:\n", cur_test->desc);
|
||||
printf("\t\t(%d iterations)\n", TEST2_LOOPS);
|
||||
prio_out = 0;
|
||||
send_total.tv_sec = 0;
|
||||
@@ -493,16 +493,16 @@ void *perf_test_thread(void *arg)
|
||||
cur_test->func(&prio_out);
|
||||
}
|
||||
printf("done.\n");
|
||||
printf("\t\tSend msg:\t\t\t%d.%ds total time\n",
|
||||
printf("\t\tSend msg:\t\t\t%ld.%lus total time\n",
|
||||
send_total.tv_sec, send_total.tv_nsec);
|
||||
nsec = ((unsigned long long)send_total.tv_sec * 1000000000 +
|
||||
send_total.tv_nsec) / TEST2_LOOPS;
|
||||
printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
|
||||
printf("\t\tRecv msg:\t\t\t%d.%ds total time\n",
|
||||
printf("\t\t\t\t\t\t%lld nsec/msg\n", nsec);
|
||||
printf("\t\tRecv msg:\t\t\t%ld.%lus total time\n",
|
||||
recv_total.tv_sec, recv_total.tv_nsec);
|
||||
nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 +
|
||||
recv_total.tv_nsec) / TEST2_LOOPS;
|
||||
printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
|
||||
printf("\t\t\t\t\t\t%lld nsec/msg\n", nsec);
|
||||
printf("\t\tDraining queue...");
|
||||
fflush(stdout);
|
||||
clock_gettime(clock, &start);
|
||||
@@ -653,8 +653,10 @@ int main(int argc, char *argv[])
|
||||
/* Tell the user our initial state */
|
||||
printf("\nInitial system state:\n");
|
||||
printf("\tUsing queue path:\t\t\t%s\n", queue_path);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n", saved_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n", saved_limits.rlim_max);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%ld\n",
|
||||
(long) saved_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%ld\n",
|
||||
(long) saved_limits.rlim_max);
|
||||
printf("\tMaximum Message Size:\t\t\t%d\n", saved_max_msgsize);
|
||||
printf("\tMaximum Queue Size:\t\t\t%d\n", saved_max_msgs);
|
||||
printf("\tNice value:\t\t\t\t%d\n", cur_nice);
|
||||
@@ -667,10 +669,10 @@ int main(int argc, char *argv[])
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t(unlimited)\n");
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t(unlimited)\n");
|
||||
} else {
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n",
|
||||
cur_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n",
|
||||
cur_limits.rlim_max);
|
||||
printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%ld\n",
|
||||
(long) cur_limits.rlim_cur);
|
||||
printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%ld\n",
|
||||
(long) cur_limits.rlim_max);
|
||||
}
|
||||
printf("\tMaximum Message Size:\t\t\t%d\n", cur_max_msgsize);
|
||||
printf("\tMaximum Queue Size:\t\t\t%d\n", cur_max_msgs);
|
||||
|
Reference in New Issue
Block a user