Date: Thu, 5 Nov 1998 18:07:17 -0500 (EST) From: Brian Feldman <green@unixhelp.org> To: Peter Wemm <peter@netplex.com.au> Cc: current@FreeBSD.ORG Subject: Re: RFSIGSHARE: forgot patch ;) Message-ID: <Pine.BSF.4.05.9811051806430.9519-100000@janus.syracuse.net> In-Reply-To: <199811050758.PAA05054@spinner.netplex.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
*Really needs to get the BSD book* In what space do UPAGES lie?
-Brian Feldman
On Thu, 5 Nov 1998, Peter Wemm wrote:
> Brian Feldman wrote:
> > Hrmm.... I don't see why this doesn't work:
> > + if (args->flags & CLONE_SIGHAND)
> > + p2->p_sigacts = p->p_sigacts;
> > don't tell me it's pointing into user-space, or some other neglected part
> > of proc? I'll investigate I suppose. This is certainly helping me
> > familiarize myself with the kernel, even if these specific patches cause a
> > trap eventually (probably all the mallocing/freeing). I _really_ need to
> > buy a copy of the BSD book... quick question: zalloc and malloc should
> > each be used in what situations?
>
> p_sigacts points into the UPAGES, beyond the pcb.. Check the p_addr
> pointers for examples.
>
> The reason you can't do this is because the old proc could go away at any
> time, the parent process's UPAGES could get swapped out, etc. To do this,
> you need to stop the parent from exiting until all children are gone (or
> keep it's state around), and stop it being swapped.
>
> > Cheers,
> > Brian Feldman
> > "gaining lots of experience"
> >
> > On Thu, 5 Nov 1998, Peter Wemm wrote:
> >
> > > Brian Feldman wrote:
> > > [..]
> > > > --- ./kern/kern_fork.c.orig Wed Nov 4 20:33:11 1998
> > > > +++ ./kern/kern_fork.c Wed Nov 4 20:44:29 1998
> > > > @@ -151,6 +151,10 @@
> > > > p1->p_pid);
> > > > return (EOPNOTSUPP);
> > > > }
> > > > + if (flags & RFSIGSHARE) {
> > > > + printf("shared signal space attemped: pid: %d\n",
> > > > p1->p_pid);
> > > > + return (EOPNOTSUPP);
> > > > + }
> > > > #endif
> > > >
> > > > /*
> > >
> > > RFSIGSHARE should work fine on SMP.
> > >
> > > > @@ -320,6 +324,16 @@
> > > > bcopy(p1->p_cred, p2->p_cred, sizeof(*p2->p_cred));
> > > > p2->p_cred->p_refcnt = 1;
> > > > crhold(p1->p_ucred);
> > > > +
> > > > + if (flags & RFSIGSHARE) {
> > > > + p2->p_sig->p_refcnt++;
> > > > + } else {
> > > > + p2->p_sig = malloc(sizeof(struct procsig), M_TEMP,
> > > > M_WAITOK);
> > > > + p2->p_sig->p_refcnt = 1;
> > > > + p2->p_sigmask = p1->p_sigmask;
> > > > + p2->p_sigignore = p1->p_sigignore;
> > > > + p2->p_sigcatch = p1->p_sigcatch;
> > > > + }
> > > >
> > > > /* bump references to the text vnode (for procfs) */
> > > > p2->p_textvp = p1->p_textvp;
> > >
> > > Umm, you are sharing the signal masks, not the signal handler vectors
> > > themselves. Think p_sigacts.. Those are stored after the PCB and are
> > > paged out.
> > >
> > > Assuming you take a shot at sharing them, try this: Keep p_sigacts there
> > > by default. If a process attempts to share the signals during a fork,
> > > then malloc a copy and attach it to both the child and parent. When the
> > > reference count drops to 1, the remaining process should probably have
> > > it's vectors copied to the upages again and the malloc space freed. But
> > > good stuff so far! :-)
> > >
> > > Cheers,
> > > -Peter
> > >
> > >
> > >
> > >
> > > To Unsubscribe: send mail to majordomo@FreeBSD.org
> > > with "unsubscribe freebsd-current" in the body of the message
> > >
> >
>
> Cheers,
> -Peter
> --
> Peter Wemm <peter@netplex.com.au> Netplex Consulting
> "No coffee, No workee!" :-)
>
>
>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9811051806430.9519-100000>
