Subject: Re: Prototype kernel continuation-passing for NetBSD
To: Jonathan Stone <jonathan@dsg.stanford.edu>
From: Matt Thomas <matt@3am-software.com>
List: tech-kern
Date: 03/27/2004 07:11:28
On Mar 27, 2004, at 1:34 AM, Jonathan Stone wrote:

>
> For what its worth: here's a patch to eliminate the curproc uses from
> syscall handlers down into sosend/socreate; and (mostly) to make them
> explicit arguments at lower levels.
>
> I started trying to preserve the exact semantics we have now, with
> sosend() and socreate() using curproc in their bodies.  OTOH, the
> various local struct proc * values _should_ be correct...
>
> Index: sys/socketvar.h
> ===================================================================
> RCS file: /cvsroot/src/sys/sys/socketvar.h,v
> retrieving revision 1.69
> diff -w -u -r1.69 socketvar.h
> --- sys/socketvar.h	17 Mar 2004 09:58:15 -0000	1.69
> +++ sys/socketvar.h	27 Mar 2004 09:27:29 -0000
> @@ -122,7 +122,7 @@
>  	caddr_t		so_upcallarg;	/* Arg for above */
>  	int		(*so_send) __P((struct socket *, struct mbuf *,
>  					struct uio *, struct mbuf *,
> -					struct mbuf *, int));
> +					struct mbuf *, int, struct proc *));
>  	int		(*so_receive) __P((struct socket *,
>  					struct mbuf **,
>  					struct uio *, struct mbuf **,

This diff is not needed.

> @@ -308,7 +308,7 @@
>  int	soclose(struct socket *);
>  int	soconnect(struct socket *, struct mbuf *);
>  int	soconnect2(struct socket *, struct socket *);
> -int	socreate(int, struct socket **, int, int);
> +int	socreate(int, struct socket **, int, int, struct proc *);
>  int	sodisconnect(struct socket *);
>  void	sofree(struct socket *);
>  int	sogetopt(struct socket *, int, int, struct mbuf **);

This is reasonable.

> @@ -327,7 +327,7 @@
>  int	soreserve(struct socket *, u_long, u_long);
>  void	sorflush(struct socket *);
>  int	sosend(struct socket *, struct mbuf *, struct uio *,
> -	    struct mbuf *, struct mbuf *, int);
> +	    struct mbuf *, struct mbuf *, int, struct proc *);
>  int	sosetopt(struct socket *, int, int, struct mbuf *);
>  int	soshutdown(struct socket *, int);
>  void	sowakeup(struct socket *, struct sockbuf *, int);

Again not needed.

> Index: compat/svr4/svr4_net.c
> ===================================================================
> RCS file: /cvsroot/src/sys/compat/svr4/svr4_net.c,v
> retrieving revision 1.35
> diff -w -u -r1.35 svr4_net.c
> --- compat/svr4/svr4_net.c	13 Sep 2003 08:32:10 -0000	1.35
> +++ compat/svr4/svr4_net.c	27 Mar 2004 09:27:08 -0000
> @@ -203,7 +203,7 @@
>  	if ((error = falloc(p, &fp, &fd)) != 0)
>  		return error;
>
> -	if ((error = socreate(family, &so, type, protocol)) != 0) {
> +	if ((error = socreate(family, &so, type, protocol, p)) != 0) {
>  		DPRINTF(("socreate error %d\n", error));
>  		fdremove(p->p_fd, fd);
>  		FILE_UNUSE(fp, NULL);
> Index: kern/sys_socket.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/sys_socket.c,v
> retrieving revision 1.39
> diff -w -u -r1.39 sys_socket.c
> --- kern/sys_socket.c	21 Sep 2003 19:17:08 -0000	1.39
> +++ kern/sys_socket.c	27 Mar 2004 09:27:17 -0000
> @@ -79,7 +79,7 @@
>  {
>  	struct socket *so = (struct socket *) fp->f_data;
>  	return ((*so->so_send)(so, (struct mbuf *)0,
> -		uio, (struct mbuf *)0, (struct mbuf *)0, 0));
> +		uio, (struct mbuf *)0, (struct mbuf *)0, 0, curproc /*XXX*/));
>  }
>
>  int

Not needed.  the uio contains a uio_procp which serves our needs.

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.97
> diff -w -u -r1.97 uipc_socket.c
> --- kern/uipc_socket.c	24 Mar 2004 15:34:53 -0000	1.97
> +++ kern/uipc_socket.c	27 Mar 2004 09:27:19 -0000
> @@ -447,14 +447,12 @@
>   */
>  /*ARGSUSED*/
>  int
> -socreate(int dom, struct socket **aso, int type, int proto)
> +socreate(int dom, struct socket **aso, int type, int proto, struct 
> proc *p)
>  {
> -	struct proc	*p;
>  	struct protosw	*prp;
>  	struct socket	*so;
>  	int		error, s;
>
> -	p = curproc;		/* XXX */
>  	if (proto)
>  		prp = pffindproto(dom, proto, type);
>  	else
> @@ -721,16 +719,14 @@
>   */
>  int
>  sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct 
> mbuf *top,
> -	struct mbuf *control, int flags)
> +	struct mbuf *control, int flags, struct proc *p)
>  {
> -	struct proc	*p;
>  	struct mbuf	**mp, *m;
>  	long		space, len, resid, clen, mlen;
>  	int		error, s, dontroute, atomic;
>
>  	sodopendfree(so);
>
> -	p = curproc;		/* XXX */
>  	clen = 0;
>  	atomic = sosendallatonce(so) || top;
>  	if (uio)

Nuke this diff.

> Index: kern/uipc_syscalls.c
> ===================================================================
> RCS file: /cvsroot/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.86
> diff -w -u -r1.86 uipc_syscalls.c
> --- kern/uipc_syscalls.c	29 Nov 2003 10:02:42 -0000	1.86
> +++ kern/uipc_syscalls.c	27 Mar 2004 09:27:19 -0000
> @@ -90,7 +90,7 @@
>  	fp->f_type = DTYPE_SOCKET;
>  	fp->f_ops = &socketops;
>  	error = socreate(SCARG(uap, domain), &so, SCARG(uap, type),
> -			 SCARG(uap, protocol));
> +			 SCARG(uap, protocol), p);
>  	if (error) {
>  		FILE_UNUSE(fp, p);
>  		fdremove(fdp, fd);
> @@ -335,11 +335,11 @@
>  	p = l->l_proc;
>  	fdp = p->p_fd;
>  	error = socreate(SCARG(uap, domain), &so1, SCARG(uap, type),
> -			 SCARG(uap, protocol));
> +			 SCARG(uap, protocol), p);
>  	if (error)
>  		return (error);
>  	error = socreate(SCARG(uap, domain), &so2, SCARG(uap, type),
> -			 SCARG(uap, protocol));
> +			 SCARG(uap, protocol), p);
>  	if (error)
>  		goto free1;
>  	/* falloc() will use the descriptor for us */
> @@ -530,7 +530,8 @@
>  	}
>  #endif
>  	len = auio.uio_resid;
> -	error = (*so->so_send)(so, to, &auio, NULL, control, flags);
> +	error = (*so->so_send)(so, to, &auio, NULL, control, flags,
> +	    curproc /*XXX p */);
>  	if (error) {
>  		if (auio.uio_resid != len && (error == ERESTART ||
>  		    error == EINTR || error == EWOULDBLOCK))
> @@ -902,9 +903,9 @@
>
>  	p = l->l_proc;
>  	fdp = p->p_fd;
> -	if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0)) != 0)
> +	if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0, p)) != 0)
>  		return (error);
> -	if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) != 0)
> +	if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0, p)) != 0)
>  		goto free1;
>  	/* remember this socket pair implements a pipe */
>  	wso->so_state |= SS_ISAPIPE;
> Index: miscfs/fifofs/fifo_vnops.c
> ===================================================================
> RCS file: /cvsroot/src/sys/miscfs/fifofs/fifo_vnops.c,v
> retrieving revision 1.46
> diff -w -u -r1.46 fifo_vnops.c
> --- miscfs/fifofs/fifo_vnops.c	6 Mar 2004 00:38:29 -0000	1.46
> +++ miscfs/fifofs/fifo_vnops.c	27 Mar 2004 09:27:21 -0000
> @@ -162,13 +162,13 @@
>  	if ((fip = vp->v_fifoinfo) == NULL) {
>  		MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK);
>  		vp->v_fifoinfo = fip;
> -		if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0)) != 0) {
> +		if ((error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0, p)) != 0) {
>  			free(fip, M_VNODE);
>  			vp->v_fifoinfo = NULL;
>  			return (error);
>  		}
>  		fip->fi_readsock = rso;
> -		if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0)) != 0) {
> +		if ((error = socreate(AF_LOCAL, &wso, SOCK_STREAM, 0, p)) != 0) {
>  			(void)soclose(rso);
>  			free(fip, M_VNODE);
>  			vp->v_fifoinfo = NULL;
> @@ -310,7 +310,7 @@
>  		wso->so_state |= SS_NBIO;
>  	VOP_UNLOCK(ap->a_vp, 0);
>  	error = (*wso->so_send)(wso, (struct mbuf *)0, ap->a_uio, 0,
> -	    (struct mbuf *)0, 0);
> +	    (struct mbuf *)0, 0, curproc);
>  	vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY);
>  	if (ap->a_ioflag & IO_NDELAY)
>  		wso->so_state &= ~SS_NBIO;
> Index: miscfs/portal/portal_vnops.c
> ===================================================================
> RCS file: /cvsroot/src/sys/miscfs/portal/portal_vnops.c,v
> retrieving revision 1.52
> diff -w -u -r1.52 portal_vnops.c
> --- miscfs/portal/portal_vnops.c	29 Nov 2003 10:02:43 -0000	1.52
> +++ miscfs/portal/portal_vnops.c	27 Mar 2004 09:27:22 -0000
> @@ -345,7 +345,7 @@
>  	/*
>  	 * Create a new socket.
>  	 */
> -	error = socreate(AF_LOCAL, &so, SOCK_STREAM, 0);
> +	error = socreate(AF_LOCAL, &so, SOCK_STREAM, 0, curproc /* XXX p*/);
>  	if (error)
>  		goto bad;
>
> @@ -420,7 +420,8 @@
>  	auio.uio_resid = aiov[0].iov_len + aiov[1].iov_len;
>
>  	error = (*so->so_send)(so, (struct mbuf *) 0, &auio,
> -			(struct mbuf *) 0, (struct mbuf *) 0, 0);
> +			(struct mbuf *) 0, (struct mbuf *) 0, 0,
> +			curproc /*XXX p */);
>  	if (error)
>  		goto bad;

 From this point on, pass NULL instead of curproc to socreate.

