From: Jan Kiszka <jan.kiszka@domain.hid>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Cc: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] [PATCH] Rework initial Linux schedparam setting
Date: Wed, 18 Feb 2009 18:15:25 +0100 [thread overview]
Message-ID: <499C422D.9090203@domain.hid> (raw)
[ This obsoletes patch 1 of yesterday's series. ]
This patch enforces Linux task policy and priority alignment for shadow
threads via xnshadow_map and SIGSHADOW instead of solely relying on the
skins for this job. This allows to drop a few explicit
pthread_setschedparam calls from skin trampolines. It also helps to fix
SCHED_RR pthread_create (which is currently not forwarding the
round-robin property to the kernel side).
Signed-off-by: Jan Kiszka <jan.kiszka@domain.hid>
---
ksrc/nucleus/shadow.c | 12 ++++++++++++
ksrc/skins/posix/syscall.c | 6 +++---
src/skins/native/task.c | 19 -------------------
src/skins/native/wrappers.c | 7 -------
src/skins/native/wrappers.h | 3 ---
src/skins/posix/thread.c | 9 ++-------
src/skins/psos+/task.c | 5 -----
src/skins/vrtx/task.c | 9 ---------
src/skins/vxworks/taskLib.c | 9 ---------
src/skins/vxworks/wrappers.c | 7 -------
src/skins/vxworks/wrappers.h | 3 ---
11 files changed, 17 insertions(+), 72 deletions(-)
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 8c679ad..4a0f021 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1250,6 +1250,12 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t __user *u_completion,
thread->u_mode = u_mode;
if (u_completion) {
+ /*
+ * Send the renice signal if we are not migrating so that user
+ * space will immediately align Linux sched policy and prio.
+ */
+ xnshadow_renice(thread);
+
/*
* We still have the XNDORMANT bit set, so we can't
* link to the RPI queue which only links _runnable_
@@ -1273,6 +1279,12 @@ int xnshadow_map(xnthread_t *thread, xncompletion_t __user *u_completion,
ret = xnshadow_harden();
+ /*
+ * Ensure that user space will receive the proper Linux task policy
+ * and prio on next switch to secondary mode.
+ */
+ xnthread_set_info(thread, XNPRIOSET);
+
xnarch_trace_pid(xnarch_user_pid(xnthread_archtcb(thread)),
xnthread_current_priority(thread));
diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 99c2a16..16303b3 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -167,9 +167,9 @@ static int __pthread_create(struct pt_regs *regs)
calling context. */
pthread_attr_init(&attr);
- attr.policy = p->policy;
+ attr.policy = __xn_reg_arg2(regs);
attr.detachstate = PTHREAD_CREATE_DETACHED;
- attr.schedparam_ex.sched_priority = p->rt_priority;
+ attr.schedparam_ex.sched_priority = __xn_reg_arg3(regs);
attr.fp = 1;
attr.name = p->comm;
@@ -179,7 +179,7 @@ static int __pthread_create(struct pt_regs *regs)
return -err; /* Conventionally, our error codes are negative. */
err = xnshadow_map(&k_tid->threadbase, NULL,
- (unsigned long __user *)__xn_reg_arg2(regs));
+ (unsigned long __user *)__xn_reg_arg4(regs));
if (!err && !__pthread_hash(&hkey, k_tid))
err = -ENOMEM;
diff --git a/src/skins/native/task.c b/src/skins/native/task.c
index 7bcc49c..190dc4b 100644
--- a/src/skins/native/task.c
+++ b/src/skins/native/task.c
@@ -55,21 +55,10 @@ static void *rt_task_trampoline(void *cookie)
{
struct rt_task_iargs *iargs = (struct rt_task_iargs *)cookie;
void (*entry) (void *cookie);
- struct sched_param param;
struct rt_arg_bulk bulk;
RT_TASK *task;
long err;
- if (iargs->prio > 0) {
- /*
- * Re-apply sched params here as some libpthread
- * implementations fail doing this via pthread_create.
- */
- memset(¶m, 0, sizeof(param));
- param.sched_priority = iargs->prio;
- __real_pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
- }
-
/* rt_task_delete requires asynchronous cancellation */
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
@@ -178,7 +167,6 @@ int rt_task_start(RT_TASK *task, void (*entry) (void *cookie), void *cookie)
int rt_task_shadow(RT_TASK *task, const char *name, int prio, int mode)
{
- struct sched_param param;
struct rt_arg_bulk bulk;
RT_TASK task_desc;
int err;
@@ -190,13 +178,6 @@ int rt_task_shadow(RT_TASK *task, const char *name, int prio, int mode)
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
sigshadow_install_once();
- if (prio > 0) {
- /* Make sure the POSIX library caches the right priority. */
- memset(¶m, 0, sizeof(param));
- param.sched_priority = prio;
- __real_pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
- }
-
bulk.a1 = (u_long)task;
bulk.a2 = (u_long)name;
bulk.a3 = (u_long)prio;
diff --git a/src/skins/native/wrappers.c b/src/skins/native/wrappers.c
index 8421456..4463f6f 100644
--- a/src/skins/native/wrappers.c
+++ b/src/skins/native/wrappers.c
@@ -33,13 +33,6 @@
*/
__attribute__ ((weak))
-int __real_pthread_setschedparam(pthread_t thread,
- int policy, const struct sched_param *param)
-{
- return pthread_setschedparam(thread, policy, param);
-}
-
-__attribute__ ((weak))
int __real_pthread_create(pthread_t *tid,
const pthread_attr_t * attr,
void *(*start) (void *), void *arg)
diff --git a/src/skins/native/wrappers.h b/src/skins/native/wrappers.h
index f2125a4..99568a9 100644
--- a/src/skins/native/wrappers.h
+++ b/src/skins/native/wrappers.h
@@ -8,9 +8,6 @@ int __real_pthread_create(pthread_t *tid,
const pthread_attr_t * attr,
void *(*start) (void *), void *arg);
-int __real_pthread_setschedparam(pthread_t thread,
- int policy, const struct sched_param *param);
-
int __real_pthread_kill(pthread_t tid, int sig);
int __real_open(const char *path, int oflag, ...);
diff --git a/src/skins/posix/thread.c b/src/skins/posix/thread.c
index f32c7e1..e8c50bd 100644
--- a/src/skins/posix/thread.c
+++ b/src/skins/posix/thread.c
@@ -203,8 +203,8 @@ static void *__pthread_trampoline(void *arg)
/* Do _not_ inline the call to pthread_self() in the syscall
macro: this trashes the syscall regs on some archs. */
- err = XENOMAI_SKINCALL2(__pse51_muxid, __pse51_thread_create, tid,
- mode_buf);
+ err = XENOMAI_SKINCALL4(__pse51_muxid, __pse51_thread_create, tid,
+ iargs->policy, iargs->prio, mode_buf);
iargs->ret = -err;
/* We must save anything we'll need to use from *iargs on our own
@@ -221,11 +221,6 @@ static void *__pthread_trampoline(void *arg)
__real_sem_post(&iargs->sync);
if (!err) {
- /* Broken pthread libs ignore some of the thread attribute specs
- passed to pthread_create(3), so we force the scheduling policy
- once again here. */
- __real_pthread_setschedparam(tid, policy, ¶m);
-
/* If the thread running pthread_create runs with the same
priority as us, we should leave it running, as if there never
was a synchronization with a semaphore. */
diff --git a/src/skins/psos+/task.c b/src/skins/psos+/task.c
index 265eab2..1bf3565 100644
--- a/src/skins/psos+/task.c
+++ b/src/skins/psos+/task.c
@@ -63,13 +63,8 @@ static void *psos_task_trampoline(void *cookie)
void (*entry)(u_long, u_long, u_long, u_long);
u_long dummy_args[4] = { 0, 0, 0, 0 }, *targs;
struct psos_arg_bulk bulk;
- struct sched_param param;
- int policy;
long err;
- policy = psos_task_set_posix_priority(iargs->prio, ¶m);
- pthread_setschedparam(pthread_self(), policy, ¶m);
-
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
sigshadow_install_once();
diff --git a/src/skins/vrtx/task.c b/src/skins/vrtx/task.c
index 1b16f68..184c948 100644
--- a/src/skins/vrtx/task.c
+++ b/src/skins/vrtx/task.c
@@ -73,8 +73,6 @@ static void *vrtx_task_trampoline(void *cookie)
struct vrtx_task_iargs *iargs =
(struct vrtx_task_iargs *)cookie, _iargs;
struct vrtx_arg_bulk bulk;
- struct sched_param param;
- int policy;
long err;
#ifndef HAVE___THREAD
TCB *tcb;
@@ -83,13 +81,6 @@ static void *vrtx_task_trampoline(void *cookie)
/* Backup the arg struct, it might vanish after completion. */
memcpy(&_iargs, iargs, sizeof(_iargs));
- /*
- * Apply sched params here as some libpthread implementations
- * fail doing this properly via pthread_create.
- */
- policy = vrtx_task_set_posix_priority(iargs->prio, ¶m);
- pthread_setschedparam(pthread_self(), policy, ¶m);
-
/* vrtx_task_delete requires asynchronous cancellation */
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
diff --git a/src/skins/vxworks/taskLib.c b/src/skins/vxworks/taskLib.c
index 1ba193e..3249bfc 100644
--- a/src/skins/vxworks/taskLib.c
+++ b/src/skins/vxworks/taskLib.c
@@ -86,21 +86,12 @@ static void *wind_task_trampoline(void *cookie)
struct wind_task_iargs *iargs =
(struct wind_task_iargs *)cookie, _iargs;
struct wind_arg_bulk bulk;
- struct sched_param param;
WIND_TCB *pTcb;
- int policy;
long err;
/* Backup the arg struct, it might vanish after completion. */
memcpy(&_iargs, iargs, sizeof(_iargs));
- /*
- * Apply sched params here as some libpthread implementations
- * fail doing this properly via pthread_create.
- */
- policy = wind_task_set_posix_priority(iargs->prio, ¶m);
- __real_pthread_setschedparam(pthread_self(), policy, ¶m);
-
/* wind_task_delete requires asynchronous cancellation */
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
sigshadow_install_once();
diff --git a/src/skins/vxworks/wrappers.c b/src/skins/vxworks/wrappers.c
index 394ea51..ab50d77 100644
--- a/src/skins/vxworks/wrappers.c
+++ b/src/skins/vxworks/wrappers.c
@@ -33,13 +33,6 @@
*/
__attribute__ ((weak))
-int __real_pthread_setschedparam(pthread_t thread,
- int policy, const struct sched_param *param)
-{
- return pthread_setschedparam(thread, policy, param);
-}
-
-__attribute__ ((weak))
int __real_pthread_create(pthread_t *tid,
const pthread_attr_t * attr,
void *(*start) (void *), void *arg)
diff --git a/src/skins/vxworks/wrappers.h b/src/skins/vxworks/wrappers.h
index 919309a..e20da86 100644
--- a/src/skins/vxworks/wrappers.h
+++ b/src/skins/vxworks/wrappers.h
@@ -8,9 +8,6 @@ int __real_pthread_create(pthread_t *tid,
const pthread_attr_t * attr,
void *(*start) (void *), void *arg);
-int __real_pthread_setschedparam(pthread_t thread,
- int policy, const struct sched_param *param);
-
int __real_pthread_kill(pthread_t tid, int sig);
int __real_open(const char *path, int oflag, ...);
reply other threads:[~2009-02-18 17:15 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=499C422D.9090203@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=gilles.chanteperdrix@xenomai.org \
--cc=xenomai@xenomai.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.