PERFORCE change 109706 for review

John Baldwin jhb at freebsd.org
Mon Nov 13 21:52:41 UTC 2006


On Friday 10 November 2006 18:00, Jung-uk Kim wrote:
> http://perforce.freebsd.org/chv.cgi?CH=109706
> 
> Change 109706 by jkim at jkim_hammer on 2006/11/10 22:59:53
> 
> 	Add (ugly) 32-bit msgsnd/msgrcv support for amd64.
> 	msgp points to msghdr and msghdr contains msg_type, which is long.
> 	When we copyin/copyout, we copy the correct msg_type and advance msgp
> 	by msg_type size.
> 	
> 	This fixes LTP test cases msgget01, msgrcv01, msgrcv02, msgrcv04, and
> 	msgsnd03.
> 	
> 	Note: There is only one test case blocked in msgwait state after this
> 	      change, which seems to be arch-independent issue.
> 
> Affected files ...
> 
> .. //depot/projects/linuxolator/src/sys/compat/linux/linux_ipc.c#3 edit
> .. //depot/projects/linuxolator/src/sys/kern/sysv_msg.c#5 edit

Why not add kern_msgfoo() functions and do the copyout/copyin in other places 
instead?

> Differences ...
> 
> ==== //depot/projects/linuxolator/src/sys/compat/linux/linux_ipc.c#3 
(text+ko) ====
> 
> @@ -83,6 +83,10 @@
>  	l_ulong swap_successes;
>  };
>  
> +/* XXX This should not be here. */
> +int do_msgsnd(struct thread *, struct msgsnd_args *, size_t);
> +int do_msgrcv(struct thread *, struct msgrcv_args *, size_t);
> +
>  static void
>  bsd_to_linux_shminfo( struct shminfo *bpp, struct l_shminfo *lpp)
>  {
> @@ -586,7 +590,8 @@
>      bsd_args.msgp = PTRIN(args->msgp);
>      bsd_args.msgsz = args->msgsz;
>      bsd_args.msgflg = args->msgflg;
> -    return msgsnd(td, &bsd_args);
> +
> +    return (do_msgsnd(td, &bsd_args, sizeof(l_long)));
>  }
>  
>  int
> @@ -605,7 +610,8 @@
>      bsd_args.msgsz = args->msgsz;
>      bsd_args.msgtyp = args->msgtyp;
>      bsd_args.msgflg = args->msgflg;
> -    return msgrcv(td, &bsd_args);
> +
> +    return (do_msgrcv(td, &bsd_args, sizeof(l_long)));
>  }
>  
>  int
> 
> ==== //depot/projects/linuxolator/src/sys/kern/sysv_msg.c#5 (text+ko) ====
> 
> @@ -662,6 +662,11 @@
>  	return (error);
>  }
>  
> +union msgtyp {
> +	long	mtype;
> +	int32_t	mtype32;
> +};
> +
>  #ifndef _SYS_SYSPROTO_H_
>  struct msgsnd_args {
>  	int	msqid;
> @@ -671,14 +676,16 @@
>  };
>  #endif
>  
> -/*
> - * MPSAFE
> - */
> +/* XXX This should not be here. */
> +int do_msgsnd(struct thread *, struct msgsnd_args *, size_t);
> +
>  int
> -msgsnd(td, uap)
> +do_msgsnd(td, uap, mtsz)
>  	struct thread *td;
>  	register struct msgsnd_args *uap;
> +	size_t mtsz;
>  {
> +	union msgtyp msgt;
>  	int msqid = uap->msqid;
>  	const void *user_msgp = uap->msgp;
>  	size_t msgsz = uap->msgsz;
> @@ -693,6 +700,9 @@
>  	if (!jail_sysvipc_allowed && jailed(td->td_ucred))
>  		return (ENOSYS);
>  
> +	if (mtsz != sizeof(msgt.mtype) && mtsz != sizeof(msgt.mtype32))
> +		return (EINVAL);
> +
>  	mtx_lock(&msq_mtx);
>  	msqid = IPCID_TO_IX(msqid);
>  
> @@ -875,8 +885,7 @@
>  	 */
>  
>  	mtx_unlock(&msq_mtx);
> -	if ((error = copyin(user_msgp, &msghdr->msg_type,
> -	    sizeof(msghdr->msg_type))) != 0) {
> +	if ((error = copyin(user_msgp, &msgt, mtsz)) != 0) {
>  		mtx_lock(&msq_mtx);
>  		DPRINTF(("error %d copying the message type\n", error));
>  		msg_freehdr(msghdr);
> @@ -884,8 +893,9 @@
>  		wakeup(msqkptr);
>  		goto done2;
>  	}
> +	msghdr->msg_type = (mtsz == sizeof(long)) ? msgt.mtype : msgt.mtype32;
>  	mtx_lock(&msq_mtx);
> -	user_msgp = (const char *)user_msgp + sizeof(msghdr->msg_type);
> +	user_msgp = (const char *)user_msgp + mtsz;
>  
>  	/*
>  	 * Validate the message type
> @@ -995,6 +1005,17 @@
>  	return (error);
>  }
>  
> +/*
> + * MPSAFE
> + */
> +int
> +msgsnd(td, uap)
> +	struct thread *td;
> +	register struct msgsnd_args *uap;
> +{
> +	return (do_msgsnd(td, uap, sizeof(long)));
> +}
> +
>  #ifndef _SYS_SYSPROTO_H_
>  struct msgrcv_args {
>  	int	msqid;
> @@ -1005,14 +1026,16 @@
>  };
>  #endif
>  
> -/*
> - * MPSAFE
> - */
> +/* XXX This should not be here. */
> +int do_msgrcv(struct thread *, struct msgrcv_args *, size_t);
> +
>  int
> -msgrcv(td, uap)
> +do_msgrcv(td, uap, mtsz)
>  	struct thread *td;
>  	register struct msgrcv_args *uap;
> +	size_t mtsz;
>  {
> +	union msgtyp msgt;
>  	int msqid = uap->msqid;
>  	void *user_msgp = uap->msgp;
>  	size_t msgsz = uap->msgsz;
> @@ -1030,6 +1053,9 @@
>  	if (!jail_sysvipc_allowed && jailed(td->td_ucred))
>  		return (ENOSYS);
>  
> +	if (mtsz != sizeof(msgt.mtype) && mtsz != sizeof(msgt.mtype32))
> +		return (EINVAL);
> +
>  	msqid = IPCID_TO_IX(msqid);
>  
>  	if (msqid < 0 || msqid >= msginfo.msgmni) {
> @@ -1226,8 +1252,11 @@
>  	 */
>  
>  	mtx_unlock(&msq_mtx);
> -	error = copyout(&(msghdr->msg_type), user_msgp,
> -	    sizeof(msghdr->msg_type));
> +	if (mtsz == sizeof(long))
> +		msgt.mtype = msghdr->msg_type;
> +	else
> +		msgt.mtype32 = msghdr->msg_type;
> +	error = copyout(&msgt, user_msgp, mtsz);
>  	mtx_lock(&msq_mtx);
>  	if (error != 0) {
>  		DPRINTF(("error (%d) copying out message type\n", error));
> @@ -1235,7 +1264,7 @@
>  		wakeup(msqkptr);
>  		goto done2;
>  	}
> -	user_msgp = (char *)user_msgp + sizeof(msghdr->msg_type);
> +	user_msgp = (char *)user_msgp + mtsz;
>  
>  	/*
>  	 * Return the segments to the user
> @@ -1280,6 +1309,17 @@
>  	return (error);
>  }
>  
> +/*
> + * MPSAFE
> + */
> +int
> +msgrcv(td, uap)
> +	struct thread *td;
> +	register struct msgrcv_args *uap;
> +{
> +	return (do_msgrcv(td, uap, sizeof(long)));
> +}
> +
>  static int
>  sysctl_msqids(SYSCTL_HANDLER_ARGS)
>  {
> 

-- 
John Baldwin


More information about the p4-projects mailing list