> Index: netsmb/smb_trantcp.c
> ===================================================================
> RCS file: /cvsroot/src/sys/netsmb/smb_trantcp.c,v
> retrieving revision 1.15
> diff -w -u -r1.15 smb_trantcp.c
> --- netsmb/smb_trantcp.c	29 Jun 2003 22:32:11 -0000	1.15
> +++ netsmb/smb_trantcp.c	27 Mar 2004 09:27:24 -0000
> @@ -83,7 +83,7 @@
>  				    so, NULL, 0, m, 0, flags, p)
>  #else
>  #define nb_sosend(so,m,flags,p) (*(so)->so_send)(so, NULL, (struct 
> uio *)0, \
> -					m, (struct mbuf *)0, flags)
> +					m, (struct mbuf *)0, flags, p)
>  #endif
>
>  static int  nbssn_recv(struct nbpcb *nbp, struct mbuf **mpp, int 
> *lenp,
> @@ -267,7 +267,8 @@
>  	struct mbuf *m;
>  #endif
>
> -	error = socreate(AF_INET, &so, SOCK_STREAM, IPPROTO_TCP);
> +	error = socreate(AF_INET, &so, SOCK_STREAM, IPPROTO_TCP,
> +	    curproc /*XXX p */);
>  	if (error)
>  		return error;
>  	nbp->nbp_tso = so;
> Index: nfs/krpc_subr.c
> ===================================================================
> RCS file: /cvsroot/src/sys/nfs/krpc_subr.c,v
> retrieving revision 1.27
> diff -w -u -r1.27 krpc_subr.c
> --- nfs/krpc_subr.c	26 Feb 2003 06:31:18 -0000	1.27
> +++ nfs/krpc_subr.c	27 Mar 2004 09:27:24 -0000
> @@ -244,7 +244,7 @@
>  	/*
>  	 * Create socket and set its receive timeout.
>  	 */
> -	if ((error = socreate(AF_INET, &so, SOCK_DGRAM, 0)))
> +	if ((error = socreate(AF_INET, &so, SOCK_DGRAM, 0, curproc /*XXX*/)))
>  		goto out;
>
>  	if ((error = nfs_boot_setrecvtimo(so)))
> Index: nfs/nfs_boot.c
> ===================================================================
> RCS file: /cvsroot/src/sys/nfs/nfs_boot.c,v
> retrieving revision 1.60
> diff -w -u -r1.60 nfs_boot.c
> --- nfs/nfs_boot.c	11 Mar 2004 21:48:43 -0000	1.60
> +++ nfs/nfs_boot.c	27 Mar 2004 09:27:25 -0000
> @@ -197,7 +197,7 @@
>  	 * Get a socket to use for various things in here.
>  	 * After this, use "goto out" to cleanup and return.
>  	 */
> -	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
> +	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, curproc /*XXX*/);
>  	if (error) {
>  		printf("ifupdown: socreate, error=%d\n", error);
>  		return (error);
> @@ -246,7 +246,7 @@
>  	 * Get a socket to use for various things in here.
>  	 * After this, use "goto out" to cleanup and return.
>  	 */
> -	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
> +	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, curproc /*XXX*/);
>  	if (error) {
>  		printf("setaddress: socreate, error=%d\n", error);
>  		return (error);
> @@ -305,7 +305,7 @@
>  	 * Get a socket to use for various things in here.
>  	 * After this, use "goto out" to cleanup and return.
>  	 */
> -	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
> +	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, curproc /*XXX*/);
>  	if (error) {
>  		printf("deladdress: socreate, error=%d\n", error);
>  		return (error);
> @@ -434,7 +434,7 @@
>  		error = ENOBUFS;
>  		goto out;
>  	}
> -	error = (*so->so_send)(so, nam, NULL, m, NULL, 0);
> +	error = (*so->so_send)(so, nam, NULL, m, NULL, 0, curproc /*XXX*/);
>  	if (error) {
>  		printf("nfs_boot: sosend: %d\n", error);
>  		goto out;
> Index: nfs/nfs_bootdhcp.c
> ===================================================================
> RCS file: /cvsroot/src/sys/nfs/nfs_bootdhcp.c,v
> retrieving revision 1.24
> diff -w -u -r1.24 nfs_bootdhcp.c
> --- nfs/nfs_bootdhcp.c	29 Jun 2003 22:32:14 -0000	1.24
> +++ nfs/nfs_bootdhcp.c	27 Mar 2004 09:27:26 -0000
> @@ -451,7 +451,7 @@
>  	int vcilen;
>  #endif
>
> -	error = socreate(AF_INET, &so, SOCK_DGRAM, 0);
> +	error = socreate(AF_INET, &so, SOCK_DGRAM, 0, curproc /* XXX procp 
> */);
>  	if (error) {
>  		printf("bootp: socreate, error=%d\n", error);
>  		return (error);
> Index: nfs/nfs_socket.c
> ===================================================================
> RCS file: /cvsroot/src/sys/nfs/nfs_socket.c,v
> retrieving revision 1.102
> diff -w -u -r1.102 nfs_socket.c
> --- nfs/nfs_socket.c	17 Mar 2004 10:40:34 -0000	1.102
> +++ nfs/nfs_socket.c	27 Mar 2004 09:27:28 -0000
> @@ -169,8 +169,8 @@
>
>  	nmp->nm_so = (struct socket *)0;
>  	saddr = mtod(nmp->nm_nam, struct sockaddr *);
> -	error = socreate(saddr->sa_family, &nmp->nm_so, nmp->nm_sotype,
> -		nmp->nm_soproto);
> +	error = socreate(saddr->sa_family, &nmp->nm_so,
> +		nmp->nm_sotype, nmp->nm_soproto, curproc /*XXX*/);
>  	if (error)
>  		goto bad;
>  	so = nmp->nm_so;
> @@ -453,8 +453,8 @@
>  	else
>  		flags = 0;
>
> -	error = (*so->so_send)(so, sendnam, (struct uio *)0, top,
> -		(struct mbuf *)0, flags);
> +	error = (*so->so_send)(so, sendnam, (struct uio *)0,
> +		top, (struct mbuf *)0, flags,  curproc/*XXX*/);
>  	if (error) {
>  		if (rep) {
>  			if (error == ENOBUFS && so->so_type == SOCK_DGRAM) {
>