qemu-arm-static bug in signal handling causes mono and java to hang

Bug #1319100 reported by manut
12
This bug affects 2 people
Affects Status Importance Assigned to Milestone
QEMU
Fix Released
Undecided
Unassigned
qemu-kvm (Debian)
Fix Released
Unknown
qemu-kvm (Ubuntu)
Fix Released
Wishlist
Unassigned

Bug Description

Note, this bug is already reported to debian, but it seems to also affect the upstream code.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=748043

running mono in a chroot environment with qemu-user-static is not posible
because at least one signal used during termination of mono is routed to the
host.

This can be reproduced by:
debootstrap --include=mono-runtime --foreign --arch=armel "wheezy" "mono-test" "http://ftp.de.debian.org//debian"
cp /usr/bin/qemu-arm-static mono-test/usr/bin
mount -t proc none mono-test/proc
mount -o bind /dev mono-test/dev
mount -o bind /sys mono-test/sys
chroot mono-test
../debootstrap/debootstrap --second-stage
exit
mount -t proc none mono-test/proc
mount -o bind /sys mono-test/sys
chroot mono-test
QEMU_STRACE=1 /usr/bin/mono /usr/lib/mono/4.0/gacutil.exe

This will block on a futex:

--8<--
18663 sched_yield(0,0,2582980,0,0,2582928) = 0
18663 clock_gettime(1,-150996384,2,1,2585016,2585600) = 0
18663 tgkill(18663,18664,30,18664,30,-161951744) = 0
18663 futex(0x00293774,FUTEX_PRIVATE_FLAG|FUTEX_WAIT,0,NULL,NULL,0)
--8<--

If you use mono within strace on a native x86 box you can see, that signals
between threads are used during termination:

strace -f -o log.txt /usr/bin/mono /usr/lib/mono/4.0/gacutil.exe

--8<--
14075 sched_yield() = 0
14075 tgkill(14075, 14083, SIGPWR) = 0
14075 futex(0x983f00, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
14083 <... futex resumed> ) = ? ERESTARTSYS (To be restarted)
14083 --- SIGPWR (Power failure) @ 0 (0) ---
14083 futex(0x983f00, FUTEX_WAKE_PRIVATE, 1) = 1
14075 <... futex resumed> ) = 0
14083 rt_sigsuspend(~[INT QUIT ABRT TERM XCPU RTMIN RT_1] <unfinished ...>
14075 futex(0x94d9a4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x94da20, 24) = 3
14078 <... futex resumed> ) = 0
14078 futex(0x94da20, FUTEX_WAKE_PRIVATE, 1) = 1
14077 <... futex resumed> ) = 0
14075 futex(0x94d9a4, FUTEX_CMP_REQUEUE_PRIVATE, 1, 2147483647, 0x94da20, 26 <unfinished ...>
--8<--

This also blocks the installation of libnunit2.6-cil within a armel chroot,
because it uses mono in its postinst script.
E.g. (/usr/bin/mono /usr/share/mono/MonoGetAssemblyName.exe /usr/lib/cli/nunit.core-2.6/nunit.core.dll)

Obviously the same as described in:
http://lists.opensuse.org/opensuse-arm/2011-12/msg00000.html
is happening here.

There is an openSuSE patch against qemu:
https://build.opensuse.org/package/view_file/Virtualization:Qemu/qemu/0002-XXX-work-around-SA_RESTART-race-wit.patch?expand=1

This patch also applies against qemu from backports-wheezy and resolves this
issue.

As it seems, that this issue is not Debian specific i will also report it to
the qemu project and reference this bug report.

Tags: trusty
Revision history for this message
Peter Maydell (pmaydell) wrote : Re: [Qemu-devel] [Bug 1319100] [NEW] qemu-arm-static bug in signal handling avoids using mono

On 13 May 2014 16:56, manut <email address hidden> wrote:
> running mono in a chroot environment with qemu-user-static is not posible
> because at least one signal used during termination of mono is routed to the
> host.
>
> This can be reproduced by:
> debootstrap --include=mono-runtime --foreign --arch=armel "wheezy" "mono-test" "http://ftp.de.debian.org//debian"
> cp /usr/bin/qemu-arm-static mono-test/usr/bin
> mount -t proc none mono-test/proc
> mount -o bind /dev mono-test/dev
> mount -o bind /sys mono-test/sys
> chroot mono-test
> ../debootstrap/debootstrap --second-stage
> exit
> mount -t proc none mono-test/proc
> mount -o bind /sys mono-test/sys
> chroot mono-test
> QEMU_STRACE=1 /usr/bin/mono /usr/lib/mono/4.0/gacutil.exe
>
> This will block on a futex:
>
> --8<--
> 18663 sched_yield(0,0,2582980,0,0,2582928) = 0
> 18663 clock_gettime(1,-150996384,2,1,2585016,2585600) = 0
> 18663 tgkill(18663,18664,30,18664,30,-161951744) = 0
> 18663 futex(0x00293774,FUTEX_PRIVATE_FLAG|FUTEX_WAIT,0,NULL,NULL,0)
> --8<--
>
> If you use mono within strace on a native x86 box you can see, that signals
> between threads are used during termination:

Multithreaded guest process are unreliable under qemu
linux-user mode anyway, even ignoring the signal handling
related races here.

See also:
https://bugs.launchpad.net/qemu/+bug/955379

> There is an openSuSE patch against qemu:
> https://build.opensuse.org/package/view_file/Virtualization:Qemu/qemu/0002-XXX-work-around-SA_RESTART-race-wit.patch?expand=1

This patch is a very hacky bandaid papering over the
real problem. It is not suitable for upstream (and
personally I wouldn't ship it in a distro either :-)).

thanks
-- PMM

tags: added: trusty
Revision history for this message
Launchpad Janitor (janitor) wrote : Re: qemu-arm-static bug in signal handling avoids using mono

Status changed to 'Confirmed' because the bug affects multiple users.

affects: qemu → qemu-kvm (Ubuntu)
Changed in qemu-kvm (Ubuntu):
status: New → Confirmed
Changed in qemu-kvm (Debian):
status: Unknown → Confirmed
Changed in qemu-kvm (Ubuntu):
status: New → Confirmed
importance: Undecided → Wishlist
Revision history for this message
Lucy Llewellyn (lucyllewy) wrote :

also causes problems with java.

summary: - qemu-arm-static bug in signal handling avoids using mono
+ qemu-arm-static bug in signal handling causes mono to hang
summary: - qemu-arm-static bug in signal handling causes mono to hang
+ qemu-arm-static bug in signal handling causes mono and java to hang
Revision history for this message
Peter Maydell (pmaydell) wrote :

Recent changes to QEMU's handling of signals fix this hang trying to run mono under QEMU; they should be out in QEMU 2.7.

Changed in qemu:
status: New → Fix Committed
Revision history for this message
Chris L (oddessy-1) wrote :

Did this fix end up making it into QEMU 2.7?

Revision history for this message
Peter Maydell (pmaydell) wrote :

Yes it did.

Changed in qemu:
status: Fix Committed → Fix Released
Changed in qemu-kvm (Debian):
status: Confirmed → Fix Released
Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

Fixed in 2.7 and thereby >=Zesty

Changed in qemu-kvm (Ubuntu):
status: Confirmed → Fix Released
Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

I can't guess very well how important this would be for an SRU (or not), leaving that up for user feedback to be decided.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.