From: Warner Losh <imp@bsdimp.com>
To: Ilya Leoshkevich <iii@linux.ibm.com>
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
"Riku Voipio" <riku.voipio@iki.fi>,
"Laurent Vivier" <laurent@vivier.eu>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Kyle Evans" <kevans@freebsd.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
qemu-devel@nongnu.org
Subject: Re: [PATCH 4/8] user: Introduce host_interrupt_signal
Date: Tue, 5 Nov 2024 16:53:25 -0700 [thread overview]
Message-ID: <CANCZdfrTQ7tnqiDTBsvbexg180H6u71Ec67JQobYyATpSD4_3A@mail.gmail.com> (raw)
In-Reply-To: <9a11ba28e4979c10152d3d696ab31b23e8bbf27a.camel@linux.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 4344 bytes --]
On Tue, Nov 5, 2024 at 3:49 PM Ilya Leoshkevich <iii@linux.ibm.com> wrote:
> On Tue, 2024-11-05 at 22:30 +0000, Richard Henderson wrote:
> > On 11/5/24 15:50, Ilya Leoshkevich wrote:
> > > On Tue, 2024-11-05 at 08:39 -0700, Warner Losh wrote:
> > > > On Thu, Oct 24, 2024 at 2:00 PM Ilya Leoshkevich
> > > > <iii@linux.ibm.com>
> > > > wrote:
> > > > > Attaching to the gdbstub of a running process requires stopping
> > > > > its
> > > > > threads. For threads that run on a CPU, cpu_exit() is enough,
> > > > > but
> > > > > the
> > > > > only way to grab attention of a thread that is stuck in a long-
> > > > > running
> > > > > syscall is to interrupt it with a signal.
> > > > >
> > > > > Reserve a host realtime signal for this, just like it's already
> > > > > done
> > > > > for TARGET_SIGABRT on Linux. This may reduce the number of
> > > > > available
> > > > > guest realtime signals by one, but this is acceptable, since
> > > > > there
> > > > > are
> > > > > quite a lot of them, and it's unlikely that there are apps that
> > > > > need
> > > > > them all.
> > > > >
> > > > > Set signal_pending for the safe_sycall machinery to prevent
> > > > > invoking
> > > > > the syscall. This is a lie, since we don't queue a guest
> > > > > signal,
> > > > > but
> > > > > process_pending_signals() can handle the absence of pending
> > > > > signals.
> > > > > The syscall returns with QEMU_ERESTARTSYS errno, which arranges
> > > > > for
> > > > > the automatic restart. This is important, because it helps
> > > > > avoiding
> > > > > disturbing poorly written guests.
> > > > >
> > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> > > > > ---
> > > > > bsd-user/signal.c | 12 ++++++++++++
> > > > > include/user/signal.h | 2 ++
> > > > > linux-user/signal.c | 11 +++++++++++
> > > > > 3 files changed, 25 insertions(+)
> > > > >
> > > > > diff --git a/bsd-user/signal.c b/bsd-user/signal.c
> > > > > index a2b11a97131..992736df5c5 100644
> > > > > --- a/bsd-user/signal.c
> > > > > +++ b/bsd-user/signal.c
> > > > > @@ -49,6 +49,8 @@ static inline int sas_ss_flags(TaskState *ts,
> > > > > unsigned long sp)
> > > > > on_sig_stack(ts, sp) ? SS_ONSTACK : 0;
> > > > > }
> > > > >
> > > > > +int host_interrupt_signal = SIGRTMAX;
> > > > > +
> > > > >
> > > >
> > > >
> > > > I'd be tempted to use SIGRTMAX + 1 or even TARGET_NSIG. 127 or
> > > > 128
> > > > would
> > > > work and not overflow any arrays (or hit any bounds tests) I'd
> > > > likely
> > > > use SIGRTMAX + 1,
> > > > though, since it avoids any edge-cases from sig == NSIG that
> > > > might be
> > > > in the code
> > > > unnoticed.
> > > >
> > > > Now, having said that, I don't think that there's too many (any?)
> > > > programs we need
> > > > to run as bsd-user that have real-time signals, much less one
> > > > that
> > > > uses SIGRTMAX,
> > > > but stranger things have happened. But it is a little wiggle room
> > > > just in case.
> > > >
> > > > Other than that:
> > > >
> > > > Reviewed-by: Warner Losh <imp@bsdimp.com>
> > >
> > > Thanks for the suggestion, I'll use SIGRTMAX + 1 in v2.
> >
> >
> > That can't be right -- SIGRTMAX+1 is not a valid signal.
> >
> >
> > r~
>
> I have to admit I didn't look into this too deeply, but I ran the
> following experiment on a FreeBSD 14.1 box:
>
> /usr/include $ grep -R SIGRTMAX .
> ./sys/signal.h:#define SIGRTMAX 126
>
> $ sleep 100 &
> $ kill -126 %1
> [1] Unknown signal: 126 sleep 100
>
> $ sleep 100 &
> $ kill -127 %1
> [1] + Unknown signal: 0 sleep 100
>
> Clearly, something is wrong - at least with the shell - but at the
> same time the signal delivery seems to have occurred.
>
> Warner, does the above look normal to you?
>
Oh! I understand.... I thought there was a gap above SIGRTMAX. It
sure looks like there is. However, 0177 (127) is used to signal that
the process is STOPPED, so can't be used. This is why SIGRTMAX
is 126 and not 127. There's room in sigset_t, but that's not sufficient.
And it has to be an actual signal we send, not just a flag.
So forget I said anything. This was a silly idea. If we find any real thing
that's using SIGRTMAX, we'll cope.
Warner
[-- Attachment #2: Type: text/html, Size: 6204 bytes --]
next prev parent reply other threads:[~2024-11-05 23:53 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-24 19:59 [PATCH 0/8] gdbstub: Allow late attachment Ilya Leoshkevich
2024-10-24 19:59 ` [PATCH 1/8] gdbstub: Allow the %d placeholder in the socket path Ilya Leoshkevich
2024-11-05 14:41 ` Richard Henderson
2024-11-05 15:04 ` Warner Losh
2024-10-24 19:59 ` [PATCH 2/8] gdbstub: Try unlinking the unix socket before binding Ilya Leoshkevich
2024-10-24 19:59 ` [PATCH 3/8] user: Introduce user/signal.h Ilya Leoshkevich
2024-11-05 14:43 ` Richard Henderson
2024-11-05 15:05 ` Warner Losh
2024-10-24 19:59 ` [PATCH 4/8] user: Introduce host_interrupt_signal Ilya Leoshkevich
2024-11-05 14:45 ` Richard Henderson
2024-11-05 15:39 ` Warner Losh
2024-11-05 15:50 ` Ilya Leoshkevich
2024-11-05 22:30 ` Richard Henderson
2024-11-05 22:48 ` Ilya Leoshkevich
2024-11-05 23:53 ` Warner Losh [this message]
2024-10-24 19:59 ` [PATCH 5/8] osdep: Introduce qemu_kill_thread() Ilya Leoshkevich
2024-11-05 14:49 ` Richard Henderson
2024-11-05 15:42 ` Warner Losh
2024-10-24 19:59 ` [PATCH 6/8] gdbstub: Allow late attachment Ilya Leoshkevich
2024-10-24 19:59 ` [PATCH 7/8] docs/user: Document the %d placeholder and suspend=n QEMU_GDB features Ilya Leoshkevich
2024-10-24 19:59 ` [PATCH 8/8] tests/tcg: Add late gdbstub attach test Ilya Leoshkevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CANCZdfrTQ7tnqiDTBsvbexg180H6u71Ec67JQobYyATpSD4_3A@mail.gmail.com \
--to=imp@bsdimp.com \
--cc=iii@linux.ibm.com \
--cc=kevans@freebsd.org \
--cc=laurent@vivier.eu \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=riku.voipio@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).