From: "Kirill A. Shutemov" <k.shutemov@velesys.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] qemu-user mmap not thread-safe?
Date: Wed, 20 Jun 2007 12:32:04 +0300 [thread overview]
Message-ID: <20070620093204.GA15103@localhost.localdomain> (raw)
In-Reply-To: <4677E260.2080002@suse.de>
[-- Attachment #1.1: Type: text/plain, Size: 1126 bytes --]
On [Tue, 19.06.2007 16:03], Alexander Graf wrote:
> Paul Brook wrote:
> > On Thursday 24 May 2007, Alexander Graf wrote:
> >
> >> Hi,
> >>
> >> while playing around with TLS on i386 i came across this problem which
> >> occurs even when no TLS is used at all. If two threads just malloc()
> >> memory all the time I get a segmentation fault after a short time. Might
> >> this be a serious bug?
> >>
> >
> > qemu is not even vaguely threadsafe.
> >
> > Paul
> >
> >
> >
> Hi,
>
> I somehow narrowed the problem down to x86_64. As soon as I use
> qemu-i386 on i386 or ppc the memory mapping tables are OK. When using
> x86_64 as host they are broken. Could this be a generic 64-bit host
> problem? I doubt that this actually has to do too much with the
> threading itself, because it works fine on other platforms.
On x86_64 mmap() sometimes return address above 4G. It is problem if target
system is 32-bit. I use attached patch to solve it.
--
Regards, Kirill A. Shutemov
+ Belarus, Minsk
+ Velesys LLC, http://www.velesys.com/
+ ALT Linux Team, http://www.altlinux.com/
[-- Attachment #1.2: qemu-0.8.2-alt-mmap.patch --]
[-- Type: text/plain, Size: 2442 bytes --]
diff -uNr qemu-0.8.2.orig/linux-user/mmap.c qemu-0.8.2/linux-user/mmap.c
--- qemu-0.8.2.orig/linux-user/mmap.c 2007-01-16 16:05:33 +0200
+++ qemu-0.8.2/linux-user/mmap.c 2007-01-16 16:27:28 +0200
@@ -27,6 +27,10 @@
#include "qemu.h"
+#if !defined(MAP_32BIT)
+#define MAP_32BIT 0
+#endif
+
//#define DEBUG_MMAP
/* NOTE: all the constants are the HOST ones, but addresses are target. */
@@ -116,7 +120,7 @@
if (prot1 == 0) {
/* no page was there, so we allocate one */
ret = (long)mmap(host_start, qemu_host_page_size, prot,
- flags | MAP_ANONYMOUS, -1, 0);
+ flags | MAP_ANONYMOUS | MAP_32BIT, -1, 0);
if (ret == -1)
return ret;
prot1 = prot;
@@ -217,7 +221,8 @@
abort();
host_len = HOST_PAGE_ALIGN(len) + qemu_host_page_size - TARGET_PAGE_SIZE;
real_start = (long)mmap(g2h(real_start), host_len, PROT_NONE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT
+ , -1, 0);
if (real_start == -1)
return real_start;
real_end = real_start + host_len;
@@ -234,7 +239,7 @@
host_offset = offset & qemu_host_page_mask;
host_len = len + offset - host_offset;
host_start = (long)mmap(real_start ? g2h(real_start) : NULL,
- host_len, prot, flags, fd, host_offset);
+ host_len, prot, flags | MAP_32BIT, fd, host_offset);
if (host_start == -1)
return host_start;
/* update start so that it points to the file position at 'offset' */
@@ -312,7 +317,7 @@
else
offset1 = offset + real_start - start;
ret = (long)mmap(g2h(real_start), real_end - real_start,
- prot, flags, fd, offset1);
+ prot, flags | MAP_32BIT, fd, offset1);
if (ret == -1)
return ret;
}
@@ -388,7 +393,7 @@
int prot;
/* XXX: use 5 args syscall */
- new_addr = (long)mremap(g2h(old_addr), old_size, new_size, flags);
+ new_addr = (long)mremap(g2h(old_addr), old_size, new_size, flags | MAP_32BIT);
if (new_addr == -1)
return new_addr;
new_addr = h2g(new_addr);
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
prev parent reply other threads:[~2007-06-20 9:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-24 15:00 [Qemu-devel] qemu-user mmap not thread-safe? Alexander Graf
2007-05-24 15:45 ` Paul Brook
2007-06-19 14:04 ` Alexander Graf
2007-06-20 9:32 ` Kirill A. Shutemov [this message]
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=20070620093204.GA15103@localhost.localdomain \
--to=k.shutemov@velesys.com \
--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.