Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 8 Sep 2004 21:40:29 -0400
From:      Brian Fundakowski Feldman <green@freebsd.org>
To:        David Xu <davidxu@freebsd.org>
Cc:        threads@freebsd.org
Subject:   Re: [mistry.7@osu.edu: Re: FreeBSD and wine mmap]
Message-ID:  <20040909014029.GL928@green.homeunix.org>
In-Reply-To: <413FB291.7060501@freebsd.org>
References:  <20040908174941.GF928@green.homeunix.org> <413FB291.7060501@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Sep 09, 2004 at 09:32:01AM +0800, David Xu wrote:
> Brian Fundakowski Feldman wrote:
> 
> >I don't think that any allocated "red zones" should be left empty --
> >they should be explicitly allocated with no protection so that actually
> >free memory space can be explicitly searched for.  Comments?
> >
> >----- Forwarded message from Anish Mistry <mistry.7@osu.edu> -----
> >
> >From: Anish Mistry <mistry.7@osu.edu>
> >To: Brian Fundakowski Feldman <green@freebsd.org>
> >Subject: Re: FreeBSD and wine mmap
> >Date: Sun, 5 Sep 2004 13:15:15 -0400
> >Cc: freebsd-current@freebsd.org
> >
> >On Sunday 29 August 2004 12:59 am, you wrote:
> >
> >>On Tue, Aug 10, 2004 at 01:53:14PM -0400, Anish Mistry wrote:
> >>
> >>>-----BEGIN PGP SIGNED MESSAGE-----
> >>>Hash: SHA1
> >>>
> >>>On Wednesday 04 August 2004 06:39 pm, you wrote:
> >>>
> >>>>On Wed, Aug 04, 2004 at 06:28:02PM -0400, Anish Mistry wrote:
> >>>>
> >>>>>Ok, so we need something like vm_map_findspace(), but for
> >
> >process
> >
> >>>>>address mapping?  ie. pmap_findspace() that will return an
> >
> >address to
> >
> >>>>>a large enough free chunk?
> >>>>
> >>>>That's a good start, just to get something to work with. How this
> >
> >fits
> >
> >>>>in with the vm code and whether it is ultimately suitable in the
> >
> >long
> >
> >>>>run is probably up to Alan Cox. For now, just get something that
> >
> >(a)
> >
> >>>>doesn't break anything else; and (b) lets Wine behave the way it
> >
> >needs
> >
> >>>>to.
> >>>>
> >>>>AFAIK, there are still pthread issues with Wine, but those can't
> >
> >be
> >
> >>>>addressed until the mmap issue has a work-around.
> >>>
> >>>I've got a small patch that gets by the initial problem about not
> >
> >being
> >
> >>>to mmap the memory for the libraries, but the addresses that are
> >
> >mmap'ed
> >
> >>>seem to seem to overlap with memory that the current pthread
> >>>implementation want to mmap for the "red zone" when wine tries to
> >
> >create
> >
> >>>a thread.  It can't mmap the "red zone" addresses since all those
> >
> >address
> >
> >>>mapping where gobbled up before the thread launched.
> >>>I'll try to figure out a way to maybe leave a space for the "red
> >
> >zone"
> >
> >>>and see if that works.
> >>>Someone who actually knows what they are doing should probably take
> >
> >a
> >
> >>>look.
> >>
> >>The red pages are implemented by leaving the memory space unallocated;
> >>I don't like that one bit -- this will cause those spaces to be
> >
> >allocated
> >
> >>but given no protection, which should provide the crash feature that
> >
> >the
> >
> >>guard pages are there for, but be less bogus (and it doesn't use more
> >>"memory," but it will use a few more vm_map_entrys.
> >>
> >>Index: lib/libpthread/thread/thr_stack.c
> >>===================================================================
> >>RCS file: /usr/ncvs/src/lib/libpthread/thread/thr_stack.c,v
> >>retrieving revision 1.8
> >>diff -u -r1.8 thr_stack.c
> >>--- lib/libpthread/thread/thr_stack.c 14 Sep 2003 22:39:44 -0000 1.8
> >>+++ lib/libpthread/thread/thr_stack.c 29 Aug 2004 04:50:28 -0000
> >>@@ -214,6 +214,17 @@
> >>       stacksize, PROT_READ | PROT_WRITE, MAP_STACK,
> >>       -1, 0)) == MAP_FAILED)
> >>   attr->stackaddr_attr = NULL;
> >>+  if (attr->stackaddr_attr != NULL) {
> >>+   void *red;
> >>+
> >>+   red = mmap((char *)attr->stackaddr_attr + stacksize,
> >>+       _thr_guard_default, PROT_NONE,
> >>+       MAP_ANON | MAP_FIXED | MAP_PRIVATE, -1, 0);
> >>+   if (red == MAP_FAILED) {
> >>+    (void)munmap(attr->stackaddr_attr, stacksize);
> >>+    attr->stackaddr_attr = NULL;
> >>+   }
> >>+  }
> >> }
> >> if (attr->stackaddr_attr != NULL)
> >>  return (0);
> >
> >This is good.  Can this be committed?
> 
> So can newest thread still overflow its stack with this code ?
> Also how about if another thread allocated the red zone(but not used
> as red zone) before your thread can execute this mmap with MAP_FIXED ?
> This introduces a failure case we didn't have.
> 
> I think you'd map stacksize + guard_size, and use mprotect() to set
> red zone page.

That's a very good point indeed.  Would you like to modify the code to
do that and commit it?

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green@FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040909014029.GL928>