75a96ee029
- Remove deprecated patch "work-around-SA_RESTART-race" (boo#982208) - Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.6 * Patches dropped: 0002-XXX-work-around-SA_RESTART-race-wit.patch 0003-qemu-0.9.0.cvs-binfmt.patch 0004-qemu-cvs-alsa_bitfield.patch 0005-qemu-cvs-alsa_ioctl.patch 0006-qemu-cvs-alsa_mmap.patch 0007-qemu-cvs-gettimeofday.patch 0008-qemu-cvs-ioctl_debug.patch 0009-qemu-cvs-ioctl_nodirection.patch 0010-block-vmdk-Support-creation-of-SCSI.patch 0011-linux-user-add-binfmt-wrapper-for-a.patch 0012-PPC-KVM-Disable-mmu-notifier-check.patch 0013-linux-user-fix-segfault-deadlock.patch 0014-linux-user-binfmt-support-host-bina.patch 0015-linux-user-Ignore-broken-loop-ioctl.patch 0016-linux-user-lock-tcg.patch 0017-linux-user-Run-multi-threaded-code-.patch 0018-linux-user-lock-tb-flushing-too.patch 0019-linux-user-Fake-proc-cpuinfo.patch 0020-linux-user-implement-FS_IOC_GETFLAG.patch 0021-linux-user-implement-FS_IOC_SETFLAG.patch 0022-linux-user-XXX-disable-fiemap.patch 0023-slirp-nooutgoing.patch 0024-vnc-password-file-and-incoming-conn.patch 0025-linux-user-add-more-blk-ioctls.patch 0026-linux-user-use-target_ulong.patch 0027-block-Add-support-for-DictZip-enabl.patch 0028-block-Add-tar-container-format.patch OBS-URL: https://build.opensuse.org/request/show/408549 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=305
43 lines
1.6 KiB
Diff
43 lines
1.6 KiB
Diff
From 6b4338150763e8241cec19846a48a132d60fe75f Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Fri, 13 Jan 2012 17:05:41 +0100
|
|
Subject: [PATCH] linux-user: fix segfault deadlock
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When entering the guest we take a lock to ensure that nobody else messes
|
|
with our TB chaining while we're doing it. If we get a segfault inside that
|
|
code, we manage to work on, but will not unlock the lock.
|
|
|
|
This patch forces unlocking of that lock in the segv handler. I'm not sure
|
|
this is the right approach though. Maybe we should rather make sure we don't
|
|
segfault in the code? I would greatly appreciate someone more intelligible
|
|
than me to look at this :).
|
|
|
|
Example code to trigger this is at: http://csgraf.de/tmp/conftest.c
|
|
|
|
Reported-by: Fabio Erculiani <lxnay@sabayon.org>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
[AF: Drop spinlock_safe_unlock() and switch to tb_lock_reset() (bonzini)]
|
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
---
|
|
user-exec.c | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/user-exec.c b/user-exec.c
|
|
index d8d597b..f8b7752 100644
|
|
--- a/user-exec.c
|
|
+++ b/user-exec.c
|
|
@@ -94,6 +94,10 @@ static inline int handle_cpu_signal(uintptr_t pc, unsigned long address,
|
|
printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n",
|
|
pc, address, is_write, *(unsigned long *)old_set);
|
|
#endif
|
|
+
|
|
+ /* Maybe we're still holding the TB fiddling lock? */
|
|
+ tb_lock_reset();
|
|
+
|
|
/* XXX: locking issue */
|
|
if (is_write && h2g_valid(address)
|
|
&& page_unprotect(h2g(address), pc, puc)) {
|