summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/rcutorture
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-08-24 00:23:23 +0200
committerPaul E. McKenney <paulmck@linux.ibm.com>2018-11-09 06:52:55 +0100
commit229ab0cb5be3bfbac5947df7240f6905470ca413 (patch)
tree91259ffddc8bf0d53ffac04e0685406849f75541 /tools/testing/selftests/rcutorture
parentrcutorture: Add initrd support for systems lacking dracut (diff)
downloadlinux-229ab0cb5be3bfbac5947df7240f6905470ca413.tar.xz
linux-229ab0cb5be3bfbac5947df7240f6905470ca413.zip
rcutorture: Make initrd/init execute in userspace
Currently, the initrd/init script and executable remain blocked almost all the time. However, it is necessary to test nohz_full userspace execution, which both variants of initrd/init fail to do. This commit therefore causes initrd/init to spend about a millisecond per second executing in userspace. Reported-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'tools/testing/selftests/rcutorture')
-rwxr-xr-xtools/testing/selftests/rcutorture/bin/mkinitrd.sh43
1 files changed, 39 insertions, 4 deletions
diff --git a/tools/testing/selftests/rcutorture/bin/mkinitrd.sh b/tools/testing/selftests/rcutorture/bin/mkinitrd.sh
index 87a87ffeaa85..b48c504edfe1 100755
--- a/tools/testing/selftests/rcutorture/bin/mkinitrd.sh
+++ b/tools/testing/selftests/rcutorture/bin/mkinitrd.sh
@@ -39,9 +39,22 @@ mkdir $T
cat > $T/init << '__EOF___'
#!/bin/sh
+# Run in userspace a few milliseconds every second. This helps to
+# exercise the NO_HZ_FULL portions of RCU.
while :
do
- sleep 1000000
+ q=
+ for i in \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a \
+ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
+ do
+ q="$q $i"
+ done
+ sleep 1
done
__EOF___
@@ -70,15 +83,37 @@ mkdir initrd
cd initrd
cat > init.c << '___EOF___'
#include <unistd.h>
+#include <sys/time.h>
+
+volatile unsigned long delaycount;
int main(int argc, int argv[])
{
- for (;;)
- sleep(1000*1000*1000); /* One gigasecond is ~30 years. */
+ int i;
+ struct timeval tv;
+ struct timeval tvb;
+
+ for (;;) {
+ sleep(1);
+ /* Need some userspace time. */
+ if (gettimeofday(&tvb, NULL))
+ continue;
+ do {
+ for (i = 0; i < 1000 * 100; i++)
+ delaycount = i * i;
+ if (gettimeofday(&tv, NULL))
+ break;
+ tv.tv_sec -= tvb.tv_sec;
+ if (tv.tv_sec > 1)
+ break;
+ tv.tv_usec += tv.tv_sec * 1000 * 1000;
+ tv.tv_usec -= tvb.tv_usec;
+ } while (tv.tv_usec < 1000);
+ }
return 0;
}
___EOF___
-gcc -static -Os -o init init.c
+cc -static -Os -o init init.c
strip init
rm init.c
echo "Done creating a statically linked C-language initrd"