On 06/21/2015 07:53 PM, Jan Kiszka wrote:
> On 2015-06-20 20:15, Philippe Gerum wrote:
>> On 06/20/2015 04:34 PM, Jan Kiszka wrote:
>>> Hi Philippe,
>>>
>>> the mayday mechanism is causing troubles to me again.
>>>
>>> First of all, there is a bug /wrt restarting the mayday syscall. We
>>> current don't restart on pending signals, thus destroy the register of
>>> the interrupted thread that contains the syscall return code. See my
>>> for-forge branch for a fix proposal.
>>>
>>> But actually I would like to get rid of the syscall trampoline
>>> completely if somehow possible, at least for certain archs. The reason
>>> is that it ruins debuggability. If a RT thread is stopped by gdb with
>>> the help of the mayday mechanism, it ends up waiting for resumption on
>>> the mayday page. Even worse, backtracing is broken, at least on x86.
>>>
>>> That brings me to the key question: why do we need the syscall
>>> trampoline? We set TIP_MAYDAY in the target task, the task causes
>>> IPIPE_TRAP_MAYDAY to be reported via the trap hook, the hook sets the
>>> trampoline code, the trampoline triggers the syscall, and only on
>>> syscall return, we finally migrate the task to Linux. What prevents
>>> doing the migration already in the trap hook, ie. in
>>> handle_mayday_event? The pattern seems similar to the migration we
>>> trigger on userspace faults. And it seems to works, at least for x86,
>>> and doesn't have the unwanted side effects.
>>>
>>> The background of this work is improving gdb support, in particular
>>> deterministic stopping and resuming of multi-threaded RT processes. I'm
>>> still in the design & prototype phase, RFC patches will follow later.
>>>
>>
>> Ok. The proposed design has to cover the basic case solved by the mayday
>> mechanism, i.e. a runaway thread spinning into a syscall-less loop.
>>
>> e.g. it should be able to switch such code back to secondary mode:
>>
>>      for (;;) ;
>>
> 
> Related smokey test case passes, both on x86 and ARM. Other archs need
> to be checked carefully, though. I've pushed a commit that radically
> removes everything, but essentially does this:
> 
> diff --git a/kernel/cobalt/posix/process.c b/kernel/cobalt/posix/process.c
> index 6110da6..85e9144 100644
> --- a/kernel/cobalt/posix/process.c
> +++ b/kernel/cobalt/posix/process.c
> @@ -762,16 +761,9 @@ static inline int handle_exception(struct 
> ipipe_trap_data *d)
>  
>  static int handle_mayday_event(struct pt_regs *regs)
>  {
> -     struct xnthread *thread = xnthread_current();
> -     struct xnarchtcb *tcb = xnthread_archtcb(thread);
> -     struct cobalt_ppd *sys_ppd;
> -
> -     XENO_BUG_ON(COBALT, !xnthread_test_state(thread, XNUSER));
> +     XENO_BUG_ON(COBALT, !xnthread_test_state(xnthread_current(), XNUSER));
>  
> -     /* We enter the mayday handler with hw IRQs off. */
> -     sys_ppd = cobalt_ppd_get(0);
> -
> -     xnarch_handle_mayday(tcb, regs, sys_ppd->mayday_tramp);
> +     xnthread_relax(0, 0);
>  
>       return KEVENT_PROPAGATE;
>  }
> 
> 
> Could you check this on the other archs?
> 

I'll check on bfin and ppc. We won't release nios2 and sh support for
3.0 eventually.

-- 
Philippe.

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

Reply via email to