Gilles Chanteperdrix wrote:
Gilles Chanteperdrix wrote:
 > This is not the only situation where a thread with a nucleus suspension
 > bit need to run shortly in secondary mode: it also occurs when
 > suspending with xnpod_suspend_thread() a thread running in secondary
 > mode; the thread receives the SIGCHLD signal and need to execute shortly
 > with the suspension bit set in order to cause a migration to primary
 > mode.
> > So, the only case when we are sure that a user-space thread can not be
 > scheduled by Linux seems to be when this thread does not have the
 > XNRELAX bit.

From all the bits in XNTHREAD_BLOCK_BITS, only when the XNPEND bit is
set, a thread can not be running in secondary mode. Hence the proposed
patch.


Almost ok, but XNDELAY might also be set alone, indicating a purely timed wait state (i.e. without sync object to pend on, so XNPEND is off).



------------------------------------------------------------------------

Index: ksrc/nucleus/shadow.c
===================================================================
--- ksrc/nucleus/shadow.c       (revision 507)
+++ ksrc/nucleus/shadow.c       (working copy)
@@ -1543,14 +1543,25 @@
#ifdef CONFIG_XENO_OPT_DEBUG
        {
-       xnflags_t status = threadin->status & ~XNRELAX;
+       xnflags_t status = threadin->status;
        int sigpending = signal_pending(next);
- if (!(next->ptrace & PT_PTRACED) &&
+        if (!testbits(status, XNRELAX))
+            {
+            show_stack(xnthread_user_task(threadin),NULL);
+            xnpod_fatal("Hardened thread %s[%d] running in Linux domain?! 
(status=0x%lx, sig=%d, prev=%s[%d])",
+                       threadin->name,
+                       next->pid,
+                       status,
+                       sigpending,
+                       prev->comm,
+                       prev->pid);
+           }
+        else if (!(next->ptrace & PT_PTRACED) &&
            /* Allow ptraced threads to run shortly in order to
               properly recover from a stopped state. */
            testbits(status,XNSTARTED) &&
-           testbits(status,XNTHREAD_BLOCK_BITS))
+           testbits(status,XNPEND))
            {
            show_stack(xnthread_user_task(threadin),NULL);
             xnpod_fatal("blocked thread %s[%d] rescheduled?! (status=0x%lx, sig=%d, 
prev=%s[%d])",


------------------------------------------------------------------------

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


--

Philippe.

Reply via email to