summaryrefslogtreecommitdiff
path: root/kernel/rtmutex-tester.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2006-06-27 02:55:01 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-06-27 17:32:47 -0700
commit0bafd214e4ba55dc1fb81a3031d0249292f1bc05 (patch)
tree754b3ad381078c57061515549642889b19aaf86d /kernel/rtmutex-tester.c
parente74c69f46d93d29eea0ad8647863d1c6488f0f55 (diff)
downloadlwn-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/rtmutex-tester.c')
-rw-r--r--kernel/rtmutex-tester.c32
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;