Module: xenomai-head Branch: master Commit: ef290da5e838a66df7a04539d7a77a6b0b820936 URL: http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=ef290da5e838a66df7a04539d7a77a6b0b820936
Author: Jan Kiszka <[email protected]> Date: Sat Jun 18 15:49:50 2011 +0200 nucleus: Return from xnpod_suspend_thread(XNRELAX) with interrupt disabled This cleans up the special handling of XNRELAX in xnpod_suspend_thread a bit: Instead of re-enabling the interrupts when returning to a relaxed thread, move that code to xnshadow_relax. Saves some explanations. Signed-off-by: Jan Kiszka <[email protected]> --- ksrc/nucleus/pod.c | 9 +++------ ksrc/nucleus/shadow.c | 11 +++-------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/ksrc/nucleus/pod.c b/ksrc/nucleus/pod.c index a98d9b7..9f75092 100644 --- a/ksrc/nucleus/pod.c +++ b/ksrc/nucleus/pod.c @@ -1462,11 +1462,9 @@ void xnpod_suspend_thread(xnthread_t *thread, xnflags_t mask, * have been called from xnshadow_relax(), in which * case we introduce an opportunity for interrupt * delivery right before switching context, which - * shortens the uninterruptible code path. This - * particular caller expects us to always return with - * interrupts enabled. + * shortens the uninterruptible code path. * - * We have to shut irqs off around xnpod_schedule() + * We have to shut irqs off before xnpod_schedule() * though: if an interrupt could preempt us in * __xnpod_schedule right after the call to * xnarch_escalate but before we lock the nklock, we @@ -1478,9 +1476,8 @@ void xnpod_suspend_thread(xnthread_t *thread, xnflags_t mask, if (mask & XNRELAX) { xnlock_clear_irqon(&nklock); - splhigh(s); + splmax(); xnpod_schedule(); - splexit(s); return; } /* diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c index 2189d1a..9f82fa8 100644 --- a/ksrc/nucleus/shadow.c +++ b/ksrc/nucleus/shadow.c @@ -1094,20 +1094,15 @@ void xnshadow_relax(int notify, int reason) * xnpod_suspend_thread() when switching out the current * thread, not to break basic assumptions we do there. * - * We disable interrupts here to initiate the migration - * sequence, and let xnpod_suspend_thread() enable them back - * before returning to us. + * We disable interrupts during the migration sequence, but + * xnpod_suspend_thread() has an interrupts-on section built in. */ splmax(); rpi_push(thread->sched, thread); schedule_linux_call(LO_WAKEUP_REQ, current, 0); clear_task_nowakeup(current); xnpod_suspend_thread(thread, XNRELAX, XN_INFINITE, XN_RELATIVE, NULL); - /* - * As a special case when switching out a relaxed thread, - * interrupts have been re-enabled before returning to us. See - * xnpod_suspend_thread(). - */ + splnone(); if (XENO_DEBUG(NUCLEUS) && rthal_current_domain != rthal_root_domain) xnpod_fatal("xnshadow_relax() failed for thread %s[%d]", thread->name, xnthread_user_pid(thread)); _______________________________________________ Xenomai-git mailing list [email protected] https://mail.gna.org/listinfo/xenomai-git
