Module: xenomai-forge
Branch: next
Commit: 7f78bb0bf2b8474546acb6958fb5c06b782404dd
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=7f78bb0bf2b8474546acb6958fb5c06b782404dd

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Jul 31 14:29:34 2013 +0200

cobalt/thread: move non-critical cleanup code out of critical section

Since the thread cleanup code can only run on behalf of the root
domain, and only from the exiting context, we may do a lot of
housekeeping locklessly.

Remove those fully private cleanups from the nklocked section, which
should help reducing the overall latency upon thread exit.

---

 include/cobalt/kernel/thread.h |    2 +-
 kernel/cobalt/pod.c            |   31 ++++++++++++++++---------------
 kernel/cobalt/shadow.c         |    2 +-
 kernel/cobalt/thread.c         |    4 +---
 4 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h
index 28b4296..191c24e 100644
--- a/include/cobalt/kernel/thread.h
+++ b/include/cobalt/kernel/thread.h
@@ -324,7 +324,7 @@ void xnthread_init_shadow_tcb(struct xnthread *thread,
 
 void xnthread_init_root_tcb(struct xnthread *thread);
 
-void xnthread_cleanup(struct xnthread *thread);
+void xnthread_deregister(struct xnthread *thread);
 
 char *xnthread_format_status(unsigned long status, char *buf, int size);
 
diff --git a/kernel/cobalt/pod.c b/kernel/cobalt/pod.c
index 3fd270d..5d911af 100644
--- a/kernel/cobalt/pod.c
+++ b/kernel/cobalt/pod.c
@@ -654,9 +654,6 @@ static inline void cleanup_thread(struct xnthread *thread) 
/* nklock held, irqs
 {
        struct xnsched *sched = thread->sched;
 
-       trace_mark(xn_nucleus, thread_cleanup, "thread %p thread_name %s",
-                  thread, xnthread_name(thread));
-
        list_del(&thread->glink);
        nkpod->nrthreads--;
        xnvfile_touch_tag(&nkpod->threadlist_tag);
@@ -667,16 +664,8 @@ static inline void cleanup_thread(struct xnthread *thread) 
/* nklock held, irqs
                xnthread_clear_state(thread, XNREADY);
        }
 
-       xntimer_destroy(&thread->rtimer);
-       xntimer_destroy(&thread->ptimer);
-       xntimer_destroy(&thread->rrbtimer);
        thread->idtag = 0;
 
-       if (thread->selector) {
-               xnselector_destroy(thread->selector);
-               thread->selector = NULL;
-       }
-
        if (xnthread_test_state(thread, XNPEND))
                xnsynch_forget_sleeper(thread);
 
@@ -695,12 +684,9 @@ static inline void cleanup_thread(struct xnthread *thread) 
/* nklock held, irqs
                return;
 
        xnsched_forget(thread);
-       xnthread_cleanup(thread);
+       xnthread_deregister(thread);
        /* Finalize last since this incurs releasing the TCB. */
        xnshadow_finalize(thread);
-
-       if (xnthread_test_state(sched->curr, XNROOT))
-               xnfreesync();
 }
 
 void __xnpod_cleanup_thread(struct xnthread *thread)
@@ -708,9 +694,24 @@ void __xnpod_cleanup_thread(struct xnthread *thread)
        spl_t s;
 
        XENO_BUGON(NUCLEUS, !ipipe_root_p);
+
+       trace_mark(xn_nucleus, thread_cleanup, "thread %p thread_name %s",
+                  thread, xnthread_name(thread));
+
+       xntimer_destroy(&thread->rtimer);
+       xntimer_destroy(&thread->ptimer);
+       xntimer_destroy(&thread->rrbtimer);
+
+       if (thread->selector) {
+               xnselector_destroy(thread->selector);
+               thread->selector = NULL;
+       }
+
        xnlock_get_irqsave(&nklock, s);
        cleanup_thread(thread);
+       xnfreesync();
        xnlock_put_irqrestore(&nklock, s);
+
        wake_up(&nkjoinq);
 }
 
diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index 11776ec..4d0b761 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -1025,7 +1025,7 @@ void xnshadow_finalize(struct xnthread *thread)
 {
        struct xnsys_ppd *sys_ppd;
 
-       trace_mark(xn_nucleus, shadow_unmap,
+       trace_mark(xn_nucleus, shadow_finalize,
                   "thread %p thread_name %s pid %d",
                   thread, xnthread_name(thread), xnthread_host_pid(thread));
 
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 5d268a2..4e0ae56 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -229,10 +229,8 @@ void xnthread_init_root_tcb(struct xnthread *thread)
        xnarch_init_root_tcb(tcb);
 }
 
-void xnthread_cleanup(struct xnthread *thread)
+void xnthread_deregister(struct xnthread *thread)
 {
-       /* Does not wreck the TCB, only releases the held resources. */
-
        if (thread->registry.handle != XN_NO_HANDLE)
                xnregistry_remove(thread->registry.handle);
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to