On Wed, 2021-07-07 at 22:16 +0200, Jan Kiszka via Xenomai wrote:
> From: Jan Kiszka <[email protected]>
> 
> Setting XNDBGCTRL for a thread will prevent its migration to secondary
> if only the debugging signals SIGINT or SIGSTOP are pending. Such
> threads will still be able to trigger migration on other signals, such
> as SIGDEBUG (watchdog), SIGCANCEL (SIGRTMIN) or synchronous SIGTRAP.
> 
> This is a building block for the debug helper feature.
> 
> Signed-off-by: Jan Kiszka <[email protected]>
> ---
>  include/cobalt/uapi/kernel/thread.h |  1 +
>  kernel/cobalt/posix/syscall.c       | 12 +++++++++++-
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/include/cobalt/uapi/kernel/thread.h 
> b/include/cobalt/uapi/kernel/thread.h
> index 664def08ef..74007ac0d6 100644
> --- a/include/cobalt/uapi/kernel/thread.h
> +++ b/include/cobalt/uapi/kernel/thread.h
> @@ -51,6 +51,7 @@
>  #define XNTRAPLB  0x00100000 /**< Trap lock break (i.e. may not sleep with 
> sched lock) */
>  #define XNDEBUG   0x00200000 /**< User-level debugging enabled */
>  #define XNDBGSTOP 0x00400000 /**< Stopped for synchronous debugging */
> +#define XNDBGCTRL 0x00800000 /**< Thread is protected against SIGSTOP/SIGINT 
> */
>  
> 
> 
> 
>  /** @} */
>  
> 
> 
> 
> diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
> index cd72b22d14..618f965c2a 100644
> --- a/kernel/cobalt/posix/syscall.c
> +++ b/kernel/cobalt/posix/syscall.c
> @@ -86,6 +86,8 @@ static void prepare_for_signal(struct task_struct *p,
>                              struct pt_regs *regs,
>                              int sysflags)
>  {
> +     sigset_t pending;
> +     int ignore = 0;

Why not bool?

>       int notify = 0;
>       spl_t s;
>  
> 
> 
> 
> @@ -100,13 +102,21 @@ static void prepare_for_signal(struct task_struct *p,
>                       xnthread_clear_info(thread, XNBREAK);
>               }
>               xnthread_clear_info(thread, XNKICKED);
> +     } else if (xnthread_test_state(thread, XNDBGCTRL)) {
> +             /* only ignore thread-specific SIGSTOP/SIGINT */
> +             pending = p->pending.signal;
> +             sigdelset(&pending, SIGSTOP);
> +             sigdelset(&pending, SIGINT);
> +             if (sigisemptyset(&pending))
> +                     ignore = 1;
>       }
>  
> 
> 
> 
>       xnlock_put_irqrestore(&nklock, s);
>  
> 
> 
> 
>       xnthread_test_cancel();
>  
> 
> 
> 
> -     xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
> +     if (!ignore)
> +             xnthread_relax(notify, SIGDEBUG_MIGRATE_SIGNAL);
>  }
>  
> 
> 
> 
>  static COBALT_SYSCALL(migrate, current, (int domain))

Reply via email to