diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2006-06-27 02:55:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-27 17:32:47 -0700 |
commit | 0bafd214e4ba55dc1fb81a3031d0249292f1bc05 (patch) | |
tree | 754b3ad381078c57061515549642889b19aaf86d /kernel | |
parent | e74c69f46d93d29eea0ad8647863d1c6488f0f55 (diff) | |
download | lwn-0bafd214e4ba55dc1fb81a3031d0249292f1bc05.tar.gz lwn-0bafd214e4ba55dc1fb81a3031d0249292f1bc05.zip |
[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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rtmutex-tester.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/kernel/rtmutex-tester.c b/kernel/rtmutex-tester.c index fe211ba3a5b5..e82c2f848249 100644 --- a/kernel/rtmutex-tester.c +++ b/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_data *td, int lockwakeup) 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 sys_device *dev, const char *buf, 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; |