fork&Perl BUG

Thomas Moestl t.moestl at tu-bs.de
Wed Jul 30 09:36:42 PDT 2003


On Wed, 2003/07/30 at 17:25:42 +0400, Andrew Belashov wrote:
> I modified Perl by adding sleep(10) in parent after fork():
> ---------------------------------------------------------------------
> --- pp_sys.c.orig       Fri Apr  6 08:38:46 2001
> +++ pp_sys.c    Wed Jul 30 17:17:50 2003
> @@ -3703,6 +3703,9 @@
>         if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV)))
>             sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
>         hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
> +    } else {
> +       /* PARENT */
> +       sleep(10);
>      }
>      PUSHi(childpid);
>      RETURN;
> ---------------------------------------------------------------------
> 
> and my test script working OK!!!
> ---------------------------------------------------------------------
> (gdb) run perlbug.pl 80000
> Starting program: /usr/ports/lang/perl5.debug/work/perl-5.6.1/perl 
> perlbug.pl 80000
> ................................................................................
> Main: sum = 39977.1619376211, cnt = 80000
> Child working...
> Child: sum = 39977.1619376211, cnt = 80000
> Child exiting...
> Child pid = 92042
> Parent working...
> Parent: sum = 39977.1619376211, cnt = 80000
> Parent waiting a child...
> Parent exiting...
> ---------------------------------------------------------------------
> 
> IMHO, it is bug in fork(2).

This was indeed caused by a kernel bug in the sparc64 pmap, which
affected fork() among other things. I've just committed a fix
(attached); can you please test it to make sure that it really
resolves this problem?

Thanks for the report and analysis!

	- Thomas

-- 
Thomas Moestl <t.moestl at tu-bs.de>	http://www.tu-bs.de/~y0015675/
              <tmm at FreeBSD.org>		http://people.FreeBSD.org/~tmm/
PGP fingerprint: 1C97 A604 2BD0 E492 51D0  9C0F 1FE6 4F1D 419C 776C
-------------- next part --------------
Index: sys/sparc64/sparc64/pmap.c
===================================================================
RCS file: /vol/ncvs/src/sys/sparc64/sparc64/pmap.c,v
retrieving revision 1.118
diff -u -r1.118 pmap.c
--- sys/sparc64/sparc64/pmap.c	6 Jul 2003 20:32:42 -0000	1.118
+++ sys/sparc64/sparc64/pmap.c	30 Jul 2003 16:08:09 -0000
@@ -1161,7 +1161,7 @@
 		if ((data & TD_W) != 0 && pmap_track_modified(pm, va))
 			vm_page_dirty(m);
 	}
-	return (0);
+	return (1);
 }
 
 /*


More information about the freebsd-sparc64 mailing list