[PATCH] rtmutex: Modify rtmutex-tester to test the setscheduler propagation

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@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Thomas Gleixner 2006-06-27 02:55:01 -07:00 committed by Linus Torvalds
parent e74c69f46d
commit 0bafd214e4
15 changed files with 202 additions and 49 deletions

View file

@ -46,7 +46,7 @@ enum test_opcodes {
RTTEST_LOCKINTNOWAIT, /* 6 Lock interruptible no wait in wakeup, data = lockindex */ RTTEST_LOCKINTNOWAIT, /* 6 Lock interruptible no wait in wakeup, data = lockindex */
RTTEST_LOCKCONT, /* 7 Continue locking after the wakeup delay */ RTTEST_LOCKCONT, /* 7 Continue locking after the wakeup delay */
RTTEST_UNLOCK, /* 8 Unlock, data = lockindex */ RTTEST_UNLOCK, /* 8 Unlock, data = lockindex */
RTTEST_LOCKBKL, /* 9 Lock BKL */ RTTEST_LOCKBKL, /* 9 Lock BKL */
RTTEST_UNLOCKBKL, /* 10 Unlock BKL */ RTTEST_UNLOCKBKL, /* 10 Unlock BKL */
RTTEST_SIGNAL, /* 11 Signal other test thread, data = thread id */ RTTEST_SIGNAL, /* 11 Signal other test thread, data = thread id */
RTTEST_RESETEVENT = 98, /* 98 Reset event counter */ 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) static int handle_op(struct test_thread_data *td, int lockwakeup)
{ {
struct sched_param schedpar;
int i, id, ret = -EINVAL; int i, id, ret = -EINVAL;
switch(td->opcode) { switch(td->opcode) {
@ -63,17 +62,6 @@ static int handle_op(struct test_thread_data *td, int lockwakeup)
case RTTEST_NOP: case RTTEST_NOP:
return 0; 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: case RTTEST_LOCKCONT:
td->mutexes[td->opdata] = 1; td->mutexes[td->opdata] = 1;
td->event = atomic_add_return(1, &rttest_event); 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, static ssize_t sysfs_test_command(struct sys_device *dev, const char *buf,
size_t count) size_t count)
{ {
struct sched_param schedpar;
struct test_thread_data *td; struct test_thread_data *td;
char cmdbuf[32]; char cmdbuf[32];
int op, dat, tid; int op, dat, tid, ret;
td = container_of(dev, struct test_thread_data, sysdev); td = container_of(dev, struct test_thread_data, sysdev);
tid = td->sysdev.id; tid = td->sysdev.id;
@ -334,6 +323,21 @@ static ssize_t sysfs_test_command(struct sys_device *dev, const char *buf,
return -EINVAL; return -EINVAL;
switch (op) { 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: case RTTEST_SIGNAL:
send_sig(SIGHUP, threads[tid], 0); send_sig(SIGHUP, threads[tid], 0);
break; break;

View file

@ -18,4 +18,5 @@ testit t3-l1-pi-steal.tst
testit t3-l2-pi.tst testit t3-l2-pi.tst
testit t4-l2-pi-deboost.tst testit t4-l2-pi-deboost.tst
testit t5-l4-pi-boost-deboost.tst testit t5-l4-pi-boost-deboost.tst
testit t5-l4-pi-boost-deboost-setsched.tst

View file

@ -57,9 +57,7 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedfifo: 0: 80 C: schedfifo: 0: 80
W: opcodeeq: 0: 0
C: schedfifo: 1: 80 C: schedfifo: 1: 80
W: opcodeeq: 1: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,9 +57,7 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedfifo: 1: 80 C: schedfifo: 1: 80
W: opcodeeq: 1: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,9 +57,7 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedother: 1: 0 C: schedother: 1: 0
W: opcodeeq: 1: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,9 +57,7 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedfifo: 0: 80 C: schedfifo: 0: 80
W: opcodeeq: 0: 0
C: schedfifo: 1: 80 C: schedfifo: 1: 80
W: opcodeeq: 1: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,11 +57,8 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedother: 1: 0 C: schedother: 1: 0
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,11 +57,8 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedfifo: 1: 81 C: schedfifo: 1: 81
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,11 +57,8 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedfifo: 0: 80 C: schedfifo: 0: 80
W: opcodeeq: 0: 0
C: schedfifo: 1: 81 C: schedfifo: 1: 81
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -55,11 +55,8 @@ W: opcodeeq: 0: 0
# Set priorities # Set priorities
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedfifo: 1: 80 C: schedfifo: 1: 80
W: opcodeeq: 1: 0
C: schedfifo: 2: 81 C: schedfifo: 2: 81
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: lock: 0: 0 C: lock: 0: 0

View file

@ -57,11 +57,8 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedfifo: 1: 80 C: schedfifo: 1: 80
W: opcodeeq: 1: 0
C: schedfifo: 2: 81 C: schedfifo: 2: 81
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: lock: 0: 0 C: lock: 0: 0

View file

@ -57,11 +57,8 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedother: 1: 0 C: schedother: 1: 0
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -57,13 +57,9 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedother: 1: 0 C: schedother: 1: 0
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
C: schedfifo: 3: 83 C: schedfifo: 3: 83
W: opcodeeq: 3: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0

View file

@ -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

View file

@ -57,15 +57,10 @@ W: opcodeeq: 0: 0
# Set schedulers # Set schedulers
C: schedother: 0: 0 C: schedother: 0: 0
W: opcodeeq: 0: 0
C: schedfifo: 1: 81 C: schedfifo: 1: 81
W: opcodeeq: 1: 0
C: schedfifo: 2: 82 C: schedfifo: 2: 82
W: opcodeeq: 2: 0
C: schedfifo: 3: 83 C: schedfifo: 3: 83
W: opcodeeq: 3: 0
C: schedfifo: 4: 84 C: schedfifo: 4: 84
W: opcodeeq: 4: 0
# T0 lock L0 # T0 lock L0
C: locknowait: 0: 0 C: locknowait: 0: 0