All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andreas K. Huettel" <dilfridge@gentoo.org>
To: qemu-devel@nongnu.org
Cc: Matthias Schiffer <mschiffer@universe-factory.net>,
	Alistair Francis <alistair.francis@wdc.com>,
	Laurent Vivier <laurent@vivier.eu>
Subject: Re: [PATCH] linux-user/signal: Map exit signals in SIGCHLD siginfo_t
Date: Sun, 19 Dec 2021 19:47:09 +0100	[thread overview]
Message-ID: <5523284.DvuYhMxLoT@pinacolada> (raw)
In-Reply-To: <87c9f71f-ed9d-03e4-9a0e-594b649525b5@vivier.eu>

[-- Attachment #1: Type: text/plain, Size: 3667 bytes --]

Well, the original fix 1c3dfb506ea3 did clearly improve things for me, but it wasn't
complete yet. At some point I gave up on finding a minimal reproducer for my remaining 
problems (futex-related hangs in a complex python+bash app).

So, this *may* be the missing piece.

Will test, but that takes a few days.

Andreas

Am Sonntag, 19. Dezember 2021, 16:55:16 CET schrieb Laurent Vivier:
> CC'ing Alistair and Andreas that were involved in original fix 1c3dfb506ea3 ("linux-user/signal: 
> Decode waitid si_code")
> 
> Thanks,
> Laurent
> 
> Le 23/10/2021 à 21:59, Matthias Schiffer a écrit :
> > When converting a siginfo_t from waitid(), the interpretation of si_status
> > depends on the value of si_code: For CLD_EXITED, it is an exit code and
> > should be copied verbatim. For other codes, it is a signal number
> > (possibly with additional high bits from ptrace) that should be mapped.
> > 
> > This code was previously changed in commit 1c3dfb506ea3
> > ("linux-user/signal: Decode waitid si_code"), but the fix was
> > incomplete.
> > 
> > Tested with the following test program:
> > 
> >      #include <stdio.h>
> >      #include <stdlib.h>
> >      #include <unistd.h>
> >      #include <sys/wait.h>
> > 
> >      int main() {
> >      	pid_t pid = fork();
> >      	if (pid == 0) {
> >      		exit(12);
> >      	} else {
> >      		siginfo_t siginfo = {};
> >      		waitid(P_PID, pid, &siginfo, WEXITED);
> >      		printf("Code: %d, status: %d\n", (int)siginfo.si_code, (int)siginfo.si_status);
> >      	}
> > 
> >      	pid = fork();
> >      	if (pid == 0) {
> >      		raise(SIGUSR2);
> >      	} else {
> >      		siginfo_t siginfo = {};
> >      		waitid(P_PID, pid, &siginfo, WEXITED);
> >      		printf("Code: %d, status: %d\n", (int)siginfo.si_code, (int)siginfo.si_status);
> >      	}
> >      }
> > 
> > Output with an x86_64 host and mips64el target before 1c3dfb506ea3
> > (incorrect: exit code 12 is translated like a signal):
> > 
> >      Code: 1, status: 17
> >      Code: 2, status: 17
> > 
> > After 1c3dfb506ea3 (incorrect: signal number is not translated):
> > 
> >      Code: 1, status: 12
> >      Code: 2, status: 12
> > 
> > With this patch:
> > 
> >      Code: 1, status: 12
> >      Code: 2, status: 17
> > 
> > Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
> > ---
> >   linux-user/signal.c | 7 ++++++-
> >   1 file changed, 6 insertions(+), 1 deletion(-)
> > 
> > diff --git a/linux-user/signal.c b/linux-user/signal.c
> > index 14d8fdfde152..8e3af98ec0a7 100644
> > --- a/linux-user/signal.c
> > +++ b/linux-user/signal.c
> > @@ -403,7 +403,12 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
> >           case TARGET_SIGCHLD:
> >               tinfo->_sifields._sigchld._pid = info->si_pid;
> >               tinfo->_sifields._sigchld._uid = info->si_uid;
> > -            tinfo->_sifields._sigchld._status = info->si_status;
> > +            if (si_code == CLD_EXITED)
> > +                tinfo->_sifields._sigchld._status = info->si_status;
> > +            else
> > +                tinfo->_sifields._sigchld._status
> > +                    = host_to_target_signal(info->si_status & 0x7f)
> > +                        | (info->si_status & ~0x7f);
> >               tinfo->_sifields._sigchld._utime = info->si_utime;
> >               tinfo->_sifields._sigchld._stime = info->si_stime;
> >               si_type = QEMU_SI_CHLD;
> > 
> 
> 
> 


-- 
Andreas K. Hüttel
dilfridge@gentoo.org
Gentoo Linux developer
(council, toolchain, base-system, perl, libreoffice)

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

  reply	other threads:[~2021-12-19 18:48 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-23 19:59 [PATCH] linux-user/signal: Map exit signals in SIGCHLD siginfo_t Matthias Schiffer
2021-12-18 23:32 ` Matthias Schiffer
2022-01-02 23:59   ` Andreas K. Huettel
2021-12-19 15:55 ` Laurent Vivier
2021-12-19 18:47   ` Andreas K. Huettel [this message]
2022-01-04 11:49 ` Laurent Vivier
2022-01-05 10:18 ` Laurent Vivier

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=5523284.DvuYhMxLoT@pinacolada \
    --to=dilfridge@gentoo.org \
    --cc=alistair.francis@wdc.com \
    --cc=laurent@vivier.eu \
    --cc=mschiffer@universe-factory.net \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.