summaryrefslogtreecommitdiff
path: root/schulung_tools/rtex
diff options
context:
space:
mode:
Diffstat (limited to 'schulung_tools/rtex')
-rw-r--r--schulung_tools/rtex/Makefile7
-rw-r--r--schulung_tools/rtex/README.txt46
-rw-r--r--schulung_tools/rtex/func.c69
-rw-r--r--schulung_tools/rtex/main.c60
-rw-r--r--schulung_tools/rtex/rt.c72
5 files changed, 0 insertions, 254 deletions
diff --git a/schulung_tools/rtex/Makefile b/schulung_tools/rtex/Makefile
deleted file mode 100644
index 330bc01..0000000
--- a/schulung_tools/rtex/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-rtex: main.c func.c rt.c
- gcc -O0 $+ -o$@
-
-clean:
- rm -f rtex
-
-.PHONY: clean
diff --git a/schulung_tools/rtex/README.txt b/schulung_tools/rtex/README.txt
deleted file mode 100644
index ce33bcf..0000000
--- a/schulung_tools/rtex/README.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-The rtex program demonstrates the importance of using several tricks to
-avoid page faults and memory allocation during critical runtime. It displays
-the amount of time taken and generated page faults when performing various
-tasks. This clearly shows the expense due to page faults.
-
-Running the program without any (or invalid) arguments shows the usage
-help. The program argument specifies which rt tweak should be performed
-and if the runtime tests should be performed.
-
-The tests can be performed on any Linux system (embedded, desktop, server,
-with or without PREEMPT_RT). The results will be the same.
-
-The following is a summary of the most important results:
-
-running the test without any rt tweaks
- - main setup very fast
- - first big malloc+access very expensive
- - second big malloc+access very expensive
- - first big stack very expensive
-$ sudo ./rtex 0x10
-options: 0x10
- 5715 ns 0 faults : main setup
- 17466150 ns 2561 faults : testfunc_malloc (0)
- 14963662 ns 2560 faults : testfunc_malloc (1)
- 2517772 ns 0 faults : testfunc_malloc (2)
- 2577208 ns 0 faults : testfunc_malloc (3)
- 6113558 ns 1847 faults : testfunc_deepstack (0)
- 390386 ns 0 faults : testfunc_deepstack (1)
- 321146 ns 0 faults : testfunc_deepstack (2)
- 317585 ns 0 faults : testfunc_deepstack (3)
-
-running the test with all rt tweaks
- - main setup very slow (does it really matter?)
- - no expensive malloc+access calls
- - no expensive big stacks
-$ sudo ./rtex 0x1f
-options: 0x1f
- 31276098 ns 7083 faults : main setup
- 2657466 ns 0 faults : testfunc_malloc (0)
- 2519973 ns 0 faults : testfunc_malloc (1)
- 2543506 ns 0 faults : testfunc_malloc (2)
- 2750682 ns 0 faults : testfunc_malloc (3)
- 526604 ns 0 faults : testfunc_deepstack (0)
- 324543 ns 0 faults : testfunc_deepstack (1)
- 318580 ns 0 faults : testfunc_deepstack (2)
- 317265 ns 0 faults : testfunc_deepstack (3)
diff --git a/schulung_tools/rtex/func.c b/schulung_tools/rtex/func.c
deleted file mode 100644
index 4b88166..0000000
--- a/schulung_tools/rtex/func.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-void timestamp(const char *msg, int val)
-{
- static struct timespec tsl;
- static long minfltl;
-
- struct timespec ts;
- unsigned long diff;
- struct rusage r;
- long rdiff;
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
- getrusage(RUSAGE_SELF, &r);
-
- if (tsl.tv_sec != 0) {
- diff = (ts.tv_sec - tsl.tv_sec) * 1000000000;
- diff += ts.tv_nsec - tsl.tv_nsec;
-
- rdiff = r.ru_minflt - minfltl;
-
- printf("% 10d ns % 5ld faults : %s", diff, rdiff, msg);
- if (val >= 0)
- printf(" (%d)", val);
- printf("\n");
- }
-
- tsl = ts;
- minfltl = r.ru_minflt;
-}
-
-/* 10 MiB */
-#define SIZE (10 * 1024 * 1024)
-
-void testfunc_malloc(void)
-{
- char *p;
-
- p = malloc(SIZE);
- if (!p) {
- fprintf(stderr, "MALLOC FAILED: %s:%d\n", __FILE__, __LINE__);
- return;
- }
-
- memset(p, 42, SIZE);
-
- if (p[SIZE - 1] != 42)
- fprintf(stderr, "MEMSET FAILED: %s:%d\n", __FILE__, __LINE__);
-
- free(p);
-}
-
-void recursive_stack(int i)
-{
- char buf[1024];
- if (i > 0)
- recursive_stack(i - 1);
-}
-
-void testfunc_deepstack(void)
-{
- char buf[1024];
- recursive_stack(7 * 1024);
-}
diff --git a/schulung_tools/rtex/main.c b/schulung_tools/rtex/main.c
deleted file mode 100644
index a68baf4..0000000
--- a/schulung_tools/rtex/main.c
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-extern void timestamp(const char *msg, int val);
-extern void testfunc_malloc(void);
-extern void testfunc_deepstack(void);
-extern void setup_rt(unsigned int opts);
-
-static void usage(const char *cmd)
-{
- printf("usage: %s [opts-bitmask]\n", cmd);
- printf(" opts-bits:\n");
- printf(" 0x01 = mallopt\n");
- printf(" 0x02 = mlockall\n");
- printf(" 0x04 = prefault-stack\n");
- printf(" 0x08 = prefault-heap\n");
- printf(" 0x10 = run tests\n");
- printf("\n");
- printf(" 0x10 = no rt tweaks + tests\n");
- printf(" 0x1f = full rt tweaks + tests\n");
- printf("\n");
-}
-
-int main(int argc, char *argv[])
-{
- unsigned int i;
-
- if (argc != 2) {
- usage(argv[0]);
- return 1;
- }
-
- if (sscanf(argv[1], "%x", &i) != 1) {
- usage(argv[0]);
- return 1;
- }
-
- printf("options: 0x%x\n", i);
-
- timestamp("init", -1);
-
- setup_rt(i);
-
- timestamp("main setup", -1);
-
- if (i & 0x10) {
- for (i = 0; i < 4; i++) {
- testfunc_malloc();
- timestamp("testfunc_malloc", i);
- }
-
- for (i = 0; i < 4; i++) {
- testfunc_deepstack();
- timestamp("testfunc_deepstack", i);
- }
- }
-
- return 0;
-}
diff --git a/schulung_tools/rtex/rt.c b/schulung_tools/rtex/rt.c
deleted file mode 100644
index 86a6506..0000000
--- a/schulung_tools/rtex/rt.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <malloc.h>
-#include <sys/mman.h>
-
-extern void timestamp(const char *msg, int val);
-extern void testfunc_malloc(void);
-extern void testfunc_deepstack(void);
-
-void prefault_stack(void)
-{
-#define STACK_SIZE (7680 * 1024) /* 7.5 MiB */
- char buf[STACK_SIZE];
- long pagesize;
- int i;
-
- pagesize = sysconf(_SC_PAGESIZE);
-
- for (i = 0; i < STACK_SIZE; i += pagesize)
- buf[i] = 0;
-}
-
-void prefault_heap(void)
-{
-#define HEAP_SIZE (20 * 1024 * 1024) /* 20 MiB */
- long pagesize;
- char *buf;
- int i;
-
- pagesize = sysconf(_SC_PAGESIZE);
-
- buf = malloc(HEAP_SIZE);
- if (!buf) {
- fprintf(stderr, "MALLOC FAILED: %s:%d\n", __FILE__, __LINE__);
- return;
- }
-
- for (i = 0; i < HEAP_SIZE; i += pagesize)
- buf[i] = 0;
-
- free(buf);
-}
-
-void setup_rt(unsigned int opts)
-{
- if (opts & 0x1) {
- if (mallopt(M_TRIM_THRESHOLD, -1) == 0) {
- fprintf(stderr, "MALLOPT FAILED: %s:%d\n",
- __FILE__, __LINE__);
- }
-
- if (mallopt(M_MMAP_MAX, 0) == 0) {
- fprintf(stderr, "MALLOPT FAILED: %s:%d\n",
- __FILE__, __LINE__);
- }
- }
-
- if (opts & 0x2) {
- if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {
- fprintf(stderr, "MLOCKALL FAILED: %s:%d\n",
- __FILE__, __LINE__);
- }
- }
-
- if (opts & 0x4)
- prefault_stack();
-
- if (opts & 0x8)
- prefault_heap();
-}
-