[PATCH RFC] fork: reduce chances for "address space is already occupied" errors
Corinna Vinschen
corinna-cygwin@cygwin.com
Tue Mar 26 18:28:00 GMT 2019
On Mar 26 19:25, Corinna Vinschen wrote:
> Hi Michael,
>
>
> Redirected to cygwin-patches...
>
>
> On Mar 26 18:10, Michael Haubenwallner wrote:
> > Hi Corinna,
> >
> > as I do still encounter fork errors (address space needed by <dll> is
> > already occupied) with dynamically loaded dlls (but unrelated to
> > replaced dlls), one of them repeating even upon multiple retries,
>
> Why didn't rebase fix that?
Btw., is that 32 or 64 bit? Both?
Corinna
> > I'm
> > coming up with attached patch.
> >
> > What do you think about it?
>
> I'm not opposed to this patch but I don't quite follow the description.
> threadinterface->Init only creates three event objects. From what I can
> tell, Events are stored in Paged and Nonpaged Pools, so they don't
> affect the processes VM. What am I missing?
>
>
> Thanks,
> Corinna
>
>
> >
> > Thanks!
> > /haubi/
>
> > >From dfc28bcbb7ed55fe33ddb8d15e761b4d5b4815f8 Mon Sep 17 00:00:00 2001
> > From: Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
> > Date: Tue, 26 Mar 2019 17:38:36 +0100
> > Subject: [PATCH] Cygwin: fork: reserve dynloaded dll areas earlier
> >
> > In dll_crt0_0, both threadinterface->Init and sigproc_init allocate
> > windows object handles using unpredictable memory regions, which may
> > collide with dynamically loaded dlls when they were relocated.
> > ---
> > winsup/cygwin/dcrt0.cc | 6 ++++++
> > winsup/cygwin/fork.cc | 6 ------
> > 2 files changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc
> > index 11edcdf0d..fb726a739 100644
> > --- a/winsup/cygwin/dcrt0.cc
> > +++ b/winsup/cygwin/dcrt0.cc
> > @@ -632,6 +632,12 @@ child_info_fork::handle_fork ()
> >
> > if (fixup_mmaps_after_fork (parent))
> > api_fatal ("recreate_mmaps_after_fork_failed");
> > +
> > + /* We need to occupy the address space for dynamically loaded dlls
> > + before we allocate any dynamic object, or we may end up with
> > + error "address space needed by <dll> is already occupied"
> > + for no good reason (seen with some relocated dll). */
> > + dlls.reserve_space ();
> > }
> >
> > bool
> > diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc
> > index 74ee9acf4..7e1c08990 100644
> > --- a/winsup/cygwin/fork.cc
> > +++ b/winsup/cygwin/fork.cc
> > @@ -136,12 +136,6 @@ frok::child (volatile char * volatile here)
> > {
> > HANDLE& hParent = ch.parent;
> >
> > - /* NOTE: Logically this belongs in dll_list::load_after_fork, but by
> > - doing it here, before the first sync_with_parent, we can exploit
> > - the existing retry mechanism in hopes of getting a more favorable
> > - address space layout next time. */
> > - dlls.reserve_space ();
> > -
> > sync_with_parent ("after longjmp", true);
> > debug_printf ("child is running. pid %d, ppid %d, stack here %p",
> > myself->pid, myself->ppid, __builtin_frame_address (0));
> > --
> > 2.17.0
> >
> >
>
> >
> > --
> > Problem reports: http://cygwin.com/problems.html
> > FAQ: http://cygwin.com/faq/
> > Documentation: http://cygwin.com/docs.html
> > Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
>
>
> --
> Corinna Vinschen
> Cygwin Maintainer
--
Corinna Vinschen
Cygwin Maintainer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin-patches/attachments/20190326/c7869c05/attachment.sig>
More information about the Cygwin-patches
mailing list