The patch titled rtmutex: Modify rtmutex-tester to test the setscheduler propagation has been added to the -mm tree. Its filename is rtmutex-modify-rtmutex-tester-to-test-the-setscheduler.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: rtmutex: Modify rtmutex-tester to test the setscheduler propagation From: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Make test suite setscheduler calls asynchronously. Remove the waits in the test cases and add a new testcase to verify the correctness of the setscheduler priority propagation. Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Signed-off-by: Ingo Molnar <mingo@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- kernel/rtmutex-tester.c | 32 - scripts/rt-tester/check-all.sh | 1 scripts/rt-tester/t2-l1-2rt-sameprio.tst | 2 scripts/rt-tester/t2-l1-pi.tst | 2 scripts/rt-tester/t2-l1-signal.tst | 2 scripts/rt-tester/t2-l2-2rt-deadlock.tst | 2 scripts/rt-tester/t3-l1-pi-1rt.tst | 3 scripts/rt-tester/t3-l1-pi-2rt.tst | 3 scripts/rt-tester/t3-l1-pi-3rt.tst | 3 scripts/rt-tester/t3-l1-pi-signal.tst | 3 scripts/rt-tester/t3-l1-pi-steal.tst | 3 scripts/rt-tester/t3-l2-pi.tst | 3 scripts/rt-tester/t4-l2-pi-deboost.tst | 4 scripts/rt-tester/t5-l4-pi-boost-deboost-setsched.tst | 183 ++++++++++ scripts/rt-tester/t5-l4-pi-boost-deboost.tst | 5 15 files changed, 202 insertions(+), 49 deletions(-) diff -puN kernel/rtmutex-tester.c~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler kernel/rtmutex-tester.c --- a/kernel/rtmutex-tester.c~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/kernel/rtmutex-tester.c @@ -46,7 +46,7 @@ enum test_opcodes { RTTEST_LOCKINTNOWAIT, /* 6 Lock interruptible no wait in wakeup, data = lockindex */ RTTEST_LOCKCONT, /* 7 Continue locking after the wakeup delay */ RTTEST_UNLOCK, /* 8 Unlock, data = lockindex */ - RTTEST_LOCKBKL, /* 9 Lock BKL */ + RTTEST_LOCKBKL, /* 9 Lock BKL */ RTTEST_UNLOCKBKL, /* 10 Unlock BKL */ RTTEST_SIGNAL, /* 11 Signal other test thread, data = thread id */ RTTEST_RESETEVENT = 98, /* 98 Reset event counter */ @@ -55,7 +55,6 @@ enum test_opcodes { static int handle_op(struct test_thread_data *td, int lockwakeup) { - struct sched_param schedpar; int i, id, ret = -EINVAL; switch(td->opcode) { @@ -63,17 +62,6 @@ static int handle_op(struct test_thread_ case RTTEST_NOP: return 0; - case RTTEST_SCHEDOT: - schedpar.sched_priority = 0; - ret = sched_setscheduler(current, SCHED_NORMAL, &schedpar); - if (!ret) - set_user_nice(current, 0); - return ret; - - case RTTEST_SCHEDRT: - schedpar.sched_priority = td->opdata; - return sched_setscheduler(current, SCHED_FIFO, &schedpar); - case RTTEST_LOCKCONT: td->mutexes[td->opdata] = 1; td->event = atomic_add_return(1, &rttest_event); @@ -310,9 +298,10 @@ static int test_func(void *data) static ssize_t sysfs_test_command(struct sys_device *dev, const char *buf, size_t count) { + struct sched_param schedpar; struct test_thread_data *td; char cmdbuf[32]; - int op, dat, tid; + int op, dat, tid, ret; td = container_of(dev, struct test_thread_data, sysdev); tid = td->sysdev.id; @@ -334,6 +323,21 @@ static ssize_t sysfs_test_command(struct return -EINVAL; switch (op) { + case RTTEST_SCHEDOT: + schedpar.sched_priority = 0; + ret = sched_setscheduler(threads[tid], SCHED_NORMAL, &schedpar); + if (ret) + return ret; + set_user_nice(current, 0); + break; + + case RTTEST_SCHEDRT: + schedpar.sched_priority = dat; + ret = sched_setscheduler(threads[tid], SCHED_FIFO, &schedpar); + if (ret) + return ret; + break; + case RTTEST_SIGNAL: send_sig(SIGHUP, threads[tid], 0); break; diff -puN scripts/rt-tester/check-all.sh~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/check-all.sh --- a/scripts/rt-tester/check-all.sh~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/check-all.sh @@ -18,4 +18,5 @@ testit t3-l1-pi-steal.tst testit t3-l2-pi.tst testit t4-l2-pi-deboost.tst testit t5-l4-pi-boost-deboost.tst +testit t5-l4-pi-boost-deboost-setsched.tst diff -puN scripts/rt-tester/t2-l1-2rt-sameprio.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t2-l1-2rt-sameprio.tst --- a/scripts/rt-tester/t2-l1-2rt-sameprio.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t2-l1-2rt-sameprio.tst @@ -57,9 +57,7 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedfifo: 0: 80 -W: opcodeeq: 0: 0 C: schedfifo: 1: 80 -W: opcodeeq: 1: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t2-l1-pi.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t2-l1-pi.tst --- a/scripts/rt-tester/t2-l1-pi.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t2-l1-pi.tst @@ -57,9 +57,7 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedfifo: 1: 80 -W: opcodeeq: 1: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t2-l1-signal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t2-l1-signal.tst --- a/scripts/rt-tester/t2-l1-signal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t2-l1-signal.tst @@ -57,9 +57,7 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedother: 1: 0 -W: opcodeeq: 1: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t2-l2-2rt-deadlock.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t2-l2-2rt-deadlock.tst --- a/scripts/rt-tester/t2-l2-2rt-deadlock.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t2-l2-2rt-deadlock.tst @@ -57,9 +57,7 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedfifo: 0: 80 -W: opcodeeq: 0: 0 C: schedfifo: 1: 80 -W: opcodeeq: 1: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t3-l1-pi-1rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l1-pi-1rt.tst --- a/scripts/rt-tester/t3-l1-pi-1rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l1-pi-1rt.tst @@ -57,11 +57,8 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedother: 1: 0 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t3-l1-pi-2rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l1-pi-2rt.tst --- a/scripts/rt-tester/t3-l1-pi-2rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l1-pi-2rt.tst @@ -57,11 +57,8 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedfifo: 1: 81 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t3-l1-pi-3rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l1-pi-3rt.tst --- a/scripts/rt-tester/t3-l1-pi-3rt.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l1-pi-3rt.tst @@ -57,11 +57,8 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedfifo: 0: 80 -W: opcodeeq: 0: 0 C: schedfifo: 1: 81 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t3-l1-pi-signal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l1-pi-signal.tst --- a/scripts/rt-tester/t3-l1-pi-signal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l1-pi-signal.tst @@ -55,11 +55,8 @@ W: opcodeeq: 0: 0 # Set priorities C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedfifo: 1: 80 -W: opcodeeq: 1: 0 C: schedfifo: 2: 81 -W: opcodeeq: 2: 0 # T0 lock L0 C: lock: 0: 0 diff -puN scripts/rt-tester/t3-l1-pi-steal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l1-pi-steal.tst --- a/scripts/rt-tester/t3-l1-pi-steal.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l1-pi-steal.tst @@ -57,11 +57,8 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedfifo: 1: 80 -W: opcodeeq: 1: 0 C: schedfifo: 2: 81 -W: opcodeeq: 2: 0 # T0 lock L0 C: lock: 0: 0 diff -puN scripts/rt-tester/t3-l2-pi.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t3-l2-pi.tst --- a/scripts/rt-tester/t3-l2-pi.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t3-l2-pi.tst @@ -57,11 +57,8 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedother: 1: 0 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN scripts/rt-tester/t4-l2-pi-deboost.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t4-l2-pi-deboost.tst --- a/scripts/rt-tester/t4-l2-pi-deboost.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t4-l2-pi-deboost.tst @@ -57,13 +57,9 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedother: 1: 0 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 C: schedfifo: 3: 83 -W: opcodeeq: 3: 0 # T0 lock L0 C: locknowait: 0: 0 diff -puN /dev/null scripts/rt-tester/t5-l4-pi-boost-deboost-setsched.tst --- /dev/null +++ a/scripts/rt-tester/t5-l4-pi-boost-deboost-setsched.tst @@ -0,0 +1,183 @@ +# +# rt-mutex test +# +# Op: C(ommand)/T(est)/W(ait) +# | opcode +# | | threadid: 0-7 +# | | | opcode argument +# | | | | +# C: lock: 0: 0 +# +# Commands +# +# opcode opcode argument +# schedother nice value +# schedfifo priority +# lock lock nr (0-7) +# locknowait lock nr (0-7) +# lockint lock nr (0-7) +# lockintnowait lock nr (0-7) +# lockcont lock nr (0-7) +# unlock lock nr (0-7) +# lockbkl lock nr (0-7) +# unlockbkl lock nr (0-7) +# signal thread to signal (0-7) +# reset 0 +# resetevent 0 +# +# Tests / Wait +# +# opcode opcode argument +# +# prioeq priority +# priolt priority +# priogt priority +# nprioeq normal priority +# npriolt normal priority +# npriogt normal priority +# locked lock nr (0-7) +# blocked lock nr (0-7) +# blockedwake lock nr (0-7) +# unlocked lock nr (0-7) +# lockedbkl dont care +# blockedbkl dont care +# unlockedbkl dont care +# opcodeeq command opcode or number +# opcodelt number +# opcodegt number +# eventeq number +# eventgt number +# eventlt number + +# +# 5 threads 4 lock PI - modify priority of blocked threads +# +C: resetevent: 0: 0 +W: opcodeeq: 0: 0 + +# Set schedulers +C: schedother: 0: 0 +C: schedfifo: 1: 81 +C: schedfifo: 2: 82 +C: schedfifo: 3: 83 +C: schedfifo: 4: 84 + +# T0 lock L0 +C: locknowait: 0: 0 +W: locked: 0: 0 + +# T1 lock L1 +C: locknowait: 1: 1 +W: locked: 1: 1 + +# T1 lock L0 +C: lockintnowait: 1: 0 +W: blocked: 1: 0 +T: prioeq: 0: 81 + +# T2 lock L2 +C: locknowait: 2: 2 +W: locked: 2: 2 + +# T2 lock L1 +C: lockintnowait: 2: 1 +W: blocked: 2: 1 +T: prioeq: 0: 82 +T: prioeq: 1: 82 + +# T3 lock L3 +C: locknowait: 3: 3 +W: locked: 3: 3 + +# T3 lock L2 +C: lockintnowait: 3: 2 +W: blocked: 3: 2 +T: prioeq: 0: 83 +T: prioeq: 1: 83 +T: prioeq: 2: 83 + +# T4 lock L3 +C: lockintnowait: 4: 3 +W: blocked: 4: 3 +T: prioeq: 0: 84 +T: prioeq: 1: 84 +T: prioeq: 2: 84 +T: prioeq: 3: 84 + +# Reduce prio of T4 +C: schedfifo: 4: 80 +T: prioeq: 0: 83 +T: prioeq: 1: 83 +T: prioeq: 2: 83 +T: prioeq: 3: 83 +T: prioeq: 4: 80 + +# Increase prio of T4 +C: schedfifo: 4: 84 +T: prioeq: 0: 84 +T: prioeq: 1: 84 +T: prioeq: 2: 84 +T: prioeq: 3: 84 +T: prioeq: 4: 84 + +# Reduce prio of T3 +C: schedfifo: 3: 80 +T: prioeq: 0: 84 +T: prioeq: 1: 84 +T: prioeq: 2: 84 +T: prioeq: 3: 84 +T: prioeq: 4: 84 + +# Increase prio of T3 +C: schedfifo: 3: 85 +T: prioeq: 0: 85 +T: prioeq: 1: 85 +T: prioeq: 2: 85 +T: prioeq: 3: 85 +T: prioeq: 4: 84 + +# Reduce prio of T3 +C: schedfifo: 3: 83 +T: prioeq: 0: 84 +T: prioeq: 1: 84 +T: prioeq: 2: 84 +T: prioeq: 3: 84 +T: prioeq: 4: 84 + +# Signal T4 +C: signal: 4: 0 +W: unlocked: 4: 3 +T: prioeq: 0: 83 +T: prioeq: 1: 83 +T: prioeq: 2: 83 +T: prioeq: 3: 83 + +# Signal T3 +C: signal: 3: 0 +W: unlocked: 3: 2 +T: prioeq: 0: 82 +T: prioeq: 1: 82 +T: prioeq: 2: 82 + +# Signal T2 +C: signal: 2: 0 +W: unlocked: 2: 1 +T: prioeq: 0: 81 +T: prioeq: 1: 81 + +# Signal T1 +C: signal: 1: 0 +W: unlocked: 1: 0 +T: priolt: 0: 1 + +# Unlock and exit +C: unlock: 3: 3 +C: unlock: 2: 2 +C: unlock: 1: 1 +C: unlock: 0: 0 + +W: unlocked: 3: 3 +W: unlocked: 2: 2 +W: unlocked: 1: 1 +W: unlocked: 0: 0 + diff -puN scripts/rt-tester/t5-l4-pi-boost-deboost.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler scripts/rt-tester/t5-l4-pi-boost-deboost.tst --- a/scripts/rt-tester/t5-l4-pi-boost-deboost.tst~rtmutex-modify-rtmutex-tester-to-test-the-setscheduler +++ a/scripts/rt-tester/t5-l4-pi-boost-deboost.tst @@ -57,15 +57,10 @@ W: opcodeeq: 0: 0 # Set schedulers C: schedother: 0: 0 -W: opcodeeq: 0: 0 C: schedfifo: 1: 81 -W: opcodeeq: 1: 0 C: schedfifo: 2: 82 -W: opcodeeq: 2: 0 C: schedfifo: 3: 83 -W: opcodeeq: 3: 0 C: schedfifo: 4: 84 -W: opcodeeq: 4: 0 # T0 lock L0 C: locknowait: 0: 0 _ Patches currently in -mm which might be from tglx@xxxxxxxxxxxxx are origin.patch git-mtd.patch pi-futex-futex-code-cleanups.patch pi-futex-introduce-debug_check_no_locks_freed.patch pi-futex-add-plist-implementation.patch pi-futex-scheduler-support-for-pi.patch pi-futex-rt-mutex-core.patch pi-futex-rt-mutex-docs.patch pi-futex-rt-mutex-debug.patch pi-futex-rt-mutex-tester.patch pi-futex-rt-mutex-tester-fix.patch pi-futex-rt-mutex-futex-api.patch pi-futex-futex_lock_pi-futex_unlock_pi-support.patch fix-rt-mutex-defaults-and-dependencies.patch drop-tasklist-lock-in-do_sched_setscheduler.patch rtmutex-propagate-priority-settings-into-pi-lock-chains.patch rtmutex-modify-rtmutex-tester-to-test-the-setscheduler.patch futex_requeue-optimization.patch genirq-rename-desc-handler-to-desc-chip.patch genirq-rename-desc-handler-to-desc-chip-terminate_irqs-fix.patch genirq-sem2mutex-probe_sem-probing_active.patch genirq-cleanup-merge-irq_affinity-into-irq_desc.patch genirq-cleanup-remove-irq_descp.patch genirq-cleanup-remove-fastcall.patch genirq-cleanup-misc-code-cleanups.patch genirq-cleanup-reduce-irq_desc_t-use-mark-it-obsolete.patch genirq-cleanup-include-linux-irqh.patch genirq-cleanup-merge-irq_dir-smp_affinity_entry-into-irq_desc.patch genirq-cleanup-merge-pending_irq_cpumask-into-irq_desc.patch genirq-cleanup-turn-arch_has_irq_per_cpu-into-config_irq_per_cpu.patch genirq-debug-better-debug-printout-in-enable_irq.patch genirq-add-retrigger-irq-op-to-consolidate-hw_irq_resend.patch genirq-doc-comment-include-linux-irqh-structures.patch genirq-doc-handle_irq_event-and-__do_irq-comments.patch genirq-cleanup-no_irq_type-cleanups.patch genirq-doc-add-design-documentation.patch genirq-add-genirq-sw-irq-retrigger.patch genirq-add-irq_noprobe-support.patch genirq-add-irq_norequest-support.patch genirq-add-irq_noautoen-support.patch genirq-update-copyrights.patch genirq-core.patch genirq-msi-fixes-2.patch genirq-add-irq-chip-support.patch genirq-add-irq-chip-support-fix.patch genirq-add-irq-chip-support-fasteoi-handler-handle-interrupt-disabling.patch genirq-convert-the-x86_64-architecture-to-irq-chips.patch genirq-convert-the-i386-architecture-to-irq-chips.patch genirq-convert-the-i386-architecture-to-irq-chips-fix-2.patch genirq-add-chip-eoi-fastack-fasteoi-fix.patch genirq-add-handle_bad_irq.patch genirq-add-irq-wake-power-management-support.patch genirq-add-sa_trigger-support.patch genirq-more-verbose-debugging-on-unexpected-irq-vectors.patch genirq-ia64-build-fix.patch genirq-add-irq_type_sense_mask.patch genirq-irq-convert-the-move_irq-flag-from-a-32bit-word-to-a-single-bit.patch genirq-irq-add-moved_masked_irq.patch genirq-x86_64-irq-reenable-migrating-irqs-to-other-cpus.patch genirq-msi-simplify-msi-enable-and-disable.patch genirq-msi-simplify-msi-enable-and-disable-fix.patch genirq-msi-make-the-msi-boolean-tests-return-either-0-or-1.patch genirq-msi-implement-helper-functions-read_msi_msg-and-write_msi_msg.patch genirq-msi-refactor-the-msi_ops.patch genirq-msi-simplify-the-msi-irq-limit-policy.patch genirq-irq-add-a-dynamic-irq-creation-api.patch genirq-ia64-irq-dynamic-irq-support.patch genirq-i386-irq-dynamic-irq-support.patch genirq-i386-irq-dynamic-irq-support-fix.patch genirq-x86_64-irq-dynamic-irq-support.patch genirq-msi-make-the-msi-code-irq-based-and-not-vector-based.patch genirq-x86_64-irq-move-msi-message-composition-into-io_apicc.patch genirq-i386-irq-move-msi-message-composition-into-io_apicc.patch genirq-msi-only-build-msi-apicc-on-ia64.patch genirq-x86_64-irq-remove-the-msi-assumption-that-irq-==-vector.patch genirq-i386-irq-remove-the-msi-assumption-that-irq-==-vector.patch genirq-i386-irq-remove-the-msi-assumption-that-irq-==-vector-fix.patch genirq-irq-remove-msi-hacks.patch genirq-irq-generalize-the-check-for-hardirq_bits.patch genirq-x86_64-irq-make-the-external-irq-handlers-report-their-vector-not-the-irq-number.patch genirq-x86_64-irq-make-vector_irq-per-cpu.patch genirq-x86_64-irq-kill-gsi_irq_sharing.patch genirq-x86_64-irq-kill-irq-compression.patch genirq-irq-document-what-an-irq-is.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html