Jan Kiszka wrote:
> I played with it, but raising a signal from xnshadow_map is no good
> idea: If we inject the signal before the migration, xnshadow_map fails
> due to the pending signal, we exit to user space, run the signal,
> restart the call, raise the signal, and so on. If we raise after
> migration, we immediately force the new thread into secondary mode
> again, definitely causing problems when the mode switch warning is
> active, but also risking other regressions for xnshadow_map users that
> expect to find themselves in primary mode on return.
> 

Meditating over it again, I realized that there is actually no need to
raise the renice signal if we migrate in xnshadow_map. This case will be
handled automatically on next relax. That pattern seems to work and
allows indeed a few cleanups (just uitron still needs
pthread_setschedparam). This is just a first draft, needs more testing:

diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 8c679ad..f0f6801 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_
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(&param, 0, sizeof(param));
-               param.sched_priority = iargs->prio;
-               __real_pthread_setschedparam(pthread_self(), SCHED_FIFO, 
&param);
-       }
-
        /* 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(&param, 0, sizeof(param));
-               param.sched_priority = prio;
-               __real_pthread_setschedparam(pthread_self(), SCHED_FIFO, 
&param);
-       }
-
        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, &param);
-
                /* 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, &param);
-       pthread_setschedparam(pthread_self(), policy, &param);
-
        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, &param);
-       pthread_setschedparam(pthread_self(), policy, &param);
-
        /* 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, &param);
-       __real_pthread_setschedparam(pthread_self(), policy, &param);
-
        /* 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, ...);

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to